قم بتوزيع نماذج التعلم الآلي لـ Azure

ينطبق على:ملحق Azure CLI ml v1Python SDK azureml v1

تعرَّف على كيفية توزيع التعلم الآلي أو نموذج التعلم العميق كخدمة ويب في سحابة Azure.

إشعار

توفر نقاط نهاية Azure التعلم الآلي (v2) تجربة توزيع محسنة أبسط. تدعم نقاط النهاية كلا من سيناريوهات الاستدلال في الوقت الحقيقي والدفعة. توفر نقاط النهاية واجهة موحدة لاستدعاء عمليات توزيع النموذج وإدارتها عبر أنواع الحساب. راجع ما هي نقاط نهاية Azure التعلم الآلي؟.

سير العمل لتوزيع نموذج

يتشابه سير العمل بغض النظر عن مكان توزيع النموذج الخاص بك:

  1. سجل النموذج.
  2. قم بإعداد برنامج نصي للإدخال.
  3. تحضير تكوين الاستدلال.
  4. قم بتوزيع النموذج محلياً لضمان عمل كل شيء.
  5. اختر حساب الهدف.
  6. قم بتوزيع النموذج على السحابة.
  7. اختبر خدمة الويب الناتجة.

لمزيد من المعلومات حول المفاهيم المضمنة في سير عمل توزيع التعلم الآلي، راجع إدارة النماذج وتوزيعها ومراقبتها باستخدام Azure Machine Learning.

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

ينطبق على:إضافة واجهة مستوى الاستدعاء ml من Azureالإصدار الأولي

هام

تتطلب أوامر Azure CLI الواردة في هذه المقالة ملحق azure-cli-ml، أو الإصدار 1، التعلم الآلي من Microsoft Azure. سينتهي دعم ملحق الإصدار 1 في 30 سبتمبر 2025. ستتمكن من تثبيت ملحق v1 واستخدامه حتى ذلك التاريخ.

نوصي بالانتقال إلى ملحق ml أو الإصدار 2 قبل 30 سبتمبر 2025. لمزيد من المعلومات حول ملحق v2، راجع ملحق Azure ML CLI وPython SDK v2.

  • مساحة عمل للتعلم الآلي من Microsoft Azure. للمزيد من المعلومات، راجع إنشاء موارد مساحة العمل .
  • موديل. تستخدم الأمثلة الواردة في هذه المقالة نموذجاً تم تدريبه مسبقاً.
  • جهاز يمكنه تشغيل Docker، مثل حساب مثيل.

الاتصال بمساحة العمل

ينطبق على:إضافة واجهة مستوى الاستدعاء ml من Azureالإصدار الأولي

لمشاهدة مساحات العمل التي يمكنك الوصول إليها، استخدم الأوامر التالية:

az login
az account set -s <subscription>
az ml workspace list --resource-group=<resource-group>

تسجيل النموذج

من المواقف النموذجية لخدمة التعلم الآلي المنتشرة أنك بحاجة إلى المكونات التالية:

  • الموارد التي تمثل النموذج المحدد الذي تريد توزيعه (على سبيل المثال: ملف نموذج pytorch).
  • التعليمات البرمجية التي سيتم تشغيلها في الخدمة التي تنفذ النموذج على إدخال معين.

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

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

توضح الأمثلة الآتية كيفية تسجيل نموذج.

هام

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

ينطبق على:إضافة واجهة مستوى الاستدعاء ml من Azureالإصدار الأولي

تقوم الأوامر التالية بتنزيل نموذج ثم تسجيله في مساحة عمل التعلم الآلي من Microsoft Azure:

wget https://aka.ms/bidaf-9-model -O model.onnx --show-progress
az ml model register -n bidaf_onnx \
    -p ./model.onnx \
    -g <resource-group> \
    -w <workspace-name>

عيّن -p إلى مسار المجلد أو الملف الذي تريد تسجيله.

لمزيد من المعلومات حول az ml model register، راجع الوثائق المرجعية.

تسجيل نموذج من مهمة تدريب التعلم الآلي Azure

إذا كنت بحاجة إلى تسجيل نموذج تم إنشاؤه مسبقاً من خلال وظيفة تدريب على التعلم الآلي من Microsoft Azure، فيمكنك تحديد التجربة والتشغيل والمسار إلى النموذج:

az ml model register -n bidaf_onnx --asset-path outputs/model.onnx --experiment-name myexperiment --run-id myrunid --tag area=qna

