Share via


Yönetilen kimlikle çevrimiçi uç noktadan Azure kaynaklarına erişme

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

Çevrimiçi uç nokta ve sistem tarafından atanan yönetilen kimlik veya kullanıcı tarafından atanan yönetilen kimlik ile puanlama betiğinizden Azure kaynaklarına erişmeyi öğrenin.

Hem yönetilen uç noktalar hem de Kubernetes uç noktaları, Azure Machine Learning'in işlem kaynağınızı sağlama ve makine öğrenmesi modelinizi dağıtma yükünü yönetmesine olanak sağlar. Genellikle modelinizin çıkarım için Azure Container Registry veya blob depolama alanınız gibi Azure kaynaklarına erişmesi gerekir; yönetilen kimlikle, kodunuzda kimlik bilgilerini yönetmenize gerek kalmadan bu kaynaklara erişebilirsiniz. Yönetilen kimlikler hakkında daha fazla bilgi edinin.

Bu kılavuzda yönetilen kimliğiniz, depolama hesabınız veya çevrimiçi uç noktanız olmadığı varsayılır. Bu bileşenlere zaten sahipseniz Yönetilen kimliğe erişim izni ver bölümüne atlayın.

Önkoşullar

  • Azure Machine Learning'i kullanmak için bir Azure aboneliğiniz olmalıdır. Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun. Azure Machine Learning'in ücretsiz veya ücretli sürümünü bugün deneyin.

  • Azure CLI ve ML (v2) uzantısını yükleyin ve yapılandırın. Daha fazla bilgi için bkz . 2.0 CLI'yı yükleme, ayarlama ve kullanma.

  • Sizin (veya kullandığınız hizmet sorumlusunun) Kullanıcı Erişimi Yönetici istrator ve Katkıda Bulunan erişimine sahip olması gereken bir Azure kaynak grubu. Ml uzantınızı önceki makaleye göre yapılandırdıysanız böyle bir kaynak grubunuz vardır.

  • Azure Machine Learning çalışma alanı. Ml uzantınızı önceki makaleye göre yapılandırdıysanız zaten bir çalışma alanınız vardır.

  • Puanlama ve dağıtım için hazır eğitilmiş bir makine öğrenmesi modeli. Örneği takip ediyorsanız bir model sağlanır.

  • 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 gitworkspace=<Azure Machine Learning workspace name> group=<resource group>
    
  • Örneği takip etmek için örnek deposunu kopyalayın ve dizini cli olarak değiştirin.

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

Sınırlamalar

  • Uç noktanın kimliği sabittir. Uç nokta oluşturma sırasında, bunu sistem tarafından atanan bir kimlik (varsayılan) veya kullanıcı tarafından atanan bir kimlikle ilişkilendirebilirsiniz. Uç nokta oluşturulduktan sonra kimliği değiştiremezsiniz.
  • ARC ve blob depolama alanınız özel olarak yapılandırıldıysa, yani bir sanal ağın arkasındaysa, çalışma alanınızın genel veya özel olmasına bakılmaksızın Kubernetes uç noktasından erişim özel bağlantı üzerinden olmalıdır. Özel bağlantı ayarı hakkında daha fazla ayrıntı için bkz. Çalışma alanı sanal alığının güvenliğini sağlama.

Değişkenleri dağıtım için yapılandırma

Çalışma alanı, çalışma alanı konumu ve dağıtımınızla kullanmak üzere oluşturmak istediğiniz uç nokta için değişken adlarını yapılandırın.

Aşağıdaki kod bu değerleri uç noktanızda ortam değişkenleri olarak dışarı aktarır:

export WORKSPACE="<WORKSPACE_NAME>"
export LOCATION="<WORKSPACE_LOCATION>"
export ENDPOINT_NAME="<ENDPOINT_NAME>"

Ardından blob depolama hesabınızı, blob kapsayıcınızı ve dosyanızı adlandırmak istediğiniz adı belirtin. Bu değişken adları burada tanımlanır ve sonraki bölümde ve az storage container create komutlarında az storage account create başvurulur.

Aşağıdaki kod bu değerleri ortam değişkenleri olarak dışarı aktarır:

