Udostępnij za pośrednictwem


Uzyskiwanie dostępu do zasobów platformy Azure z punktu końcowego online przy użyciu tożsamości zarządzanej

DOTYCZY: Rozszerzenie interfejsu wiersza polecenia platformy Azure w wersji 2 (current)Zestaw PYTHON SDK azure-ai-ml v2 (bieżąca)

Dowiedz się, jak uzyskać dostęp do zasobów platformy Azure ze skryptu oceniania za pomocą punktu końcowego online i tożsamości zarządzanej przypisanej przez system lub tożsamości zarządzanej przypisanej przez użytkownika.

Zarówno zarządzane punkty końcowe, jak i punkty końcowe kubernetes umożliwiają usłudze Azure Machine Learning zarządzanie obciążeniem aprowizowaniem zasobu obliczeniowego i wdrażaniem modelu uczenia maszynowego. Zazwyczaj model musi uzyskiwać dostęp do zasobów platformy Azure, takich jak usługa Azure Container Registry lub magazyn obiektów blob na potrzeby wnioskowania; przy użyciu tożsamości zarządzanej można uzyskać dostęp do tych zasobów bez konieczności zarządzania poświadczeniami w kodzie. Dowiedz się więcej o tożsamościach zarządzanych.

W tym przewodniku założono, że nie masz tożsamości zarządzanej, konta magazynu ani punktu końcowego online. Jeśli masz już te składniki, przejdź do sekcji Przyznawanie uprawnień dostępu do tożsamości zarządzanej.

Wymagania wstępne

  • Aby korzystać z usługi Azure Machine Learning, musisz mieć subskrypcję platformy Azure. Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto. Wypróbuj bezpłatną lub płatną wersję usługi Azure Machine Learning już dziś.

  • Zainstaluj i skonfiguruj rozszerzenie interfejsu wiersza polecenia platformy Azure i uczenia maszynowego (wersja 2). Aby uzyskać więcej informacji, zobacz Instalowanie, konfigurowanie i używanie interfejsu wiersza polecenia w wersji 2.0.

  • Grupa zasobów platformy Azure, w której (lub używana jednostka usługi) musi mieć dostęp administratora dostępu użytkowników i współautora . Istnieje taka grupa zasobów, jeśli skonfigurowano rozszerzenie uczenia maszynowego zgodnie z poprzednim artykułem.

  • Obszar roboczy usługi Azure Machine Learning. Masz już obszar roboczy, jeśli skonfigurowano rozszerzenie uczenia maszynowego zgodnie z poprzednim artykułem.

  • Wytrenowany model uczenia maszynowego jest gotowy do oceniania i wdrażania. Jeśli korzystasz z przykładu, zostanie udostępniony model.

  • Jeśli nie ustawiono jeszcze ustawień domyślnych dla interfejsu wiersza polecenia platformy Azure, zapisz ustawienia domyślne. Aby uniknąć wielokrotnego przekazywania wartości dla subskrypcji, obszaru roboczego i grupy zasobów, uruchom następujący kod:

    az account set --subscription <subscription ID>
    az configure --defaults gitworkspace=<Azure Machine Learning workspace name> group=<resource group>
    
  • Aby wykonać czynności opisane w przykładzie, sklonuj repozytorium przykładów, a następnie zmień katalog na interfejs wiersza polecenia.

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

Ograniczenia

  • Tożsamość punktu końcowego jest niezmienna. Podczas tworzenia punktu końcowego można skojarzyć ją z tożsamością przypisaną przez system (domyślną) lub tożsamością przypisaną przez użytkownika. Nie można zmienić tożsamości po utworzeniu punktu końcowego.
  • Jeśli magazyn ARC i blob są skonfigurowane jako prywatne, oznacza to, że za siecią wirtualną dostęp z punktu końcowego Kubernetes powinien być za pośrednictwem łącza prywatnego niezależnie od tego, czy obszar roboczy jest publiczny, czy prywatny. Więcej informacji na temat ustawienia łącza prywatnego można znaleźć w temacie How to secure workspace vnet (Jak zabezpieczyć sieć wirtualną obszaru roboczego).

Konfigurowanie zmiennych dla wdrożenia

Skonfiguruj nazwy zmiennych dla obszaru roboczego, lokalizacji obszaru roboczego i punktu końcowego, który chcesz utworzyć do użycia z wdrożeniem.

Następujący kod eksportuje te wartości jako zmienne środowiskowe w punkcie końcowym:

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

Następnie określ, co chcesz nazwać kontem magazynu obiektów blob, kontenerem obiektów blob i plikiem. Te nazwy zmiennych są zdefiniowane w tym miejscu i są określane w az storage account create poleceniach i az storage container create w następnej sekcji.

Poniższy kod eksportuje te wartości jako zmienne środowiskowe:

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

Po wyeksportowaniu tych zmiennych utwórz lokalnie plik tekstowy. Po wdrożeniu punktu końcowego skrypt oceniania uzyskuje dostęp do tego pliku tekstowego przy użyciu przypisanej przez system tożsamości zarządzanej wygenerowanej podczas tworzenia punktu końcowego.

Definiowanie konfiguracji wdrożenia

Aby wdrożyć punkt końcowy online przy użyciu interfejsu wiersza polecenia, należy zdefiniować konfigurację w pliku YAML. Aby uzyskać więcej informacji na temat schematu YAML, zobacz dokument referencyjny YAML dotyczący punktu końcowego online.

Pliki YAML w poniższych przykładach służą do tworzenia punktów końcowych online.

