Akses sumber daya Azure dari titik akhir online dengan identitas terkelola

BERLAKU UNTUK:Ekstensi ml Azure CLI v2 (saat ini)Python SDK azure-ai-ml v2 (saat ini)

Pelajari cara mengakses sumber daya Azure dari skrip penilaian Anda dengan titik akhir online dan identitas terkelola yang ditetapkan sistem atau identitas terkelola yang ditetapkan pengguna.

Titik akhir terkelola dan titik akhir Kubernetes memungkinkan Azure Pembelajaran Mesin mengelola beban provisi sumber daya komputasi dan menyebarkan model pembelajaran mesin Anda. Biasanya model Anda perlu mengakses sumber daya Azure seperti Azure Container Registry atau penyimpanan blob Anda untuk inferensi; dengan identitas terkelola, Anda dapat mengakses sumber daya ini tanpa perlu mengelola kredensial dalam kode Anda. Pelajari selengkapnya tentang identitas terkelola.

Panduan ini mengasumsikan Anda tidak memiliki identitas terkelola, akun penyimpanan, atau titik akhir online. Jika Anda sudah memiliki komponen ini, lewati ke bagian Berikan izin akses ke identitas terkelola.

Prasyarat

  • Untuk menggunakan Azure Machine Learning, Anda harus memiliki langganan Azure. Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai. Coba versi gratis atau berbayar Azure Machine Learning sekarang.

  • Instal dan konfigurasikan ekstensi Azure CLI dan ML (v2). Untuk informasi selengkapnya, lihat Pasang, siapkan, dan gunakan 2.0 CLI.

  • Grup sumber daya Azure, tempat Anda (atau perwakilan layanan yang Anda gunakan) harus memiliki akses Administrator Akses Pengguna dan Kontributor . Anda memiliki grup sumber daya seperti itu jika Anda mengonfigurasi ekstensi ML per artikel sebelumnya.

  • Ruang kerja Azure Machine Learning. Anda sudah memiliki ruang kerja jika Mengonfigurasi ekstensi ML sesuai artikel sebelumnya.

  • Model pembelajaran mesin terlatih siap untuk pemberian skor dan penyebaran. Jika Anda mengikuti sampel, model disediakan.

  • Jika belum mengatur default untuk Azure CLI, simpan pengaturan default Anda. Untuk menghindari melewati nilai untuk langganan, ruang kerja, dan grup sumber daya Anda beberapa kali, jalankan kode ini:

    az account set --subscription <subscription ID>
    az configure --defaults gitworkspace=<Azure Machine Learning workspace name> group=<resource group>
    
  • Untuk mengikuti sampel, kloning repositori sampel lalu ubah direktori menjadi cli.

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

Batasan

  • Identitas untuk titik akhir tidak dapat diubah. Selama pembuatan titik akhir, Anda dapat mengaitkannya dengan identitas yang ditetapkan sistem (default) atau identitas yang ditetapkan pengguna. Anda tidak dapat mengubah identitas setelah titik akhir dibuat.
  • Jika penyimpanan ARC dan blob Anda dikonfigurasi sebagai privat, yaitu, di belakang jaringan virtual, maka akses dari titik akhir Kubernetes harus melalui tautan privat terlepas dari apakah ruang kerja Anda bersifat publik atau privat. Detail selengkapnya tentang pengaturan tautan privat, lihat Cara mengamankan vnet ruang kerja.

Konfigurasikan variabel untuk penyebaran

Konfigurasikan nama variabel untuk ruang kerja, lokasi ruang kerja, dan titik akhir yang ingin Anda buat untuk digunakan dengan penyebaran.

Kode berikut mengekspor nilai-nilai ini sebagai variabel lingkungan di titik akhir Anda:

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

Selanjutnya, tentukan nama apa yang ingin diberikan untuk akun penyimpanan blob, kontainer blob, dan file Anda. Nama variabel ini ditentukan di sini, dan dirujukkan dalam perintah az storage account create dan az storage container create di bagian berikutnya.

Kode berikut mengekspor nilai-nilai tersebut sebagai variabel lingkungan:

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

Setelah variabel ini diekspor, buat file teks secara lokal. Saat titik akhir disebarkan, skrip penilaian mengakses file teks ini menggunakan identitas terkelola yang ditetapkan sistem yang dihasilkan setelah pembuatan titik akhir.

Tentukan konfigurasi penyebaran

Untuk menyebarkan titik akhir online dengan CLI, Anda perlu menentukan konfigurasi dalam file YAML. Untuk informasi selengkapnya tentang skema YAML, lihat dokumen referensi YAML titik akhir online.

File YAML dalam contoh berikut digunakan untuk membuat titik akhir online.

Contoh YAML berikut terletak di titik akhir/online/terkelola/identitas terkelola/1-sai-create-endpoint. File,

  • Tentukan nama yang ingin Anda referensikan ke titik akhir, my-sai-endpoint.
  • Tentukan jenis otorisasi yang akan digunakan untuk mengakses titik akhir, auth-mode: key.
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-sai-endpoint
auth_mode: key