export STORAGE_ACCOUNT_NAME="<BLOB_STORAGE_TO_ACCESS>"
export STORAGE_CONTAINER_NAME="<CONTAINER_TO_ACCESS>"
export FILE_NAME="<FILE_TO_ACCESS>"

Bu değişkenler dışarı aktarıldıktan sonra yerel olarak bir metin dosyası oluşturun. Uç nokta dağıtıldığında puanlama betiği, uç nokta oluşturulduktan sonra oluşturulan sistem tarafından atanan yönetilen kimliği kullanarak bu metin dosyasına erişir.

Dağıtım yapılandırmasını tanımlama

CLI ile çevrimiçi uç nokta dağıtmak için yapılandırmayı bir YAML dosyasında tanımlamanız gerekir. YAML şeması hakkında daha fazla bilgi için çevrimiçi uç nokta YAML başvuru belgesine bakın.

Aşağıdaki örneklerde yer alan YAML dosyaları, çevrimiçi uç noktalar oluşturmak için kullanılır.

Aşağıdaki YAML örneği uç noktalarda /çevrimiçi/yönetilen/yönetilen-kimlikler/1-sai-create-endpoint konumundadır. Dosya,

  • uç noktasına my-sai-endpointbaşvurmak istediğiniz adı tanımlar.
  • uç noktasına auth-mode: keyerişmek için kullanılacak yetkilendirme türünü belirtir.
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-sai-endpoint
auth_mode: key

Bu YAML örneği, 2-sai-deployment.yml,

  • Oluşturmak istediğiniz uç nokta türünün bir online uç nokta olduğunu belirtir.
  • Uç noktanın adlı blueilişkili bir dağıtımı olduğunu gösterir.
  • Dağıtımın ayrıntılarını (dağıtılacak model ve kullanılacak ortam ve puanlama betiği gibi) yapılandırılır.
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: blue
model:
  path: ../../model-1/model/
code_configuration:
  code: ../../model-1/onlinescoring/
  scoring_script: score_managedidentity.py
environment:
  conda_file: ../../model-1/environment/conda-managedidentity.yaml
  image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
instance_type: Standard_DS3_v2
instance_count: 1
environment_variables:
  STORAGE_ACCOUNT_NAME: "storage_place_holder"
  STORAGE_CONTAINER_NAME: "container_place_holder"
  FILE_NAME: "file_place_holder"

Yönetilen kimliği oluşturma

Azure kaynaklarına erişmek için, çevrimiçi uç noktanız için sistem tarafından atanan veya kullanıcı tarafından atanan bir yönetilen kimlik oluşturun.

Çevrimiçi uç nokta oluşturduğunuzda, sistem tarafından atanan yönetilen kimlik sizin için otomatik olarak oluşturulur, bu nedenle ayrı bir tane oluşturmanız gerekmez.

Depolama hesabı ve kapsayıcı oluşturma

Bu örnek için bir blob depolama hesabı ve blob kapsayıcısı oluşturun ve daha önce oluşturulan metin dosyasını blob kapsayıcısına yükleyin. Bu depolama hesabına ve blob kapsayıcısına çevrimiçi uç nokta ve yönetilen kimlik erişimi verirsiniz.

İlk olarak bir depolama hesabı oluşturun.

az storage account create --name $STORAGE_ACCOUNT_NAME --location $LOCATION

Ardından, depolama hesabında blob kapsayıcısını oluşturun.

az storage container create --account-name $STORAGE_ACCOUNT_NAME --name $STORAGE_CONTAINER_NAME

Ardından metin dosyanızı blob kapsayıcısına yükleyin.

az storage blob upload --account-name $STORAGE_ACCOUNT_NAME --container-name $STORAGE_CONTAINER_NAME --name $FILE_NAME --file endpoints/online/managed/managed-identities/hello.txt

Çevrimiçi uç nokta oluşturma

Aşağıdaki kod, dağıtım belirtmeden çevrimiçi bir uç nokta oluşturur.

Uyarı

Uç noktanın kimliği sabittir. Uç nokta oluşturma sırasında, bunu sistem tarafından atanan bir kimlik (varsayılan) veya kullanıcı tarafından atanan bir kimlikle ilişkilendirebilirsiniz. Uç nokta oluşturulduktan sonra kimliği değiştiremezsiniz.

