Share via


MLflow modellerinin Çevrimiçi Uç Noktalara aşamalı dağıtımı

Bu makalede, hizmet kesintisine neden olmadan MLflow modellerini aşamalı olarak nasıl güncelleştirebileceğinizi ve Çevrimiçi Uç Noktalara dağıtabileceğinizi öğreneceksiniz. Web hizmetinin yeni bir sürümünü üretime tanıtmak için güvenli dağıtım stratejisi olarak da bilinen mavi-yeşil dağıtımı kullanırsınız. Bu strateji, web hizmetinin yeni sürümünü tamamen kullanıma sunmadan önce kullanıcıların veya isteklerin küçük bir alt kümesine dağıtmanıza olanak sağlar.

Bu örnek hakkında

Çevrimiçi Uç Noktalar, Uç Nokta ve Dağıtım kavramına sahiptir. Uç nokta, müşterilerin modeli kullanmak için kullandığı API'yi temsil ederken, dağıtım bu API'nin belirli bir uygulamasını gösterir. Bu ayrım, kullanıcıların API'yi uygulamadan ayırmasına ve tüketiciyi etkilemeden temel alınan uygulamayı değiştirmesine olanak tanır. Bu örnek, hizmet kesintisine neden olmadan uç noktalarda dağıtılan modeli güncelleştirmek için bu tür kavramları kullanacaktır.

Dağıtacağımız model, UCI Kalp Hastalığı Veri Kümesini temel alır. Veritabanı 76 öznitelik içeriyor, ancak bunların 14'ünün alt kümesini kullanıyoruz. Model, bir hastada kalp hastalığının varlığını tahmin etmeye çalışır. 0 'dan (iletişim durumu yok) 1'e (iletişim durumu) değerlenen tamsayıdır. Sınıflandırıcı kullanılarak XGBBoost eğitilmiştir ve gerekli tüm ön işleme işlem scikit-learn hattı olarak paketlenmiştir ve bu da modeli ham verilerden tahminlere giden uçtan uca bir işlem hattı haline getirmiştir.

Bu makaledeki bilgiler, azureml-examples deposunda yer alan kod örneklerini temel alır. Dosyaları kopyalamak/yapıştırmak zorunda kalmadan komutları yerel olarak çalıştırmak için depoyu kopyalayın ve dizinleri olarak sdk/using-mlflow/deploydeğiştirin.

Jupyter Notebooks'ta takip edin

Aşağıdaki not defterlerinde bu örneği izleyebilirsiniz. Kopyalanan depoda not defterini açın: mlflow_sdk_online_endpoints_progresive.ipynb.

Önkoşullar

Bu makaledeki adımları takip etmeden önce aşağıdaki önkoşullara sahip olduğunuzdan emin olun:

  • Azure aboneliği. Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun. Azure Machine Learning'in ücretsiz veya ücretli sürümünü deneyin.
  • Azure Machine Learning’deki işlemlere erişim vermek için Azure rol tabanlı erişim denetimleri (Azure RBAC) kullanılır. Bu makaledeki adımları gerçekleştirmek için kullanıcı hesabınıza Azure Machine Learning çalışma alanı için sahip veya katkıda bulunan rolü ya da Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* izni veren özel bir rol atanmalıdır. Daha fazla bilgi için bkz . Azure Machine Learning çalışma alanına erişimi yönetme.

Ayrıca şunları yapmanız gerekir:

  • Azure CLI'yi ve ml uzantısını Azure CLI'ya yükleyin. Daha fazla bilgi için bkz . CLI'yi (v2) yükleme, ayarlama ve kullanma.

Çalışma alanınıza bağlanma

İlk olarak üzerinde çalışacağımız Azure Machine Learning çalışma alanına bağlanalım.

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

Modeli kayıt defterine kaydetme

Modelinizin Azure Machine Learning kayıt defterine kayıtlı olduğundan emin olun. Azure Machine Learning'de kayıtlı olmayan modellerin dağıtımı desteklenmez. MLflow SDK'sını kullanarak yeni bir model kaydedebilirsiniz:

MODEL_NAME='heart-classifier'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"

Çevrimiçi uç nokta oluşturma

Çevrimiçi uç noktalar, çevrimiçi (gerçek zamanlı) çıkarım için kullanılan uç noktalardır. Çevrimiçi uç noktalar istemcilerden veri almaya hazır dağıtımlar içerir ve gerçek zamanlı olarak yanıtlar gönderebilir.

Aynı modelin birden çok sürümünü aynı uç nokta altına dağıtarak bu işlevden yararlanacağız. Ancak yeni dağıtım, yalvarma sırasında trafiğin %0'ını alır. Yeni modelin doğru çalışacağından emin olduktan sonra trafiği aşamalı olarak bir dağıtımdan diğerine taşıyacağız.

  1. Uç noktalar, aynı bölgede benzersiz olması gereken bir ad gerektirir. Var olmayan bir tane oluşturduğunuzdan emin olalım:

    ENDPOINT_SUFIX=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w ${1:-5} | head -n 1)
    ENDPOINT_NAME="heart-classifier-$ENDPOINT_SUFIX"
    
  2. Uç noktayı yapılandırma

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: heart-classifier-edp
    auth_mode: key
    
  3. Uç noktayı oluşturun:

    az ml online-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
    
  4. Uç nokta için kimlik doğrulama gizli dizisini alma.

    ENDPOINT_SECRET_KEY=$(az ml online-endpoint get-credentials -n $ENDPOINT_NAME | jq -r ".accessToken")
    