Contoh YAML ini, 2-sai-deployment.yml,

  • Menentukan bahwa tipe titik akhir yang ingin Anda buat adalah titik akhir online.
  • Menunjukkan bahwa titik akhir memiliki penyebaran terkait yang disebut blue.
  • Mengonfigurasi detail penyebaran, seperti model mana yang disebarkan dan lingkungan mana serta skrip pemberian skor mana yang digunakan.
$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"

Buat identitas terkelola

Untuk mengakses sumber daya Azure, buat identitas terkelola yang ditetapkan sistem atau ditetapkan pengguna untuk titik akhir online Anda.

Saat membuat titik akhir online, identitas terkelola yang ditetapkan sistem akan dibuat secara otomatis untuk Anda, jadi tidak perlu membuat yang terpisah.

Buat akun penyimpanan dan kontainer

Untuk contoh ini, buat akun penyimpanan blob dan kontainer blob, lalu unggah file teks yang dibuat sebelumnya ke kontainer blob. Anda memberikan titik akhir online dan akses identitas terkelola ke akun penyimpanan dan kontainer blob ini.

Pertama, buat akun penyimpanan.

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

Selanjutnya, buat kontainer blob di akun penyimpanan.

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

Kemudian, unggah file teks Anda ke kontainer 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

Membuat titik akhir online

Kode berikut membuat titik akhir online tanpa menentukan penyebaran.

Peringatan

Identitas untuk titik akhir tidak dapat diubah. Selama pembuatan titik akhir, Anda dapat mengaitkannya dengan identitas yang ditetapkan sistem (default) atau identitas yang ditetapkan pengguna. Anda tidak dapat mengubah identitas setelah titik akhir dibuat.

Saat Anda membuat titik akhir, identitas terkelola yang ditetapkan sistem dibuat untuk titik akhir secara default.

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

Periksa status titik akhir dengan yang berikut ini.

az ml online-endpoint show --name $ENDPOINT_NAME

Jika Anda mengalami masalah, lihat Memecahkan masalah penyebaran dan penilaian titik akhir online.

Berikan izin akses ke identitas terkelola

Penting

Titik akhir online memerlukan izin penarikan Azure Container Registry, izin AcrPull, ke registri kontainer, dan izin Pembaca Data Blob Penyimpanan ke datastore default ruang kerja.

Anda dapat mengizinkan izin titik akhir agar mengakses penyimpanan melalui identitas terkelola yang ditetapkan sistemnya atau memberikan izin kepada identitas terkelola yang ditetapkan pengguna untuk mengakses akun penyimpanan yang telah dibuat di bagian sebelumnya.

Ambil identitas terkelola yang ditetapkan sistem yang dibuat untuk titik akhir Anda.

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

Dari sini, Anda dapat memberikan izin identitas terkelola yang ditetapkan sistem untuk mengakses penyimpanan Anda.

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

Skrip pemberian skor untuk mengakses sumber daya Azure

Lihat skrip berikut untuk memahami cara menggunakan token identitas Anda untuk mengakses sumber daya Azure, dalam skenario ini, akun penyimpanan yang dibuat di bagian sebelumnya.

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

Buat penyebaran dengan konfigurasi Anda

Buat penyebaran yang berkaitan dengan titik akhir online. Pelajari lebih lanjut penyebaran ke titik akhir online.

Peringatan

Penyebaran ini dapat memerlukan waktu sekitar 8-14 menit, bergantung pada apakah lingkungan/gambar yang mendasarinya sedang dibangun untuk pertama kalinya. Penyebaran berikutnya yang menggunakan lingkungan yang sama akan lebih cepat.

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

Catatan

Nilai argumen --name dapat mengambil alih kunci name di dalam file YAML.

Periksa status penyebaran.

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

Untuk mempersempit kueri di atas agar hanya menampilkan data tertentu, lihat Kueri output perintah Azure CLI.

Catatan

Metode init dalam skrip penilaian membaca file dari akun penyimpanan Anda menggunakan token identitas terkelola yang ditetapkan sistem.

Untuk memeriksa output metode init, lihat log penyebaran dengan kode berikut.

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

Saat penyebaran Anda selesai, model, lingkungan, dan titik akhir akan didaftarkan ke ruang kerja Azure Machine Learning Anda.

Menguji titik akhir

Setelah titik akhir online Anda disebarkan, uji dan konfirmasi operasinya dengan permintaan. Detail inferensi bervariasi pada setiap model. Untuk panduan ini, parameter kueri JSON terlihat seperti:

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

Untuk memanggil titik akhir Anda, jalankan:

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

Menghapus titik akhir dan penyimpanan akun

Jika Anda tidak berencana untuk terus menggunakan titik akhir dan penyimpanan yang disebarkan, hapus untuk mengurangi biaya. Jika Anda menghapus titik akhir, maka semua penyebaran terkait juga akan dihapus.

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