تشير المعلمة --asset-path إلى موقع الشبكة الخاص بالنموذج. في هذا المثال، يتم استخدام مسار ملف واحد. لتضمين عدة ملفات في تسجيل النموذج، اضبط --asset-path على مسار المجلد الذي يحتوي على الملفات.

لمزيد من المعلومات حول az ml model register، راجع الوثائق المرجعية.

إشعار

يمكنك أيضا تسجيل نموذج من ملف محلي عبر مدخل واجهة مستخدم مساحة العمل.

حاليا، هناك خياران لتحميل ملف نموذج محلي في واجهة المستخدم:

  • من الملفات المحلية، والتي ستسجل نموذج v2.
  • من الملفات المحلية (استنادا إلى إطار العمل) ، والتي ستسجل نموذج v1.

لاحظ أنه يمكن نشر النماذج المسجلة فقط عبر مدخل من الملفات المحلية (استنادا إلى إطار العمل) (والتي تعرف باسم نماذج v1) كخدمات ويب باستخدام SDKv1/CLIv1.

تحديد نص إدخال وهمي

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

الأمران اللذان يتعين عليك إنجازهما في البرنامج النصي للمشاركة هما:

  1. تحميل النموذج الخاص بك (باستخدام وظيفة تسمى init())
  2. تشغيل النموذج الخاص بك على بيانات الإدخال (باستخدام وظيفة تسمى run())

للتوزيع الأوَّلي الخاص بك، استخدم نص إدخال وهمياً يطبع البيانات التي يتلقاها.

import json


def init():
    print("This is init")


def run(data):
    test = json.loads(data)
    print(f"received data {test}")
    return f"test is {test}"

احفظ هذا الملف باسم echo_score.py داخل دليل يسمى source_dir. يعيد هذا النص الوهمي البيانات التي ترسلها إليه؛ لذلك لا يستخدم النموذج. ولكن من المفيد اختبار تشغيل البرنامج النصي لتسجيل النتائج.

تعريف تكوين الاستدلال

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

يحدد تكوين الاستدلال أدناه أن توزيع التعلم الآلي سيستخدم الملف echo_score.py في الدليل ./source_dir لمعالجة الطلبات الواردة وأنه سيستخدم صورة Docker مع حزم Python المحددة في بيئة project_environment.

يمكنك استخدام أي بيئات منسقة للاستدلال في نظام التعلم الآلي من Microsoft Azure كصورة Docker الأساسية عند إنشاء بيئة مشروعك. سنقوم بتثبيت التبعيات المطلوبة في الأعلى وتخزين صورة Docker الناتجة في المستودع المرتبط بمساحة عملك.

إشعار

لا يحترم تحميل التعلم الآلي لـ Azure دليل مصدر الاستدلال.gitignore أو .amlignore

ينطبق على:إضافة واجهة مستوى الاستدعاء ml من Azureالإصدار الأولي

يمكن كتابة تكوين الحد الأدنى من الاستدلال على النحو التالي:

{
    "entryScript": "echo_score.py",
    "sourceDirectory": "./source_dir",
    "environment": {
        "docker": {
            "arguments": [],
            "baseDockerfile": null,
            "baseImage": "mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04",
            "enabled": false,
            "sharedVolumes": true,
            "shmSize": null
        },
        "environmentVariables": {
            "EXAMPLE_ENV_VAR": "EXAMPLE_VALUE"
        },
        "name": "my-deploy-env",
        "python": {
            "baseCondaEnvironment": null,
            "condaDependencies": {
                "channels": [],
                "dependencies": [
                    "python=3.6.2",
                    {
                        "pip": [
                            "azureml-defaults"
                        ]
                    }
                ],
                "name": "project_environment"
            },
            "condaDependenciesFile": null,
            "interpreterPath": "python",
            "userManagedDependencies": false
        },
        "version": "1"
    }
}

احفظ هذا الملف باسم dummyinferenceconfig.json.

راجع هذه المقالة للحصول على مناقشة أكثر شمولاً لتكوينات الاستدلال.

تعريف تكوين التوزيع

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

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

ينطبق على:إضافة واجهة مستوى الاستدعاء ml من Azureالإصدار الأولي

يتم تعيين الإدخالات في المستند deploymentconfig.json إلى معلمات LocalWebservice.deploy_configuration. يصف الجدول التالي التعيين بين الكيانات في مستند JSON ومعلمات الأسلوب:

