الوصول إلى موارد Azure من نقطة نهاية عبر الإنترنت بهوية مُدارة

ينطبق على:ملحق ML Azure CLI v2 (الحالي)Python SDK azure-ai-ml v2 (الحالي)

تعرف على كيفية الوصول إلى موارد Azure من البرنامج النصي لتسجيل النقاط باستخدام نقطة نهاية عبر الإنترنت وهوية مُدارة مُعيَّنة من قبل النظام أو هوية مُدارة يعينها المستخدم.

تسمح كل من نقاط النهاية المدارة ونقاط نهاية Kubernetes ل Azure التعلم الآلي بإدارة عبء توفير مورد الحساب ونشر نموذج التعلم الآلي. عادة ما يحتاج النموذج الخاص بك إلى الوصول إلى موارد Azure مثل Azure Container Registry أو تخزين الكائن الثنائي كبير الحجم للاستدلال؛ باستخدام هوية مدارة، يمكنك الوصول إلى هذه الموارد دون الحاجة إلى إدارة بيانات الاعتماد في التعليمات البرمجية الخاصة بك. تعرف على المزيد بشأن الهويات المدارة.

يفترض هذا الدليل أنه ليس لديك هوية مدارة أو حساب تخزين أو نقطة نهاية عبر الإنترنت. إذا كان لديك هذه المكونات بالفعل، فانتقل إلى قسم منح إذن الوصول إلى الهوية المدارة.

المتطلبات الأساسية

  • لاستخدام التعلم الآلي من Azure، يجب أن يكون لديك اشتراك Azure. في حال لم يكن لديك اشتراك Azure، فأنشئ حساباً مجانيّاً قبل البدء. جرب الإصدار المجاني أو المدفوع الخاص بـ Azure Machine Learning اليوم.

  • قم بتثبيت وتكوين ملحق واجهة مستوى الاستدعاء (Azure CLI) ونظام التعلم الآلي من Microsoft Azure (الإصدار 2). لمزيد من المعلومات، راجع تثبيت وإعداد واستخدام 2.0 واجهة مستوى الاستدعاء (Azure CLI).

  • تحتاج مجموعة موارد Azure، التي تحتاج فيها (أو كيان الخدمة الذي تستخدمه) إلى وصول المستخدم مسؤول istrator ووصول المساهم. لديك مجموعة موارد إذا قمت بتكوين ملحق التعلم الآلي الخاص بك وفقا للمقالة السابقة.

  • مساحة عمل للتعلم الآلي من Microsoft Azure. لديك بالفعل مساحة عمل إذا قمت بتكوين ملحق التعلم الآلي الخاص بك وفقا للمقالة السابقة.

  • يُعد نموذج تدريب التعلم الآلي جاهز للتسجيل والنشر. إذا كنت تتابع مع العينة، يتم توفير نموذج.

  • إذا لم تكن قد قمت بالفعل بتعيين الإعدادات الافتراضية لـAzure CLI، فاحفظ الإعدادات الافتراضية. لتجنب تمرير قيم اشتراكك، ومساحة العمل، ومجموعة الموارد عدة مرات، قم بتشغيل هذا التعليمة البرمجية:

    az account set --subscription <subscription ID>
    az configure --defaults gitworkspace=<Azure Machine Learning workspace name> group=<resource group>
    
  • للمتابعة مع العينة، قم باستنساخ مستودع العينات ثم قم بتغيير الدليل إلى cli.

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

القيود

  • هوية نقطة النهاية غير قابلة للتغيير. أثناء إنشاء نقطة النهاية، يمكنك إقرانها بالهوية المعينة من قبل النظام (افتراضياً) أو بالهوية المعينة من قبل المستخدم. لا يمكنك تغيير الهوية بعد إنشاء نقطة النهاية.
  • إذا تم تكوين تخزين ARC وكائن ثنائي كبير الحجم كخاص، أي خلف شبكة ظاهرية، فيجب أن يكون الوصول من نقطة نهاية Kubernetes عبر الارتباط الخاص بغض النظر عما إذا كانت مساحة العمل الخاصة بك عامة أو خاصة. مزيد من التفاصيل حول إعداد الارتباط الخاص، راجع كيفية تأمين شبكة ظاهرية لمساحة العمل.

