Gerçek zamanlı çıkarım için yeni dağıtımları güvenli bir şekilde kullanıma sunma

ŞUNLAR IÇIN GEÇERLIDIR: Azure CLI ml uzantısı v2 (geçerli)Python SDK azure-ai-ml v2 (geçerli)

Bu makalede, herhangi bir kesintiye neden olmadan üretimde makine öğrenmesi modelinin yeni bir sürümünü dağıtmayı öğreneceksiniz. Web hizmetinin yeni sürümünü üretime tanıtmak için mavi-yeşil dağıtım stratejisini (güvenli dağıtım stratejisi olarak da bilinir) kullanacaksı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 makalede, çevrimiçi (gerçek zamanlı) çıkarım için kullanılan çevrimiçi uç noktaları, yani uç noktaları kullandığınız varsayılır. İki tür çevrimiçi uç nokta vardır: yönetilen çevrimiçi uç noktalar ve Kubernetes çevrimiçi uç noktaları. Uç noktalar ve yönetilen çevrimiçi uç noktalar ile Kubernetes çevrimiçi uç noktaları arasındaki farklar hakkında daha fazla bilgi için bkz . Azure Machine Learning uç noktaları nedir?.

Bu makaledeki ana örnek, dağıtım için yönetilen çevrimiçi uç noktaları kullanır. Bunun yerine Kubernetes uç noktalarını kullanmak için, bu belgedeki yönetilen çevrimiçi uç nokta tartışmasıyla satır içi notlara bakın.

Bu makalede şunları öğreneceksiniz:

  • Bir modelin 1. sürümüne hizmet vermek için "mavi" adlı bir dağıtımla çevrimiçi uç nokta tanımlama
  • Daha fazla isteği işleyebilmesi için mavi dağıtımı ölçeklendirin
  • Modelin sürüm 2'sini ("yeşil" dağıtım olarak adlandırılır) uç noktaya dağıtın, ancak dağıtımı canlı trafik olmadan gönderin
  • Yeşil dağıtımı yalıtarak test edin
  • Canlı trafiğin yüzdesini doğrulamak için yeşil dağıtıma yansıtma
  • Yeşil dağıtıma canlı trafiğin küçük bir yüzdesini gönderme
  • Tüm canlı trafiği yeşil dağıtıma gönderme
  • Şimdi kullanılmayan v1 mavi dağıtımını silme