Çevrimiçi uç nokta oluşturduğunuzda, varsayılan olarak uç nokta için sistem tarafından atanan bir yönetilen kimlik oluşturulur.

az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/managed/managed-identities/1-sai-create-endpoint.yml

Uç noktanın durumunu aşağıdakilerle denetleyin.

az ml online-endpoint show --name $ENDPOINT_NAME

Herhangi bir sorunla karşılaşırsanız bkz . Çevrimiçi uç nokta dağıtımı ve puanlama sorunlarını giderme.

Yönetilen kimliğe erişim izni verme

Önemli

Çevrimiçi uç noktalar için kapsayıcı kayıt defteri için Azure Container Registry çekme izni, AcrPull izni ve çalışma alanının varsayılan veri deposu için Blob Veri Okuyucusu izni Depolama gerekir.

Çevrimiçi uç nokta izninin depolama alanınıza sistem tarafından atanan yönetilen kimliği aracılığıyla erişmesine izin verebilir veya kullanıcı tarafından atanan yönetilen kimliğe önceki bölümde oluşturulan depolama hesabına erişim izni verebilirsiniz.

Uç noktanız için oluşturulan sistem tarafından atanan yönetilen kimliği alın.

system_identity=`az ml online-endpoint show --name $ENDPOINT_NAME --query "identity.principal_id" -o tsv`

Buradan, sistem tarafından atanan yönetilen kimliğe depolama alanınıza erişme izni verebilirsiniz.

az role assignment create --assignee-object-id $system_identity --assignee-principal-type ServicePrincipal --role "Storage Blob Data Reader" --scope $storage_id

Azure kaynağına erişmek için puanlama betiği

Bu senaryoda, önceki bölümlerde oluşturulan depolama hesabı olan Azure kaynaklarına erişmek için kimlik belirtecinizi nasıl kullanacağınızı anlamak için aşağıdaki betiği inceleyin.

import os
import logging
import json
import numpy
import joblib
import requests
from azure.identity import ManagedIdentityCredential
from azure.storage.blob import BlobClient


def access_blob_storage_sdk():
    credential = ManagedIdentityCredential(client_id=os.getenv("UAI_CLIENT_ID"))
    storage_account = os.getenv("STORAGE_ACCOUNT_NAME")
    storage_container = os.getenv("STORAGE_CONTAINER_NAME")
    file_name = os.getenv("FILE_NAME")

    blob_client = BlobClient(
        account_url=f"https://{storage_account}.blob.core.windows.net/",
        container_name=storage_container,
        blob_name=file_name,
        credential=credential,
    )
    blob_contents = blob_client.download_blob().content_as_text()
    logging.info(f"Blob contains: {blob_contents}")


def get_token_rest():
    """
    Retrieve an access token via REST.
    """

    access_token = None
    msi_endpoint = os.environ.get("MSI_ENDPOINT", None)
    msi_secret = os.environ.get("MSI_SECRET", None)

    # If UAI_CLIENT_ID is provided then assume that endpoint was created with user assigned identity,
    # # otherwise system assigned identity deployment.
    client_id = os.environ.get("UAI_CLIENT_ID", None)
    if client_id is not None:
        token_url = (
            msi_endpoint + f"?clientid={client_id}&resource=https://storage.azure.com/"
        )
    else:
        token_url = msi_endpoint + f"?resource=https://storage.azure.com/"

    logging.info("Trying to get identity token...")
    headers = {"secret": msi_secret, "Metadata": "true"}
    resp = requests.get(token_url, headers=headers)
    resp.raise_for_status()
    access_token = resp.json()["access_token"]
    logging.info("Retrieved token successfully.")
    return access_token


def access_blob_storage_rest():
    """
    Access a blob via REST.
    """

    logging.info("Trying to access blob storage...")
    storage_account = os.environ.get("STORAGE_ACCOUNT_NAME")
    storage_container = os.environ.get("STORAGE_CONTAINER_NAME")
    file_name = os.environ.get("FILE_NAME")
    logging.info(
        f"storage_account: {storage_account}, container: {storage_container}, filename: {file_name}"
    )
    token = get_token_rest()

    blob_url = f"https://{storage_account}.blob.core.windows.net/{storage_container}/{file_name}?api-version=2019-04-01"
    auth_headers = {
        "Authorization": f"Bearer {token}",
        "x-ms-blob-type": "BlockBlob",
        "x-ms-version": "2019-02-02",
    }
    resp = requests.get(blob_url, headers=auth_headers)
    resp.raise_for_status()
    logging.info(f"Blob contains: {resp.text}")