تكوين المتغيرات للتوزيع

قم بتكوين أسماء المتغيرات لمساحة العمل وموقع مساحة العمل ونقطة النهاية التي تريد إنشاءها للاستخدام مع التوزيع الخاص بك.

تصدر التعليمات البرمجية التالية هذه القيم كمتغيرات البيئة في نقطة النهاية:

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

بعد ذلك، تحديد تسمية حساب تخزين blob وحاوية blob والملف. تعريف الأسماء المتغيرة هنا، ويشار إليها في az storage account createaz storage container create والأوامر في القسم التالي.

يُصدر التعليمات البرمجية التالية القيم كمتغيرات البيئة:

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

بعد تصدير هذه المتغيرات، إنشاء ملف نصي محليا. عند نشر نقطة النهاية، يصل البرنامج النصي لتسجيل النقاط إلى هذا الملف النصي باستخدام الهوية المدارة المعينة من قبل النظام التي تم إنشاؤها عند إنشاء نقطة النهاية.

تحديد تكوين التوزيع

لتوزيع نقطة نهاية عبر الإنترنت باستخدام واجهة مستوى الاستدعاء (Azure CLI)، تحتاج إلى تحديد التكوين في ملف YAML. لمزيد من المعلومات حول مخطط YAML، يُرجى الرجوع إلى مستند مرجع YAML لنقطة النهاية عبر الإنترنت .

تُستخدم ملفات YAML في الأمثلة التالية لإنشاء نقاط نهاية على الإنترنت.

يقع مثال YAML التالي في نقاط النهاية/عبر الإنترنت/المدارة/الهويات المدارة/1-sai-create-endpoint. الملف،

  • يحدد الاسم الذي تريد أن تشير به إلى نقطة النهاية، my-sai-endpoint.
  • يحدد نوع التخويل لاستخدامه للوصول إلى نقطة النهاية، auth-mode: key.
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: my-sai-endpoint
auth_mode: key

مثال YAML هذا، 2-sai-deployment.yml،

  • تحديد نوع نقطة النهاية المراد online إنشاؤها.
  • يشير إلى أن نقطة النهاية لها عملية توزيع مرتبطة تسمى blue.
  • تكوين تفاصيل النشر مثل، أي طراز مراد نشره وأي بيئة وبرنامج نصي للتسجيل يتم استخدامه.
$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"

قم بإنشاء الهوية المُدارة

للوصول إلى موارد Azure، قم بإنشاء هوية مُدارة معينة من قبل النظام أو من قبل المستخدم لنقطة النهاية الخاصة بك على الإنترنت.

عندما تقوم بإنشاء نقطة نهاية عبر الإنترنت، يتم إنشاء هوية مُدارة من قبل النظام لك تلقائياً، لذلك لا داعي لإنشاء هوية منفصلة.

إنشاء حساب التخزين والحاوية

في هذا المثال، قم بإنشاء حساب تخزين عنصر ثنائي كبير الحجم (blob) وحاوية عنصر ثنائي كبير الحجم (blob)، ثم قم بتحميل الملف النصي الذي تم إنشاؤه مسبقاً إلى حاوية العنصر الثنائي كبير الحجم (blob). يمكنك منح نقطة النهاية عبر الإنترنت والوصول إلى الهوية المدارة إلى حساب التخزين هذا وحاوية blob.

أولاً، إنشاء حساب التخزين.

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

بعد ذلك، قم بإنشاء حاوية البيانات الثنائية الكبيرة في حساب التخزين.

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

ثم قم بتحميل الملف النصي إلى حاوية 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

قم بإنشاء نقطة نهاية على الإنترنت

يُنشئ التعليمة البرمجية التالي نقطة نهاية عبر الإنترنت دون تحديد عملية توزيع.

تحذير