كيان JSON معلمة الأسلوب ‏‏الوصف
computeType غير متوفرة هدف الحساب. بالنسبة للأهداف المحلية، يجب أن تكون القيمة local.
port port المنفذ المحلي الذي سيتم عرض نقطة نهاية HTTP الخاصة بالخدمة عليه.

يُعد ملف JSON مثالاً لتكوين النشر للاستخدام مع CLI:

{
    "computeType": "local",
    "port": 32267
}

احفظ ملف JSON هذا كملف باسم deploymentconfig.json.

لمزيد من المعلومات، راجع مخطط التوزيع.

توزيع نموذج تعلمك الآلي

أنت الآن جاهز لتوزيع النموذج الخاص بك.

ينطبق على:إضافة واجهة مستوى الاستدعاء ml من Azureالإصدار الأولي

استبدل bidaf_onnx:1 باسم نموذجك ورقم إصداره.

az ml model deploy -n myservice \
    -m bidaf_onnx:1 \
    --overwrite \
    --ic dummyinferenceconfig.json \
    --dc deploymentconfig.json \
    -g <resource-group> \
    -w <workspace-name>

اتصل بنموذجك

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

ينطبق على:إضافة واجهة مستوى الاستدعاء ml من Azureالإصدار الأولي

curl -v http://localhost:32267
curl -v -X POST -H "content-type:application/json" \
    -d '{"query": "What color is the fox", "context": "The quick brown fox jumped over the lazy dog."}' \
    http://localhost:32267/score

تحديد نص إدخال

حان الوقت الآن لتحميل النموذج الخاص بك. أولاً، قم بتعديل البرنامج النصي للإدخال الخاص بك:

import json
import numpy as np
import os
import onnxruntime
from nltk import word_tokenize
import nltk


def init():
    nltk.download("punkt")
    global sess
    sess = onnxruntime.InferenceSession(
        os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model.onnx")
    )


def run(request):
    print(request)
    text = json.loads(request)
    qw, qc = preprocess(text["query"])
    cw, cc = preprocess(text["context"])

    # Run inference
    test = sess.run(
        None,
        {"query_word": qw, "query_char": qc, "context_word": cw, "context_char": cc},
    )
    start = np.asscalar(test[0])
    end = np.asscalar(test[1])
    ans = [w for w in cw[start : end + 1].reshape(-1)]
    print(ans)
    return ans


def preprocess(word):
    tokens = word_tokenize(word)

    # split into lower-case word tokens, in numpy array with shape of (seq, 1)
    words = np.asarray([w.lower() for w in tokens]).reshape(-1, 1)

    # split words into chars, in numpy array with shape of (seq, 1, 1, 16)
    chars = [[c for c in t][:16] for t in tokens]
    chars = [cs + [""] * (16 - len(cs)) for cs in chars]
    chars = np.asarray(chars).reshape(-1, 1, 1, 16)
    return words, chars

احفظ هذا الملف باسم score.py داخل source_dir.

لاحظ استخدام متغير البيئة AZUREML_MODEL_DIR لتحديد موقع النموذج المسجل. الآن بعد أن أضفت بعض حزم النقطة.

ينطبق على:إضافة واجهة مستوى الاستدعاء ml من Azureالإصدار الأولي

{
    "entryScript": "score.py",
    "sourceDirectory": "./source_dir",
    "environment": {
        "docker": {
            "arguments": [],
            "baseDockerfile": null,
            "baseImage": "mcr.microsoft.com/azureml/openmpi3.1.2-ubuntu18.04",
            "enabled": false,
            "sharedVolumes": true,
            "shmSize": null
        },
        "environmentVariables": {
            "EXAMPLE_ENV_VAR": "EXAMPLE_VALUE"
        },
        "name": "my-deploy-env",
        "python": {
            "baseCondaEnvironment": null,
            "condaDependencies": {
                "channels": [],
                "dependencies": [
                    "python=3.6.2",
                    {
                        "pip": [
                            "azureml-defaults",
                            "nltk",
                            "numpy",
                            "onnxruntime"
                        ]
                    }
                ],
                "name": "project_environment"
            },
            "condaDependenciesFile": null,
            "interpreterPath": "python",
            "userManagedDependencies": false
        },
        "version": "2"
    }
}

احفظ هذا الملف باسم inferenceconfig.json

وَزِّع مرة أخرى واتصل بخدمتك

وَزِّع خدمتك مرة أخرى:

ينطبق على:إضافة واجهة مستوى الاستدعاء ml من Azureالإصدار الأولي

استبدل bidaf_onnx:1 باسم نموذجك ورقم إصداره.

az ml model deploy -n myservice \
    -m bidaf_onnx:1 \
    --overwrite \
    --ic inferenceconfig.json \
    --dc deploymentconfig.json \
    -g <resource-group> \
    -w <workspace-name>

ثم تأكد من أنه يمكنك إرسال طلب نشر إلى الخدمة:

ينطبق على:إضافة واجهة مستوى الاستدعاء ml من Azureالإصدار الأولي

curl -v -X POST -H "content-type:application/json" \
    -d '{"query": "What color is the fox", "context": "The quick brown fox jumped over the lazy dog."}' \
    http://localhost:32267/score

اختر حساب الهدف

سيؤثر هدف الحساب الذي تستخدمه لاستضافة نموذجك على تكلفة نقطة النهاية الموزعة ومدى توفرها. استخدم هذا الجدول لاختيار هدف حوسبة مناسب.

هدف الحساب يُستخدم في دعم وحدة المعالجة الرسومية ‏‏الوصف
خدمة الويب المحلية الاختبار/التصحيح   يُستخدم للاختبار المحدود واستكشاف الأخطاء وإصلاحها. يعتمد تسريع الأجهزة على استخدام المكتبات في النظام المحلي.
نماذج التعلم الآلي من Azure الاستدلال في الوقت الحقيقي ‏‏نعم‬ تشغيل أحمال عمل الاستدلال في السحابة.
مثيلات Azure Container الاستدلال في الوقت الحقيقي

موصى به لأغراض التطوير/الاختبار فقط.
  استخدمه لأحمال العمل منخفضة النطاق المستندة إلى وحدة المعالجة المركزية والتي تتطلب أقل من 48 غيغابايت من ذاكرة الوصول العشوائي. لا يتطلب منك إدارة نظام المجموعة.

مناسب فقط للنماذج التي يقل حجمها عن 1 غيغابايت.

معتمد في المصمم.

إشعار

عند اختيار SKU للمجموعة، قم أولاً بالتوسيع ثم توسيع النطاق. ابدأ بجهاز يحتوي على 150% من ذاكرة الوصول العشوائي التي يتطلبها نموذجك، وحدد النتيجة وابحث عن جهاز يتمتع بالأداء الذي تحتاجه. بمجرد أن تتعلم ذلك، قم بزيادة عدد الآلات لتناسب حاجتك إلى الاستدلال المتزامن.

إشعار

توفر نقاط نهاية Azure التعلم الآلي (v2) تجربة توزيع محسنة أبسط. تدعم نقاط النهاية كلا من سيناريوهات الاستدلال في الوقت الحقيقي والدفعة. توفر نقاط النهاية واجهة موحدة لاستدعاء عمليات توزيع النموذج وإدارتها عبر أنواع الحساب. راجع ما هي نقاط نهاية Azure التعلم الآلي؟.

وَزِّع في السحابة

بمجرد التأكد من أن خدمتك تعمل محلياً واختيار هدف حساب عن بُعد، فأنت جاهز للتوزيع في السحابة.

قم بتغيير تكوين التوزيع الخاص بك ليتوافق مع هدف الحساب الذي اخترته، في هذه الحالة مثيلات Azure Container:

ينطبق على:إضافة واجهة مستوى الاستدعاء ml من Azureالإصدار الأولي

تختلف الخيارات المتاحة لتكوين التوزيع وفقاً لهدف الحساب الذي تختاره.

{
    "computeType": "aci",
    "containerResourceRequirements":
    {
        "cpu": 0.5,
        "memoryInGB": 1.0
    },
    "authEnabled": true,
    "sslEnabled": false,
    "appInsightsEnabled": false
}

احفظ هذا الملف باسم re-deploymentconfig.json.

لمزيد من المعلومات، راجع هذا المرجع.

وَزِّع خدمتك مرة أخرى:

ينطبق على:إضافة واجهة مستوى الاستدعاء ml من Azureالإصدار الأولي

استبدل bidaf_onnx:1 باسم نموذجك ورقم إصداره.

az ml model deploy -n myservice \
    -m bidaf_onnx:1 \
    --overwrite \
    --ic inferenceconfig.json \
    --dc re-deploymentconfig.json \
    -g <resource-group> \
    -w <workspace-name>