def init():
    global model
    # AZUREML_MODEL_DIR is an environment variable created during deployment.
    # It is the path to the model folder (./azureml-models/$MODEL_NAME/$VERSION)
    # For multiple models, it points to the folder containing all deployed models (./azureml-models)
    # Please provide your model's folder name if there is one
    model_path = os.path.join(
        os.getenv("AZUREML_MODEL_DIR"), "model/sklearn_regression_model.pkl"
    )
    # deserialize the model file back into a sklearn model
    model = joblib.load(model_path)
    logging.info("Model loaded")

    # Access Azure resource (Blob storage) using system assigned identity token
    access_blob_storage_rest()
    access_blob_storage_sdk()

    logging.info("Init complete")


# note you can pass in multiple rows for scoring
def run(raw_data):
    logging.info("Request received")
    data = json.loads(raw_data)["data"]
    data = numpy.array(data)
    result = model.predict(data)
    logging.info("Request processed")
    return result.tolist()

Yapılandırmanızla dağıtım oluşturma

Çevrimiçi uç noktayla ilişkili bir dağıtım oluşturun. Çevrimiçi uç noktalara dağıtma hakkında daha fazla bilgi edinin.

Uyarı

Bu dağıtım, temel alınan ortamın/görüntünün ilk kez derlenip derlenmediğine bağlı olarak yaklaşık 8-14 dakika sürebilir. Aynı ortamı kullanan sonraki dağıtımlar daha hızlı olacaktır.

az ml online-deployment create --endpoint-name $ENDPOINT_NAME --all-traffic --name blue --file endpoints/online/managed/managed-identities/2-sai-deployment.yml --set environment_variables.STORAGE_ACCOUNT_NAME=$STORAGE_ACCOUNT_NAME environment_variables.STORAGE_CONTAINER_NAME=$STORAGE_CONTAINER_NAME environment_variables.FILE_NAME=$FILE_NAME

Not

Bağımsız değişkeninin --name değeri YAML dosyasının name içindeki anahtarı geçersiz kılabilir.

Dağıtım durumunu denetleyin.

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

Yukarıdaki sorguyu yalnızca belirli verileri döndürecek şekilde daraltmak için bkz . Azure CLI komut çıkışını sorgulama.

Not

Puanlama betiğindeki init yöntemi, sistem tarafından atanan yönetilen kimlik belirtecini kullanarak dosyayı depolama hesabınızdan okur.

Init yöntemi çıkışını denetlemek için aşağıdaki kodu içeren dağıtım günlüğüne bakın.

# Check deployment logs to confirm blob storage file contents read operation success.
az ml online-deployment get-logs --endpoint-name $ENDPOINT_NAME --name blue

Dağıtımınız tamamlandığında model, ortam ve uç nokta Azure Machine Learning çalışma alanınıza kaydedilir.

Uç noktayı test edin

Çevrimiçi uç noktanız dağıtıldıktan sonra, bir istekle işlemini test edin ve onaylayın. Çıkarım ayrıntıları modelden modele farklılık gösterir. Bu kılavuz için JSON sorgu parametreleri şöyle görünür:

{"data": [
    [1,2,3,4,5,6,7,8,9,10], 
    [10,9,8,7,6,5,4,3,2,1]
]}

Uç noktanızı çağırmak için şunu çalıştırın:

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

Uç noktayı ve depolama hesabını silme

Dağıtılan çevrimiçi uç noktayı ve depolama alanını kullanmaya devam etmek istemiyorsanız maliyetleri azaltmak için bunları silin. Uç noktayı sildiğinizde, tüm ilişkili dağıtımları da silinir.

az ml online-endpoint delete --name $ENDPOINT_NAME --yes
az storage account delete --name $STORAGE_ACCOUNT_NAME --yes