Mavi dağıtım oluşturma

Şu ana kadar uç nokta boş. Üzerinde dağıtım yok. Şimdi daha önce üzerinde çalıştığımız modeli dağıtarak ilk modeli oluşturalım. "Mavi dağıtımımızı" temsil eden bu dağıtımı "varsayılan" olarak adlandıracağız.

  1. Dağıtımı yapılandırma

    blue-deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: default
    endpoint_name: heart-classifier-edp
    model: azureml:heart-classifier@latest
    instance_type: Standard_DS2_v2
    instance_count: 1
    
  2. Dağıtımı oluşturma

    az ml online-deployment create --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
    

    Uç noktanızın çıkış bağlantısı yoksa, bayrağını --with-packageekleyerek model paketlemeyi (önizleme) kullanın:

    az ml online-deployment create --with-package --endpoint-name $ENDPOINT_NAME -f blue-deployment.yml --all-traffic
    

    İpucu

    Yeni dağıtıma tüm trafiği atayacak olan create komutunda bayrağını --all-traffic ayarlarız.

  3. Tüm trafiği dağıtıma atama

    Şu ana kadar uç noktanın tek bir dağıtımı var, ancak trafiğinden hiçbiri bu dağıtıma atanmadı. Şimdi atayalım.

    Oluşturma sırasında kullandığımız --all-traffic için azure CLI'da bu adım gerekli değildir.

  4. Uç nokta yapılandırmasını güncelleştirin:

    Oluşturma sırasında kullandığımız --all-traffic için azure CLI'da bu adım gerekli değildir.

  5. Dağıtımı test etmek için örnek giriş oluşturma

    sample.yml

    {
        "input_data": {
            "columns": [
                "age",
                "sex",
                "cp",
                "trestbps",
                "chol",
                "fbs",
                "restecg",
                "thalach",
                "exang",
                "oldpeak",
                "slope",
                "ca",
                "thal"
            ],
            "data": [
                [ 48, 0, 3, 130, 275, 0, 0, 139, 0, 0.2, 1, 0, "normal" ]
            ]
        }
    }
    
  6. Dağıtımı test etme

    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file sample.json
    

Uç noktanın altında yeşil dağıtım oluşturma

Geliştirme ekibi tarafından oluşturulan modelin yeni bir sürümü olduğunu ve üretime hazır olduğunu düşünelim. İlk olarak bu modeli uçurmayı deneyebiliriz ve emin olduktan sonra trafiği bu modele yönlendirmek için uç noktayı güncelleştirebiliriz.

  1. Yeni model sürümü kaydetme

    MODEL_NAME='heart-classifier'
    az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"
    

    Şimdi yeni modelin sürüm numarasını alalım:

    VERSION=$(az ml model show -n heart-classifier --label latest | jq -r ".version")
    
  2. Yeni dağıtım yapılandırma

    green-deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: xgboost-model
    endpoint_name: heart-classifier-edp
    model: azureml:heart-classifier@latest
    instance_type: Standard_DS2_v2
    instance_count: 1
    

    Dağıtımı aşağıdaki gibi adlandıracağız:

    GREEN_DEPLOYMENT_NAME="xgboost-model-$VERSION"
    
  3. Yeni dağıtımı oluşturma

    az ml online-deployment create -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
    

    Uç noktanızın çıkış bağlantısı yoksa, bayrağını --with-packageekleyerek model paketlemeyi (önizleme) kullanın:

    az ml online-deployment create --with-package -n $GREEN_DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME -f green-deployment.yml
    
  4. Trafiği değiştirmeden dağıtımı test edin

    az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name $GREEN_DEPLOYMENT_NAME --request-file sample.json
    

    İpucu

    Şimdi çağırmak istediğimiz dağıtımın adını nasıl gösterdiğimize dikkat edin.

Trafiği aşamalı olarak güncelleştirme

Yeni dağıtımdan emin olduğumuzdan, trafiği güncelleştirerek bir kısmını yeni dağıtıma yönlendirebiliriz. Trafik uç nokta düzeyinde yapılandırılır:

  1. Trafiği yapılandırın:

    Azure CLI'da bu adım gerekli değil

  2. Uç noktayı güncelleştirme

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=90 $GREEN_DEPLOYMENT_NAME=10"
    
  3. Trafiğin tamamını yeni dağıtıma geçmeye karar verirseniz tüm trafiği güncelleştirin:

    Azure CLI'da bu adım gerekli değil

  4. Uç noktayı güncelleştirme

    az ml online-endpoint update --name $ENDPOINT_NAME --traffic "default=0 $GREEN_DEPLOYMENT_NAME=100"
    
  5. Eski dağıtım herhangi bir trafik almadığından güvenli bir şekilde silebilirsiniz:

    az ml online-deployment delete --endpoint-name $ENDPOINT_NAME --name default
    

    İpucu

    Bu noktada, eski "mavi dağıtımın" silindiğini ve yeni "yeşil dağıtımın" "mavi dağıtımın" yerini aldığına dikkat edin.

Kaynakları temizleme

az ml online-endpoint delete --name $ENDPOINT_NAME --yes

Önemli

Bir uç nokta silindiğinde, altındaki tüm dağıtımların da silindiğini fark edin.

Sonraki adımlar