هوية نقطة النهاية غير قابلة للتغيير. أثناء إنشاء نقطة النهاية، يمكنك إقرانها بالهوية المعينة من قبل النظام (افتراضياً) أو بالهوية المعينة من قبل المستخدم. لا يمكنك تغيير الهوية بعد إنشاء نقطة النهاية.

عندما تقوم بإنشاء نقطة نهاية عبر الإنترنت، يتم إنشاء هوية مُدارة من قبل النظام لنقطة النهاية بشكل افتراضي.

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

تحقق من حالة نقطة النهاية بما يلي.

az ml online-endpoint show --name $ENDPOINT_NAME

إذا واجهت أي مشكلات، فراجع استكشاف أخطاء توزيع نقاط النهاية عبر الإنترنت وتسجيلها.

منح إذن الوصول إلى الهوية المدارة

هام

تتطلب نقاط النهاية عبر الإنترنت إذن سحب Azure Container Registry، إذن AcrPull، إلى سجل الحاوية وأذن Storage Blob Data Reader إلى مخزن البيانات الافتراضي لمساحة العمل.

يمكنك السماح لإذن نقطة النهاية عبر الإنترنت بالوصول إلى مساحة التخزين الخاصة بك عبر الهوية المُدارة المخصصة من قبل النظام أو منح الإذن للهوية المُدارة المعينة من قِبل المستخدم للوصول إلى حساب التخزين الذي تم إنشاؤه في القسم السابق.

استرجع الهوية المُدارة المعينة من قبل النظام والتي تم إنشاؤها لنقطة النهاية الخاصة بك.

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

من هنا، يُمكن منح إذن الهوية المُدارة المعين من قبل النظام للوصول إلى التخزين.

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

تسجيل البرنامج النصي للوصول إلى مورد Azure

ارجع إلى البرنامج النصي التالي لفهم كيفية استخدام رمز الهوية الخاص بك للوصول إلى موارد Azure، في هذا السيناريو، حساب التخزين الذي تم إنشاؤه في الأقسام السابقة.

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

إنشاء توزيع مع التكوين الخاص بك

قم بإنشاء عملية توزيع مرتبطة بنقطة النهاية عبر الإنترنت. اعرف المزيد بشأن التوزيع إلى نقاط النهاية عبر الإنترنت.

تحذير

قد تستغرق عملية النشر حوالي 8-14 دقيقة اعتماداً على ما إذا كانت البيئة/ الصورة الأساسية يجري إنشائها لأول مرة. نقل عمليات النشر اللاحقة باستخدام نفس البيئة بشكل أسرع.

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

إشعار

قد تتجاوز قيمة الوسيطة --name المفتاح name داخل ملف YAML.

تحقق من حالة النشر.

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

لتحسين الاستعلام أعلاه لإرجاع بيانات معينة فقط، راجع Query Azure CLI command output.

إشعار

يقرأ أسلوب init في البرنامج النصي لتسجيل النقاط الملف من حساب التخزين الخاص بك باستخدام رمز الهوية المدار المعين من قبل النظام.

للتحقق من ناتج أسلوب init، يُرجى مراجعة سجل التوزيع مع التعليمات البرمجية التالية.

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

عند اكتمال التوزيع، يتم تسجيل النموذج والبيئة ونقطة النهاية في مساحة عمل التعلم الآلي من Microsoft Azure.

اختبار نقطة النهاية

بمجرد نشر نقطة النهاية عبر الإنترنت، اختبر وتأكد من عمليتها بطلب. تختلف تفاصيل الاستدلال من نموذج لآخر. بالنسبة لهذا الدليل، تبدو معلمات استعلام JSON كما يلي:

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

للاتصال بنقطة النهاية، شغّل:

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

حذف نقطة النهاية وحساب التخزين

إذا كنت لا تخطط للاستمرار في استخدام نقطة النهاية والتخزين عبر الإنترنت التي تم توزيعها، فاحذفها لتقليل التكاليف. عند حذف نقطة النهاية، يتم حذف كافة عمليات النشر المتصلة أيضاً.

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