Delen via


Toegang tot Azure-resources vanaf een online-eindpunt met een beheerde identiteit

VAN TOEPASSING OP:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (current)

Meer informatie over het openen van Azure-resources vanuit uw scorescript met een online-eindpunt en een door het systeem toegewezen beheerde identiteit of een door de gebruiker toegewezen beheerde identiteit.

Met zowel beheerde eindpunten als Kubernetes-eindpunten kan Azure Machine Learning de belasting van het inrichten van uw rekenresource en het implementeren van uw machine learning-model beheren. Normaal gesproken moet uw model toegang hebben tot Azure-resources, zoals Azure Container Registry of uw blobopslag voor deductie; met een beheerde identiteit hebt u toegang tot deze resources zonder referenties in uw code te hoeven beheren. Meer informatie over beheerde identiteiten.

In deze handleiding wordt ervan uitgegaan dat u geen beheerde identiteit, een opslagaccount of een online-eindpunt hebt. Als u deze onderdelen al hebt, gaat u verder met de sectie Toegang verlenen tot de sectie Beheerde identiteit .

Vereisten

  • Als u Azure Machine Learning wilt gebruiken, moet u een Azure-abonnement hebben. Als u geen Azure-abonnement hebt, maakt u een gratis account voordat u begint. Probeer vandaag nog de gratis of betaalde versie van Azure Machine Learning.

  • Installeer en configureer de Azure CLI- en ML-extensie (v2). Zie 2.0 CLI installeren, instellen en gebruiken voor meer informatie.

  • Een Azure-resourcegroep waarin u (of de service-principal die u gebruikt) toegangsbeheerder en inzender moet hebben. U hebt een dergelijke resourcegroep als u de ML-extensie hebt geconfigureerd volgens het voorgaande artikel.

  • Een Azure Machine Learning-werkruimte. U hebt al een werkruimte als u de ML-extensie hebt geconfigureerd volgens het voorgaande artikel.

  • Een getraind machine learning-model dat klaar is voor scoren en implementatie. Als u het voorbeeld volgt, wordt er een model opgegeven.

  • Als u de standaardinstellingen voor de Azure CLI nog niet hebt ingesteld, slaat u de standaardinstellingen op. Voer deze code uit om te voorkomen dat de waarden voor uw abonnement, werkruimte en resourcegroep meerdere keren worden doorgegeven:

    az account set --subscription <subscription ID>
    az configure --defaults gitworkspace=<Azure Machine Learning workspace name> group=<resource group>
    
  • Als u het voorbeeld wilt volgen, kloont u de opslagplaats met voorbeelden en wijzigt u vervolgens de map in cli.

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

Beperkingen

  • De identiteit voor een eindpunt kan onveranderbaar zijn. Tijdens het maken van een eindpunt kunt u het koppelen aan een door het systeem toegewezen identiteit (standaard) of een door de gebruiker toegewezen identiteit. U kunt de identiteit niet wijzigen nadat het eindpunt is gemaakt.
  • Als uw ARC- en blobopslag zijn geconfigureerd als privé, dat wil gezegd achter een virtueel netwerk, moet toegang vanaf het Kubernetes-eindpunt via de privékoppeling zijn, ongeacht of uw werkruimte openbaar of privé is. Zie Het vnet van de werkruimte beveiligen voor meer informatie over de instelling private link.

Variabelen configureren voor implementatie

Configureer de variabelenamen voor de werkruimte, werkruimtelocatie en het eindpunt dat u wilt maken voor gebruik met uw implementatie.

Met de volgende code worden deze waarden geëxporteerd als omgevingsvariabelen in uw eindpunt:

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

Geef vervolgens op wat u de naam van uw blob-opslagaccount, blobcontainer en bestand wilt geven. Deze namen van variabelen worden hier gedefinieerd en worden genoemd in az storage account create en az storage container create opdrachten in de volgende sectie.

Met de volgende code worden deze waarden geëxporteerd als omgevingsvariabelen:

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

Nadat deze variabelen zijn geëxporteerd, maakt u lokaal een tekstbestand. Wanneer het eindpunt wordt geïmplementeerd, opent het scorescript dit tekstbestand met behulp van de door het systeem toegewezen beheerde identiteit die wordt gegenereerd bij het maken van het eindpunt.

De implementatieconfiguratie definiëren

Als u een online-eindpunt wilt implementeren met de CLI, moet u de configuratie definiëren in een YAML-bestand. Zie voor meer informatie over het YAML-schema online eindpunt YAML-referentiedocument .

De YAML-bestanden in de volgende voorbeelden worden gebruikt om online-eindpunten te maken.

Het volgende YAML-voorbeeld bevindt zich op eindpunten/online/beheerd/managed/managed-identities/1-sai-create-endpoint. Het bestand,

  • Definieert de naam waarmee u naar het eindpunt wilt verwijzen. my-sai-endpoint
  • Hiermee geeft u het type autorisatie dat moet worden gebruikt voor toegang tot het eindpunt, auth-mode: key.
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-sai-endpoint
auth_mode: key