لعرض سجلات الخدمة، استخدم الأمر التالي:

az ml service get-logs -n myservice \
    -g <resource-group> \
    -w <workspace-name>

اتصل بخدمة الويب البعيدة

عند التوزيع عن بُعد، قد يكون لديك مفتاح مصادقة ممكّن. يوضح المثال أدناه كيفية الحصول على مفتاح الخدمة الخاص بك مع Python لتقديم طلب استنتاج.

import requests
import json
from azureml.core import Webservice

service = Webservice(workspace=ws, name="myservice")
scoring_uri = service.scoring_uri

# If the service is authenticated, set the key or token
key, _ = service.get_keys()

# Set the appropriate headers
headers = {"Content-Type": "application/json"}
headers["Authorization"] = f"Bearer {key}"

# Make the request and display the response and logs
data = {
    "query": "What color is the fox",
    "context": "The quick brown fox jumped over the lazy dog.",
}
data = json.dumps(data)
resp = requests.post(scoring_uri, data=data, headers=headers)
print(resp.text)
print(service.get_logs())

راجع المقالة حول تطبيقات العميل لاستخدام خدمات الويب لمزيد من أمثلة العملاء بلغات أخرى.

كيفية تكوين رسائل البريد الإلكتروني في الاستوديو

لبدء تلقي رسائل البريد الإلكتروني عند اكتمال وظيفتك أو نقطة النهاية عبر الإنترنت أو نقطة نهاية الدفعة أو إذا كانت هناك مشكلة (فشل أو تم إلغاؤها)، استخدم الخطوات التالية:

  1. في استوديو التعلم الآلي من Microsoft Azure، انتقل إلى الإعدادات عن طريق تحديد أيقونة الترس.
  2. حدد علامة التبويب Email notifications .
  3. قم بالتبديل لتمكين أو تعطيل إشعارات البريد الإلكتروني لحدث معين.

Screenshot of Azure ML studio's settings on the email notifications tab.

فهم حالة الخدمة

أثناء توزيع النموذج، قد ترى تغيير حالة الخدمة أثناء توزيعها بالكامل.

يصف الجدول التالي حالات الخدمة المختلفة:

حالة خدمة الويب ‏‏الوصف الحالة النهائية؟
الانتقالات الخدمة قيد التوزيع. لا
غير سليم تم توزيع الخدمة ولكن لا يمكن الوصول إليها حالياً. لا
Unschedulable لا يمكن توزيع الخدمة في هذا الوقت بسبب نقص الموارد. لا
فاشل فشلت الخدمة في التوزيع بسبب خطأ أو عطل. ‏‏نعم‬
سليم الخدمة صحية ونقطة النهاية متاحة. ‏‏نعم‬

تلميح

عند التوزيع، يتم إنشاء صور Docker لأهداف الحساب وتحميلها من Azure Container Registry (ACR). بشكل افتراضي، يقوم نظام التعلم الآلي من Microsoft Azure بإنشاء ACR يستخدم طبقة الخدمة الأساسية. قد يؤدي تغيير ACR لمساحة العمل الخاصة بك إلى المستوى القياسي أو المتميز إلى تقليل الوقت الذي يستغرقه إنشاء الصور وتوزيعها على أهداف الحوسبة الخاصة بك. لمزيد من المعلومات، راجع طبقات خدمة سجل حاويات Azure.

إشعار

إذا كنت توزع نموذجاً في خدمة Azure Kubernetes (AKS)، فننصحك بتمكين Azure Monitor لهذه المجموعة. يساعدك هذا على فهم سلامة نظام المجموعة واستخدام الموارد بشكل عام. قد تجد أيضاً الموارد التالية مفيدة:

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

حذف الموارد

ينطبق على:إضافة واجهة مستوى الاستدعاء ml من Azureالإصدار الأولي

# Get the current model id
import os

stream = os.popen(
    'az ml model list --model-name=bidaf_onnx --latest --query "[0].id" -o tsv'
)
MODEL_ID = stream.read()[0:-1]
MODEL_ID
az ml service delete -n myservice
az ml service delete -n myaciservice
az ml model delete --model-id=<MODEL_ID>

لحذف خدمة ويب تم توزيعها، استخدم az ml service delete <name of webservice>.

لحذف نموذج مسجل من مساحة العمل الخاصة بك، استخدم az ml model delete <model id>

اقرأ المزيد حول حذف خدمة ويب وحذف نموذج.

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