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

ينطبق على: ملحق التعلم الآلي من Azure CLI v1 v2 (معاينة)

ملاحظة

تستخدم هذه المقالة أحدث إصدار من CLI v2 الموجود في المعاينة العامة. للحصول على إرشادات لتحديث أحدث إصدار وتثبيته، راجع مستند تثبيت وإعداد CLI (v2 ).

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

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

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

هام

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

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

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

  • تثبيت وتكوين ملحق Azure CLI وML (v2). لمزيد من المعلومات، راجع تثبيت 2.0 CLI (معاينة) وإعداده واستخدامه.

  • تحتاج مجموعة موارد Azure، التي تحتاج فيها (أو كيان الخدمة الذي تستخدمه) إلى الحصول User Access Administrator على حق الوصول.Contributor امتلاك مجموعة من الموارد من هذا القبيل وذلك عند القيام بتكوين ملحق ML وفقاً للمقال سالف الذكر.

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

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

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

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

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

التقييدات

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

تعريف ملف YAML للتكوين للنشر

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

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

يوجد مثال YAML التالي في endpoints/online/managed/managed-identities/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.yml
  image: mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04:20210727.v1
instance_type: Standard_DS2_v2
instance_count: 1
environment_variables:
  STORAGE_ACCOUNT_NAME: "storage_place_holder"
  STORAGE_CONTAINER_NAME: "container_place_holder"
  FILE_NAME: "file_place_holder"

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

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

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

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، قم بإنشاء هوية مدارة معينة من قبل النظام أو معينة من قبل المستخدم لنقطة النهاية عبر الإنترنت.

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

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

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

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

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


def get_token():
    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():
    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()

    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 containts: {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()

    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

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

ملاحظة

تقوم طريقة 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

عند اكتمال النشر، يتم تسجيل النموذج والبيئة ونقطة النهاية في مساحة عمل 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

الخطوات التالية