Dit YAML-voorbeeld, 2-sai-deployment.yml,

  • Hiermee geeft u op dat het type eindpunt dat u wilt maken een online eindpunt is.
  • Geeft aan dat het eindpunt een gekoppelde implementatie heeft met de naam blue.
  • Hiermee configureert u de details van de implementatie, zoals welk model moet worden geïmplementeerd en welke omgeving en scorescript moet worden gebruikt.
$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"

De beheerde identiteit maken

Als u toegang wilt krijgen tot Azure-resources, maakt u een door het systeem toegewezen of door de gebruiker toegewezen beheerde identiteit voor uw online-eindpunt.

Wanneer u een online-eindpunt maakt, wordt automatisch een door het systeem toegewezen beheerde identiteit voor u gegenereerd. U hoeft dus geen afzonderlijke identiteit te maken.

Opslagaccount en container maken

In dit voorbeeld maakt u een blob-opslagaccount en blobcontainer en uploadt u vervolgens het eerder gemaakte tekstbestand naar de blobcontainer. U geeft het online-eindpunt en de beheerde identiteit toegang tot dit opslagaccount en de blobcontainer.

Maak eerst een opslagaccount.

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

Maak vervolgens de blobcontainer in het opslagaccount.

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

Upload vervolgens het tekstbestand naar de blobcontainer.

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

Een online-eindpunt maken

Met de volgende code wordt een online-eindpunt gemaakt zonder een implementatie op te geven.

Waarschuwing

De identiteit voor een eindpunt kan onveranderbaar zijn. Tijdens het maken van een eindpunt kunt u het koppelen aan een door het systeem toegewezen identiteit (standaard) of een door de gebruiker toegewezen identiteit. U kunt de identiteit niet wijzigen nadat het eindpunt is gemaakt.

Wanneer u een online-eindpunt maakt, wordt standaard een door het systeem toegewezen beheerde identiteit gemaakt voor het eindpunt.

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

Controleer de status van het eindpunt met het volgende.

az ml online-endpoint show --name $ENDPOINT_NAME

Zie Problemen met de implementatie en score van online-eindpunten oplossen als u problemen ondervindt.

Toegangsmachtigingen verlenen voor de beheerde identiteit

Belangrijk

Voor online-eindpunten is een azure Container Registry-pull-machtiging, AcrPull-machtiging, vereist voor het containerregister en de machtiging Opslagblobgegevenslezer voor het standaardgegevensarchief van de werkruimte.

U kunt het online-eindpunt machtigen om toegang te krijgen tot uw opslag via de door het systeem toegewezen beheerde identiteit of toestemming geven aan de door de gebruiker toegewezen beheerde identiteit voor toegang tot het opslagaccount dat in de vorige sectie is gemaakt.

Haal de door het systeem toegewezen beheerde identiteit op die is gemaakt voor uw eindpunt.

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

Hier kunt u de door het systeem toegewezen beheerde identiteit machtigen voor toegang tot uw opslag.

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

Scorescript voor toegang tot Azure-resource

Raadpleeg het volgende script voor informatie over het gebruik van uw identiteitstoken voor toegang tot Azure-resources, in dit scenario, het opslagaccount dat in de vorige secties is gemaakt.

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

Een implementatie maken met uw configuratie

Maak een implementatie die is gekoppeld aan het online-eindpunt. Meer informatie over het implementeren naar online-eindpunten.

Waarschuwing

Deze implementatie kan ongeveer 8-14 minuten duren, afhankelijk van of de onderliggende omgeving/installatiekopie voor het eerst wordt gebouwd. Volgende implementaties die dezelfde omgeving gebruiken, gaan sneller.

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

Notitie

De waarde van het --name argument kan de name sleutel in het YAML-bestand overschrijven.

Controleer de status van de implementatie.

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

Als u de bovenstaande query wilt verfijnen om alleen specifieke gegevens te retourneren, raadpleegt u De uitvoer van de Azure CLI-opdracht opvragen.

Notitie

De init-methode in het scorescript leest het bestand uit uw opslagaccount met behulp van het door het systeem toegewezen beheerde identiteitstoken.

Als u de uitvoer van de init-methode wilt controleren, raadpleegt u het implementatielogboek met de volgende code.

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

Wanneer uw implementatie is voltooid, worden het model, de omgeving en het eindpunt geregistreerd bij uw Azure Machine Learning-werkruimte.

Het eindpunt testen

Zodra uw online-eindpunt is geïmplementeerd, test en bevestigt u de bewerking ervan met een aanvraag. Details van de deductie variëren van model tot model. Voor deze handleiding zien de JSON-queryparameters er als volgt uit:

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

Voer het volgende uit om uw eindpunt aan te roepen:

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

Het eindpunt en het opslagaccount verwijderen

Als u niet van plan bent om het geïmplementeerde online-eindpunt en de geïmplementeerde onlineopslag te blijven gebruiken, verwijdert u deze om de kosten te verlagen. Wanneer u het eindpunt verwijdert, worden ook alle bijbehorende implementaties verwijderd.

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