Önkoşullar

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

  • 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 izin veren Microsoft.MachineLearningServices/workspaces/onlineEndpoints/*özel bir rol atanmalıdır. Daha fazla bilgi için bkz . Azure Machine Learning çalışma alanına erişimi yönetme.

  • (İsteğe bağlı) Yerel olarak dağıtmak için Docker Engine'i yerel bilgisayarınıza yüklemeniz gerekir. Sorunlarda hata ayıklamak daha kolay olması için bu seçeneği kesinlikle öneririz .

Sisteminizi hazırlama

Ortam değişkenlerini belirleme

Azure CLI için varsayılan ayarları henüz ayarlamadıysanız varsayılan ayarlarınızı kaydedin. Aboneliğinizin, çalışma alanınızın ve kaynak grubunuzun değerlerinin birden çok kez geçirilmesini önlemek için şu kodu çalıştırın:

az account set --subscription <subscription id>
az configure --defaults workspace=<Azure Machine Learning workspace name> group=<resource group>

Örnek deposunu kopyalama

Bu makaleyi takip etmek için önce örnek deposunu (azureml-examples) kopyalayın. Ardından deponun cli/ dizinine gidin:

git clone --depth 1 https://github.com/Azure/azureml-examples
cd azureml-examples
cd cli

İpucu

Depoya yalnızca en son işlemeyi kopyalamak için kullanın --depth 1 . Bu işlem, işlemin tamamlanması için gereken süreyi azaltır.

Bu öğreticideki komutlar dizindeki dosyada deploy-safe-rollout-online-endpoints.shcli ve YAML yapılandırma dosyaları alt dizindedir endpoints/online/managed/sample/ .

Not

Kubernetes çevrimiçi uç noktaları için YAML yapılandırma dosyaları alt dizindedir endpoints/online/kubernetes/ .

Uç noktayı ve dağıtımı tanımlama

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

Uç nokta tanımlama

Aşağıdaki tabloda, bir uç nokta tanımladığınızda belirtilmesi gereken temel öznitelikler listelemektedir.

Öznitelik Tanım
Ad Gerekli. Uç noktanın adı. Azure bölgesinde benzersiz olmalıdır. Adlandırma kuralları hakkında daha fazla bilgi için bkz . uç nokta sınırları.
Kimlik doğrulaması modu Uç nokta için kimlik doğrulama yöntemi. Anahtar tabanlı kimlik doğrulaması key ile Azure Machine Learning belirteç tabanlı kimlik doğrulaması aml_tokenarasında seçim yapın. Anahtarın süresi dolmaz, ancak belirtecin süresi dolmaz. Kimlik doğrulaması hakkında daha fazla bilgi için bkz . Çevrimiçi uç noktada kimlik doğrulaması yapma.
Açıklama Uç noktanın açıklaması.
Etiketler Uç nokta için etiket sözlüğü.
Trafik Dağıtımlar arasında trafiği yönlendirme kuralları. Trafiği anahtar-değer çiftlerinin sözlüğü olarak temsil eder; burada anahtar dağıtım adını, değer ise söz dizimine gelen trafiğin yüzdesini temsil eder. Trafiği yalnızca bir uç noktanın altındaki dağıtımlar oluşturulduğunda ayarlayabilirsiniz. Dağıtımlar oluşturulduktan sonra çevrimiçi uç nokta trafiğini de güncelleştirebilirsiniz. Yansıtılmış trafiği kullanma hakkında daha fazla bilgi için bkz . Yeni dağıtıma canlı trafiğin küçük bir yüzdesini ayırma.
Yansıtma trafiği Dağıtıma yansıtılan canlı trafiğin yüzdesi. Yansıtılmış trafiği kullanma hakkında daha fazla bilgi için bkz . Dağıtımı yansıtılmış trafikle test etme.

Uç nokta oluştururken belirtebileceğiniz özniteliklerin tam listesini görmek için bkz . CLI (v2) çevrimiçi uç nokta YAML şeması veya SDK (v2) ManagedOnlineEndpoint Sınıfı.

Dağıtım tanımlama

Dağıtım, gerçek çıkarım yapan modeli barındırmak için gereken bir kaynak kümesidir. Aşağıdaki tabloda, bir dağıtım tanımladığınızda belirtilmesi gereken temel öznitelikler açıklanmaktadır.

Öznitelik Tanım
Ad Gerekli. Dağıtımın adı.
Uç nokta adı Gerekli. Dağıtımın oluşturulacağı uç noktanın adı.
Model Dağıtım için kullanılacak model. Bu değer, çalışma alanında var olan bir sürüme sahip modelin başvurusu veya satır içi model belirtimi olabilir. Örnekte regresyona neden olan bir scikit-learn modelimiz vardır.
Kod yolu Modeli puanlama için tüm Python kaynak kodunu içeren yerel geliştirme ortamında dizinin yolu. İç içe dizinleri ve paketleri kullanabilirsiniz.
Puanlama betiği Belirli bir giriş isteğinde modeli yürüten Python kodu. Bu değer, kaynak kod dizinindeki puanlama dosyasının göreli yolu olabilir.
Puanlama betiği dağıtılan bir web hizmetine gönderilen verileri alır ve modele geçirir. Betik daha sonra modeli yürütür ve istemciye yanıtını döndürür. Puanlama betiği modelinize özgüdür ve modelin giriş olarak beklediği ve çıkış olarak döndürdüğü verileri anlaması gerekir.
Bu örnekte score.py bir dosyamız vardır. Bu Python kodunun bir init() işlevi ve bir run() işlevi olmalıdır. İşlev, init() model oluşturulduktan veya güncelleştirildikten sonra çağrılır (örneğin, modeli bellekte önbelleğe almak için kullanabilirsiniz). İşlev run() , gerçek puanlama ve tahmin gerçekleştirmek için uç noktanın her çağrısında çağrılır.
Ortam Gerekli. Modeli ve kodu barındıracak ortam. Bu değer, çalışma alanında var olan bir sürüme sahip ortama başvuru veya satır içi ortam belirtimi olabilir. Ortam, Conda bağımlılıklarına sahip bir Docker görüntüsü, dockerfile veya kayıtlı bir ortam olabilir.
Örnek türü Gerekli. Dağıtım için kullanılacak VM boyutu. Desteklenen boyutların listesi için bkz . Yönetilen çevrimiçi uç noktalar SKU listesi.
Örnek sayısı Gerekli. Dağıtım için kullanılacak örnek sayısı. Değeri beklediğiniz iş yüküne dayandırın. Yüksek kullanılabilirlik için değerini en az 3olarak ayarlamanızı öneririz. Yükseltmeleri gerçekleştirmek için fazladan %20 ayırıyoruz. Daha fazla bilgi için bkz . Çevrimiçi uç noktaların sınırları.

Dağıtım oluştururken belirtebileceğiniz özniteliklerin tam listesini görmek için bkz . CLI (v2) yönetilen çevrimiçi dağıtım YAML şeması veya SDK (v2) ManagedOnlineDeployment Sınıfı.

Çevrimiçi uç nokta oluşturma

Önce uç noktanın adını ayarlayın ve ardından yapılandırın. Bu makalede uç noktayı yapılandırmak için endpoints/online/managed/sample/endpoint.yml dosyasını kullanacaksınız. Aşağıdaki kod parçacığı dosyanın içeriğini gösterir:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-endpoint
auth_mode: key

Uç nokta YAML biçimi başvurusu aşağıdaki tabloda açıklanmıştır. Bu özniteliklerin nasıl belirtileceğini öğrenmek için çevrimiçi uç nokta YAML başvurusuna bakın. Yönetilen çevrimiçi uç noktalarla ilgili sınırlar hakkında bilgi için bkz . Çevrimiçi uç noktaların sınırları.

Tuş Açıklama
$schema (İsteğe bağlı) YAML şeması. YAML dosyasındaki tüm kullanılabilir seçenekleri görmek için, şemayı bir tarayıcıdaki önceki kod parçacığında görüntüleyebilirsiniz.
name Uç noktanın adı.
auth_mode Anahtar tabanlı kimlik doğrulaması için kullanın key . Azure Machine Learning belirteç tabanlı kimlik doğrulaması için kullanın aml_token . En son belirteci almak için komutunu kullanın az ml online-endpoint get-credentials .

Çevrimiçi uç nokta oluşturmak için:

  1. Uç nokta adınızı ayarlayın:

    Unix için şu komutu çalıştırın (değerini benzersiz bir adla değiştirin YOUR_ENDPOINT_NAME ):

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    Önemli

    Uç nokta adları bir Azure bölgesinde benzersiz olmalıdır. Örneğin, Azure westus2 bölgesinde adıyla my-endpointyalnızca bir uç nokta olabilir.

  2. Uç noktayı bulutta oluşturun:

    Uç noktayı yapılandırmak üzere dosyasını kullanmak endpoint.yml için aşağıdaki kodu çalıştırın:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/sample/endpoint.yml
    

'mavi' dağıtımı oluşturma

Bu makalede dağıtımın önemli yönlerini yapılandırmak için endpoints/online/managed/sample/blue-deployment.yml dosyasını kullanacaksınız. Aşağıdaki kod parçacığı dosyanın içeriğini gösterir:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: blue
endpoint_name: my-endpoint
model:
  path: ../../model-1/model/
code_configuration:
  code: ../../model-1/onlinescoring/
  scoring_script: score.py
environment: 
  conda_file: ../../model-1/environment/conda.yaml
  image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
instance_type: Standard_DS3_v2
instance_count: 1

Uç noktanız için adlı blue bir dağıtım oluşturmak üzere aşağıdaki komutu çalıştırarak blue-deployment.yml dosyasını kullanarak

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

Önemli

--all-traffic içindeki az ml online-deployment create bayrağı uç nokta trafiğinin %100'unu yeni oluşturulan mavi dağıtıma ayırır.

Dosyada blue-deployment.yaml , satır içi (dosyaların karşıya yüklendiği yer) belirteceğiz path . CLI dosyaları otomatik olarak karşıya yükler ve modeli ve ortamı kaydeder. Üretim için en iyi yöntem olarak, modeli ve ortamı kaydetmeli ve kayıtlı adı ve sürümü YAML'de ayrı olarak belirtmelisiniz. veya environment: azureml:my-env:1formunu model: azureml:my-model:1 kullanın.

Kayıt için ve'nin modelenvironment YAML tanımlarını ayrı YAML dosyalarına ayıklayabilir ve ve az ml environment createkomutlarını az ml model create kullanabilirsiniz. Bu komutlar hakkında daha fazla bilgi edinmek için ve az ml environment create -hkomutunu çalıştırınaz ml model create -h.

Modelinizi varlık olarak kaydetme hakkında daha fazla bilgi için bkz . CLI kullanarak modelinizi Machine Learning'de varlık olarak kaydetme. Ortam oluşturma hakkında daha fazla bilgi için bkz . CLI ve SDK (v2) ile Azure Machine Learning ortamlarını yönetme.

Mevcut dağıtımınızı onaylayın

Mevcut dağıtımınızı doğrulamanın bir yolu, belirli bir giriş isteği için modelinizi puanlandırmak üzere uç noktanızı çağırmaktır. Uç noktanızı CLI veya Python SDK aracılığıyla çağırdığınızda, gelen trafiği alacak dağıtımın adını belirtmeyi seçebilirsiniz.

Not

CLI veya Python SDK'sının aksine Azure Machine Learning stüdyosu, uç noktayı çağırdığınızda bir dağıtım belirtmenizi gerektirir.

Dağıtım adıyla uç noktayı çağırma

Uç noktayı trafik alacak dağıtımın adıyla çağırırsanız Azure Machine Learning uç noktanın trafiğini doğrudan belirtilen dağıtıma yönlendirir ve çıkışını döndürür. CLI v2 seçeneğini veya deployment_name dağıtımı belirtmek için SDK v2 seçeneğini kullanabilirsiniz--deployment-name.

Dağıtım belirtmeden uç noktayı çağırma

Trafiği alacak dağıtımı belirtmeden uç noktayı çağırırsanız Azure Machine Learning, trafik denetimi ayarlarına göre uç noktanın gelen trafiğini uç noktadaki dağıtımlara yönlendirir.

Trafik denetimi ayarları, uç noktadaki her dağıtıma belirtilen gelen trafik yüzdelerini ayırır. Örneğin trafik kurallarınız uç noktanızdaki belirli bir dağıtımın gelen trafiği %40 oranında alacağını belirtirse, Azure Machine Learning uç nokta trafiğinin %40'ını bu dağıtıma yönlendirir.

Aşağıdakini çalıştırarak mevcut uç noktanızın ve dağıtımınızın durumunu görüntüleyebilirsiniz:

az ml online-endpoint show --name $ENDPOINT_NAME 

az ml online-deployment show --name blue --endpoint $ENDPOINT_NAME 

ve adlı bluebir dağıtım tarafından $ENDPOINT_NAME tanımlanan uç noktayı görmeniz gerekir.

Uç noktayı örnek verilerle test edin

Uç nokta komutu kullanılarak invoke çağrılabilir. JSON dosyası kullanarak örnek bir istek göndereceğiz.

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json

Daha fazla trafiği işlemek için mevcut dağıtımınızı ölçeklendirme

Çevrimiçi uç noktayla makine öğrenmesi modelini dağıtma ve puanlandırma bölümünde açıklanan dağıtımda, dağıtım yaml dosyasında değerini olarak ayarlarsınız instance_count1. Şu komutu kullanarak update ölçeği genişletebilirsiniz:

az ml online-deployment update --name blue --endpoint-name $ENDPOINT_NAME --set instance_count=2

Not

Yukarıdaki komutta dağıtım yapılandırmasını geçersiz kılmak için kullandığımıza --set dikkat edin. Alternatif olarak yaml dosyasını güncelleştirebilir ve girişi kullanarak --file komutuna update giriş olarak geçirebilirsiniz.

Yeni bir model dağıtın, ancak henüz trafik göndermeyin

adlı greenyeni bir dağıtım oluşturun:

az ml online-deployment create --name green --endpoint-name $ENDPOINT_NAME -f endpoints/online/managed/sample/green-deployment.yml

'a açıkça herhangi bir trafik ayırmadığımız için green, buna ayrılmış sıfır trafik var. Komutunu kullanarak bunu doğrulayabilirsiniz:

az ml online-endpoint show -n $ENDPOINT_NAME --query traffic

Yeni dağıtımı test edin

Trafiğin %0'ı ayrılmış olsa green da, adı belirterek --deployment doğrudan çağırabilirsiniz:

az ml online-endpoint invoke --name $ENDPOINT_NAME --deployment-name green --request-file endpoints/online/model-2/sample-request.json

Trafik kurallarından geçmeden dağıtımı doğrudan çağırmak için bir REST istemcisi kullanmak istiyorsanız, aşağıdaki HTTP üst bilgisini ayarlayın: azureml-model-deployment: <deployment-name>. Aşağıdaki kod parçacığı, dağıtımı doğrudan çağırmak için kullanır curl . Kod parçacığı Unix/WSL ortamlarında çalışmalıdır:

# get the scoring uri
SCORING_URI=$(az ml online-endpoint show -n $ENDPOINT_NAME -o tsv --query scoring_uri)
# use curl to invoke the endpoint
curl --request POST "$SCORING_URI" --header "Authorization: Bearer $ENDPOINT_KEY" --header 'Content-Type: application/json' --header "azureml-model-deployment: green" --data @endpoints/online/model-2/sample-request.json

Yansıtılmış trafikle dağıtımı test etme

Dağıtımınızı green test ettikten sonra canlı trafiğin bir yüzdesini buna yansıtabilir (veya kopyalayabilirsiniz). Trafik yansıtma (gölgelendirme olarak da adlandırılır) istemcilere döndürülen sonuçları değiştirmez; istekler dağıtıma %100 akmaya blue devam eder. İstemcilerinizi etkilemeden ölçümleri ve günlüğe kaydetmeyi toplamak için trafiğin green yansıtılmış yüzdesi kopyalanır ve dağıtıma gönderilir. Yansıtma, istemcileri etkilemeden yeni bir dağıtımı doğrulamak istediğinizde kullanışlıdır. Örneğin, gecikme süresinin kabul edilebilir sınırlar içinde olup olmadığını denetlemek veya HTTP hatası olup olmadığını denetlemek için yansıtmayı kullanabilirsiniz. Yeni dağıtımı trafik yansıtma/gölgelendirme ile test etme, gölge testi olarak da bilinir. Yansıtılmış trafiği alan dağıtım (bu örnekte, green dağıtım) gölge dağıtım olarak da adlandırılabilir.

Yansıtma aşağıdaki sınırlamalara sahiptir:

  • Yansıtma, CLI (v2) (sürüm 2.4.0 veya üzeri) ve Python SDK 'sı (v2) (sürüm 1.0.0 veya üzeri) için desteklenir. Bir uç noktayı güncelleştirmek için CLI/SDK'nın eski bir sürümünü kullanırsanız yansıtma trafiği ayarını kaybedersiniz.
  • Kubernetes çevrimiçi uç noktaları için yansıtma şu anda desteklenmemektedir.
  • Trafiği bir uç noktadaki tek bir dağıtıma yansıtabilirsiniz.
  • Yansıtabileceğiniz maksimum trafik yüzdesi %50'dir. Bu sınır, uç nokta bant genişliği kotanızdaki (varsayılan 5 MBPS) etkiyi azaltmaktır; ayrılan kotayı aşarsanız uç nokta bant genişliğiniz kısıtlanır. Bant genişliği azaltmayı izleme hakkında bilgi için bkz . Yönetilen çevrimiçi uç noktaları izleme.

Ayrıca aşağıdaki davranışlara da dikkat edin:

  • Bir dağıtım, her ikisini birden değil yalnızca canlı veya yansıtılmış trafiği alacak şekilde yapılandırılabilir.
  • Bir uç noktayı çağırdığınızda, tahmin döndürmek için dağıtımlarından herhangi birinin adını (gölge dağıtım bile) belirtebilirsiniz.
  • Gelen trafiği alacak dağıtımın adıyla bir uç nokta çağırdığınızda Azure Machine Learning trafiği gölge dağıtıma yansıtmaz. Azure Machine Learning, bir dağıtım belirtmediğinizde uç noktaya gönderilen trafikten gelen trafiği gölge dağıtıma yansıtır.

Şimdi yeşil dağıtımı yansıtılmış trafiğin %10'unu alacak şekilde ayarlayalım. İstemciler yine de yalnızca mavi dağıtımdan tahminler alır.

Diagram showing 10% traffic mirrored to one deployment.

Aşağıdaki komut trafiğin %10'unu dağıtıma yansıtır green :

az ml online-endpoint update --name $ENDPOINT_NAME --mirror-traffic "green=10"

Gelen trafiği alacak bir dağıtım belirtmeden uç noktayı birkaç kez çağırarak yansıtma trafiğini test edebilirsiniz:

for i in {1..20} ; do
    az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/model-1/sample-request.json
done

Dağıtımdaki günlükleri görerek trafiğin belirli bir yüzdesinin green dağıtıma gönderildiğini onaylayabilirsiniz:

az ml online-deployment get-logs --name blue --endpoint $ENDPOINT_NAME

Test ettikten sonra yansıtmayı devre dışı bırakmak için yansıtma trafiğini sıfır olarak ayarlayabilirsiniz:

az ml online-endpoint update --name $ENDPOINT_NAME --mirror-traffic "green=0"

Yeni dağıtıma canlı trafiğin küçük bir yüzdesini ayırma

Dağıtımınızı green test ettikten sonra, buna trafiğin küçük bir yüzdesini ayırın:

az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=90 green=10"

İpucu

Toplam trafik yüzdesi %0 (trafiği devre dışı bırakmak için) veya %100 (trafiği etkinleştirmek için) olarak toplanmalıdır.

Artık dağıtımınız green tüm canlı trafiğin %10'unuzu alır. İstemciler hem hem green de blue dağıtımlarından tahminler alır.

Diagram showing traffic split between deployments.

Tüm trafiği yeni dağıtımınıza gönderme

Dağıtımınızdan green tam olarak memnun olduktan sonra tüm trafiği buna geçin.

az ml online-endpoint update --name $ENDPOINT_NAME --traffic "blue=0 green=100"

Eski dağıtımı kaldırma

Yönetilen çevrimiçi uç noktadan tek bir dağıtımı silmek için aşağıdaki adımları kullanın. Tek bir dağıtımın silinmesi, yönetilen çevrimiçi uç noktadaki diğer dağıtımları etkiler:

az ml online-deployment delete --name blue --endpoint $ENDPOINT_NAME --yes --no-wait

Uç noktayı ve dağıtımı silme

Uç noktayı ve dağıtımı kullanmayacaksanız, bunları silmeniz gerekir. Uç noktayı silerek tüm temel dağıtımlarını da silebilirsiniz.

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