Poniższy przykład YAML znajduje się w punktach końcowych/online/zarządzanych/zarządzanych-tożsamościach/1-sai-create-endpoint. Plik,

  • Definiuje nazwę, za pomocą której chcesz odwoływać się do punktu końcowego, my-sai-endpoint.
  • Określa typ autoryzacji, który ma być używany do uzyskiwania dostępu do punktu końcowego, auth-mode: key.
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-sai-endpoint
auth_mode: key

Ten przykład YAML, 2-sai-deployment.yml,

  • Określa, że typ punktu końcowego, który chcesz utworzyć, to online punkt końcowy.
  • Wskazuje, że punkt końcowy ma skojarzone wdrożenie o nazwie blue.
  • Konfiguruje szczegóły wdrożenia, takie jak, który model ma zostać wdrożony, oraz jakiego środowiska i skryptu oceniania do użycia.
$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"

Tworzenie tożsamości zarządzanej

Aby uzyskać dostęp do zasobów platformy Azure, utwórz tożsamość zarządzaną przypisaną przez system lub przypisaną przez użytkownika dla punktu końcowego online.

Podczas tworzenia punktu końcowego online tożsamość zarządzana przypisana przez system jest automatycznie generowana, więc nie trzeba tworzyć oddzielnej tożsamości.

Tworzenie konta magazynu i kontenera

W tym przykładzie utwórz konto magazynu obiektów blob i kontener obiektów blob, a następnie przekaż wcześniej utworzony plik tekstowy do kontenera obiektów blob. Dostęp do tego konta magazynu i kontenera obiektów blob zapewnia punkt końcowy online i tożsamość zarządzaną.

Najpierw utwórz konto magazynu.

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

Następnie utwórz kontener obiektów blob na koncie magazynu.

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

Następnie przekaż plik tekstowy do kontenera obiektów blob.

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

Tworzenie punktu końcowego online

Poniższy kod tworzy punkt końcowy online bez określania wdrożenia.

Ostrzeżenie

Tożsamość punktu końcowego jest niezmienna. Podczas tworzenia punktu końcowego można skojarzyć ją z tożsamością przypisaną przez system (domyślną) lub tożsamością przypisaną przez użytkownika. Nie można zmienić tożsamości po utworzeniu punktu końcowego.

Podczas tworzenia punktu końcowego online tożsamość zarządzana przypisana przez system jest domyślnie tworzona dla punktu końcowego.

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

Sprawdź stan punktu końcowego, wykonując następujące czynności.

az ml online-endpoint show --name $ENDPOINT_NAME

Jeśli wystąpią jakiekolwiek problemy, zobacz Rozwiązywanie problemów z wdrażaniem i ocenianiem punktów końcowych online.

Przyznawanie uprawnień dostępu do tożsamości zarządzanej

Ważne

Punkty końcowe online wymagają uprawnienia ściągnięcia usługi Azure Container Registry, uprawnienia AcrPull do rejestru kontenerów i czytelnika danych obiektu blob usługi Storage do domyślnego magazynu danych obszaru roboczego.

Możesz zezwolić na uprawnienie punktu końcowego online w celu uzyskania dostępu do magazynu za pośrednictwem przypisanej przez system tożsamości zarządzanej lub udzielenia uprawnień do tożsamości zarządzanej przypisanej przez użytkownika w celu uzyskania dostępu do konta magazynu utworzonego w poprzedniej sekcji.

Pobierz tożsamość zarządzaną przypisaną przez system, która została utworzona dla punktu końcowego.

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

W tym miejscu możesz udzielić przypisanej przez system tożsamości zarządzanej uprawnień dostępu do magazynu.

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

Skrypt oceniania w celu uzyskania dostępu do zasobu platformy Azure

Zapoznaj się z poniższym skryptem, aby dowiedzieć się, jak używać tokenu tożsamości do uzyskiwania dostępu do zasobów platformy Azure. W tym scenariuszu konto magazynu utworzone w poprzednich sekcjach.

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()

Tworzenie wdrożenia przy użyciu konfiguracji

Utwórz wdrożenie skojarzone z punktem końcowym online. Dowiedz się więcej o wdrażaniu w punktach końcowych online.

Ostrzeżenie

To wdrożenie może potrwać około 8–14 minut, w zależności od tego, czy bazowe środowisko/obraz jest kompilowany po raz pierwszy. Kolejne wdrożenia korzystające z tego samego środowiska będą szybsze.

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

Uwaga

Wartość argumentu --name może zastąpić name klucz wewnątrz pliku YAML.

Sprawdź stan wdrożenia.

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

Aby uściślić powyższe zapytanie w celu zwrócenia tylko określonych danych, zobacz Zapytanie o dane wyjściowe polecenia interfejsu wiersza polecenia platformy Azure.

Uwaga

Metoda init w skrypcie oceniania odczytuje plik z konta magazynu przy użyciu przypisanego przez system tokenu tożsamości zarządzanej.

Aby sprawdzić dane wyjściowe metody init, zobacz dziennik wdrażania z następującym kodem.

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

Po zakończeniu wdrażania model, środowisko i punkt końcowy są rejestrowane w obszarze roboczym usługi Azure Machine Learning.

Testowanie punktu końcowego

Po wdrożeniu punktu końcowego online przetestuj i potwierdź jego operację za pomocą żądania. Szczegóły wnioskowania różnią się w zależności od modelu do modelu. W tym przewodniku parametry zapytania JSON wyglądają następująco:

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

Aby wywołać punkt końcowy, uruchom polecenie:

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

Usuwanie punktu końcowego i konta magazynu

Jeśli nie planujesz nadal korzystać z wdrożonego punktu końcowego i magazynu online, usuń je, aby zmniejszyć koszty. Usunięcie punktu końcowego spowoduje również usunięcie wszystkich skojarzonych z nim wdrożeń.

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