تدريب نماذج Keras على نطاق واسع باستخدام Azure التعلم الآلي

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

في هذه المقالة، تعرف على كيفية تشغيل البرامج النصية لتدريب Keras باستخدام Azure التعلم الآلي Python SDK v2.

يستخدم مثال التعليمات البرمجية في هذه المقالة Azure التعلم الآلي لتدريب نموذج Keras تم إنشاؤه باستخدام الواجهة الخلفية TensorFlow وتسجيله ونشره. يصنف النموذج، وهو شبكة عصبية عميقة (DNN) تم إنشاؤها باستخدام مكتبة Keras Python التي تعمل أعلى TensorFlow، الأرقام المكتوبة بخط اليد من مجموعة بيانات MNIST الشائعة.

Keras هي واجهة برمجة تطبيقات لشبكة عصبية عالية المستوى قادرة على تشغيل أعلى إطارات عمل DNN الشائعة الأخرى لتبسيط التطوير. يمكنك، باستخدام Azure التعلم الآلي، توسيع نطاق مهام التدريب بسرعة باستخدام موارد الحساب السحابية المرنة. يمكنك أيضا تعقب عمليات تشغيل التدريب ونماذج الإصدار وتوزيع النماذج والمزيد.

سواء كنت تعمل على تطوير نموذج Keras من الألف إلى الياء أو كنت تجلب نموذجا موجودا إلى السحابة، يمكن أن يساعدك Azure التعلم الآلي على إنشاء نماذج جاهزة للإنتاج.

إشعار

إذا كنت تستخدم Keras API tf.keras المضمنة في TensorFlow وليست حزمة Keras المستقلة، فراجع بدلا من ذلك تدريب نماذج TensorFlow.

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

للاستفادة من هذه المقالة، ستحتاج إلى:

  • الوصول إلى اشتراك Azure. إذا لم يكن لديك حساب بالفعل، فبادر بإنشاء حساب مجاني.
  • قم بتشغيل التعليمات البرمجية في هذه المقالة باستخدام إما مثيل حساب Azure التعلم الآلي أو دفتر ملاحظات Jupyter الخاص بك.
    • مثيل حساب Azure التعلم الآلي - لا يلزم إجراء أي تنزيلات أو تثبيت
      • أكمل إنشاء موارد للبدء في إنشاء خادم دفتر ملاحظات مخصص محمل مسبقا ب SDK ومستودع العينة.
      • في مجلد التعلم العميق للعينات على خادم دفتر الملاحظات، ابحث عن دفتر ملاحظات مكتمل وموسع بالانتقال إلى هذا الدليل: v2 > sdk > python > jobs > ذات الخطوة > الواحدة tensorflow > train-hyperparameter-tune-deploy-with-keras.
    • خادم دفتر ملاحظات Jupyter
  • قم بتنزيل البرامج النصية للتدريب keras_mnist.py utils.py.

يمكنك أيضاً العثور على إصدار Jupyter Notebook المكتمل لهذا الدليل في صفحة نماذج GitHub.

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

إعداد المهمة

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

الاتصال إلى مساحة العمل

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

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

إذا DefaultAzureCredential لم يعمل لك، فشاهد azure-identity reference documentation أو Set up authentication لمزيد من بيانات الاعتماد المتوفرة.

# Handle to the workspace
from azure.ai.ml import MLClient

# Authentication package
from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()

إذا كنت تفضل استخدام مستعرض لتسجيل الدخول والمصادقة، يجب إلغاء التعليق على التعليمات البرمجية التالية واستخدامها بدلا من ذلك.

# Handle to the workspace
# from azure.ai.ml import MLClient

# Authentication package
# from azure.identity import InteractiveBrowserCredential
# credential = InteractiveBrowserCredential()

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

  1. ابحث عن اسم مساحة العمل في الزاوية العلوية اليسرى من شريط أدوات Azure التعلم الآلي studio.
  2. حدد اسم مساحة العمل لإظهار مجموعة الموارد ومعرف الاشتراك.
  3. انسخ قيم مجموعة الموارد ومعرف الاشتراك في التعليمات البرمجية.
# Get a handle to the workspace
ml_client = MLClient(
    credential=credential,
    subscription_id="<SUBSCRIPTION_ID>",
    resource_group_name="<RESOURCE_GROUP>",
    workspace_name="<AML_WORKSPACE_NAME>",
)

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

إشعار

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

إنشاء مورد حساب لتشغيل المهمة

يحتاج Azure التعلم الآلي إلى مورد حساب لتشغيل وظيفة. يمكن أن يكون هذا المورد أجهزة فردية أو متعددة العقد مع Linux أو نظام التشغيل Windows، أو نسيج حساب معين مثل Spark.

في المثال التالي للبرنامج النصي، نقوم بتوفير Linux compute cluster. يمكنك مشاهدة الصفحة للحصول على Azure Machine Learning pricing القائمة الكاملة لأحجام الجهاز الظاهري وأسعاره. نظرا لأننا بحاجة إلى نظام مجموعة GPU لهذا المثال، دعنا نختار نموذج STANDARD_NC6 وننشئ حساب Azure التعلم الآلي.

from azure.ai.ml.entities import AmlCompute

gpu_compute_target = "gpu-cluster"

try:
    # let's see if the compute target already exists
    gpu_cluster = ml_client.compute.get(gpu_compute_target)
    print(
        f"You already have a cluster named {gpu_compute_target}, we'll reuse it as is."
    )

except Exception:
    print("Creating a new gpu compute target...")

    # Let's create the Azure ML compute object with the intended parameters
    gpu_cluster = AmlCompute(
        # Name assigned to the compute cluster
        name="gpu-cluster",
        # Azure ML Compute is the on-demand VM service
        type="amlcompute",
        # VM Family
        size="STANDARD_NC6s_v3",
        # Minimum running nodes when there is no job running
        min_instances=0,
        # Nodes in cluster
        max_instances=4,
        # How many seconds will the node running after the job termination
        idle_time_before_scale_down=180,
        # Dedicated or LowPriority. The latter is cheaper but there is a chance of job termination
        tier="Dedicated",
    )

    # Now, we pass the object to MLClient's create_or_update method
    gpu_cluster = ml_client.begin_create_or_update(gpu_cluster).result()

print(
    f"AMLCompute with name {gpu_cluster.name} is created, the compute size is {gpu_cluster.size}"
)

إنشاء بيئة وظيفة

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

يسمح لك Azure التعلم الآلي إما باستخدام بيئة منسقة (أو جاهزة) أو إنشاء بيئة مخصصة باستخدام صورة Docker أو تكوين Conda. في هذه المقالة، ستقوم بإنشاء بيئة Conda مخصصة لوظائفك، باستخدام ملف Conda YAML.

إنشاء بيئة مخصصة

لإنشاء بيئتك المخصصة، ستقوم بتعريف تبعيات Conda في ملف YAML. أولا، إنشاء دليل لتخزين الملف. في هذا المثال، قمنا بتسمية الدليل dependencies.

import os

dependencies_dir = "./dependencies"
os.makedirs(dependencies_dir, exist_ok=True)

ثم قم بإنشاء الملف في دليل التبعيات. في هذا المثال، قمنا بتسمية الملف conda.yml.

%%writefile {dependencies_dir}/conda.yaml
name: keras-env
channels:
  - conda-forge
dependencies:
  - python=3.8
  - pip=21.2.4
  - pip:
    - protobuf~=3.20
    - numpy==1.22
    - tensorflow-gpu==2.2.0
    - keras<=2.3.1
    - matplotlib
    - azureml-mlflow==1.42.0

تحتوي المواصفات على بعض الحزم المعتادة (مثل numpy و pip) التي ستستخدمها في وظيفتك.

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

from azure.ai.ml.entities import Environment

custom_env_name = "keras-env"

job_env = Environment(
    name=custom_env_name,
    description="Custom environment for keras image classification",
    conda_file=os.path.join(dependencies_dir, "conda.yaml"),
    image="mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest",
)
job_env = ml_client.environments.create_or_update(job_env)

print(
    f"Environment with name {job_env.name} is registered to workspace, the environment version is {job_env.version}"
)

لمزيد من المعلومات حول إنشاء البيئات واستخدامها، قم بمراجعة إنشاء بيئات البرامج واستخدامها في التعلم الآلي من Microsoft Azure.

تكوين مهمة التدريب وإرسالها

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

الحصول على بيانات التدريب

ستستخدم البيانات من قاعدة بيانات المعهد الوطني المعدل للمعايير والتكنولوجيا (MNIST) من الأرقام المكتوبة بخط اليد. يتم الحصول على هذه البيانات من موقع Yan LeCun على الويب وتخزينها في حساب تخزين Azure.

web_path = "wasbs://datasets@azuremlexamples.blob.core.windows.net/mnist/"

لمزيد من المعلومات حول مجموعة بيانات MNIST، تفضل بزيارة موقع Yan LeCun على الويب.

إعداد البرنامج النصي للتدريب

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

يقوم البرنامج النصي للتدريب المقدم بالآتي:

  • يعالج معالجة البيانات مسبقا، وتقسيم البيانات إلى بيانات اختبار وتدريب؛
  • تدريب نموذج، باستخدام البيانات؛ و
  • إرجاع نموذج الإخراج.

أثناء تشغيل البنية الأساسية لبرنامج ربط العمليات التجارية، ستستخدم MLFlow لتسجيل المعلمات والمقاييس. لمعرفة كيفية تمكين تتبع MLFlow، راجع تعقب تجارب ونماذج التعلم الآلي باستخدام MLflow.

في البرنامج النصي keras_mnist.pyللتدريب ، نقوم بإنشاء شبكة عصبية عميقة بسيطة (DNN). يحتوي DNN هذا على:

  • طبقة إدخال مع 28 * 28 = 784 خلية عصبية. تمثل كل خلية عصبية بكسل صورة.
  • طبقتان مخفيتان. الطبقة المخفية الأولى لديها 300 خلية عصبية والطبقة المخفية الثانية لديها 100 خلية عصبية.
  • طبقة إخراج مع 10 خلايا عصبية. تمثل كل خلية عصبية تسمية مستهدفة من 0 إلى 9.

رسم تخطيطي يوضح شبكة عصبية عميقة مع 784 خلية عصبية في طبقة الإدخال وطبقتين مخفيتين و10 خلايا عصبية في طبقة الإخراج.

بناء وظيفة التدريب

الآن بعد أن أصبح لديك جميع الأصول المطلوبة لتشغيل وظيفتك، حان الوقت لإنشائه باستخدام Azure التعلم الآلي Python SDK v2. على سبيل المثال، سنقوم بإنشاء command.

Azure التعلم الآلي command هو مورد يحدد جميع التفاصيل اللازمة لتنفيذ التعليمات البرمجية للتدريب في السحابة. تتضمن هذه التفاصيل المدخلات والمخرجات، ونوع الأجهزة التي يجب استخدامها، والبرامج المراد تثبيتها، وكيفية تشغيل التعليمات البرمجية الخاصة بك. يحتوي command على معلومات لتنفيذ أمر واحد.

تكوين الأمر

ستستخدم الغرض command العام لتشغيل البرنامج النصي للتدريب وتنفيذ المهام المطلوبة. إنشاء كائن Command لتحديد تفاصيل التكوين لمهمة التدريب الخاصة بك.

from azure.ai.ml import command
from azure.ai.ml import UserIdentityConfiguration
from azure.ai.ml import Input

web_path = "wasbs://datasets@azuremlexamples.blob.core.windows.net/mnist/"

job = command(
    inputs=dict(
        data_folder=Input(type="uri_folder", path=web_path),
        batch_size=50,
        first_layer_neurons=300,
        second_layer_neurons=100,
        learning_rate=0.001,
    ),
    compute=gpu_compute_target,
    environment=f"{job_env.name}:{job_env.version}",
    code="./src/",
    command="python keras_mnist.py --data-folder ${{inputs.data_folder}} --batch-size ${{inputs.batch_size}} --first-layer-neurons ${{inputs.first_layer_neurons}} --second-layer-neurons ${{inputs.second_layer_neurons}} --learning-rate ${{inputs.learning_rate}}",
    experiment_name="keras-dnn-image-classify",
    display_name="keras-classify-mnist-digit-images-with-dnn",
)
  • تتضمن مدخلات هذا الأمر موقع البيانات وحجم الدفعة وعدد الخلايا العصبية في الطبقة الأولى والثانية ومعدل التعلم. لاحظ أننا قمنا بتمرير مسار الويب مباشرة كمدخل.

  • لقيم المعلمة:

    • توفير مجموعة gpu_compute_target = "gpu-cluster" الحوسبة التي قمت بإنشائها لتشغيل هذا الأمر؛
    • توفير البيئة keras-env المخصصة التي قمت بإنشائها لتشغيل مهمة Azure التعلم الآلي؛
    • قم بتكوين إجراء سطر الأوامر نفسه - في هذه الحالة، الأمر هو python keras_mnist.py. يمكنك الوصول إلى المدخلات والمخرجات في الأمر عبر ${{ ... }} تدوين ؛ و
    • تكوين بيانات التعريف مثل اسم العرض واسم التجربة؛ حيث تكون التجربة حاوية لجميع التكرارات التي يقوم بها المرء في مشروع معين. سيتم سرد جميع المهام المرسلة تحت نفس اسم التجربة بجوار بعضها البعض في Azure التعلم الآلي studio.
  • في هذا المثال، ستستخدم UserIdentity لتشغيل الأمر . يعني استخدام هوية المستخدم أن الأمر سيستخدم هويتك لتشغيل المهمة والوصول إلى البيانات من الكائن الثنائي كبير الحجم.

إرسال المهمة

حان الوقت الآن لإرسال المهمة للتشغيل في Azure التعلم الآلي. هذه المرة، ستستخدم create_or_update على ml_client.jobs.

ml_client.jobs.create_or_update(job)

بمجرد الانتهاء، ستقوم الوظيفة بتسجيل نموذج في مساحة العمل الخاصة بك (نتيجة للتدريب) وإخراج ارتباط لعرض المهمة في Azure التعلم الآلي studio.

تحذير

يقوم التعلم الآلي من Microsoft Azure بتشغيل برامج نصية تدريبية من خلال نسخ دليل المصدر بالكامل. إذا كانت لديك بيانات حساسة لا تريد تحميلها، فاستخدم ملف ignore. أو لا تقم بتضمينه في دليل المصدر.

ما يحدث أثناء تنفيذ المهمة

عند تنفيذ المهمة، تمر المراحل التالية:

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

  • التحجيم: يحاول نظام المجموعة زيادة الحجم إذا كان يتطلب عقدا لتنفيذ التشغيل أكثر مما هو متاح حاليا.

  • قيد التشغيل: يتم تحميل جميع البرامج النصية في مجلد البرنامج النصي src إلى هدف الحساب، ويتم تحميل مخازن البيانات أو نسخها، ويتم تنفيذ البرنامج النصي. يتم دفق المخرجات من stdout ومجلد ./logs إلى محفوظات المهمة ويمكن استخدامها لمراقبة المهمة.

ضبط المعلمات الفائقة للنموذج

لقد دربت النموذج بمجموعة واحدة من المعلمات، دعنا نرى الآن ما إذا كان يمكنك تحسين دقة النموذج الخاص بك بشكل أكبر. يمكنك ضبط وتحسين المعلمات الفائقة لنموذجك باستخدام قدرات Azure التعلم الآليsweep.

لضبط المعلمات الفائقة للنموذج، حدد مساحة المعلمة التي يمكن البحث فيها أثناء التدريب. ستقوم بذلك عن طريق استبدال بعض المعلمات (batch_sizeو first_layer_neuronssecond_layer_neuronsو وlearning_rate) التي تم تمريرها إلى مهمة التدريب بمدخلات خاصة من الحزمةazure.ml.sweep.

from azure.ai.ml.sweep import Choice, LogUniform

# we will reuse the command_job created before. we call it as a function so that we can apply inputs
# we do not apply the 'iris_csv' input again -- we will just use what was already defined earlier
job_for_sweep = job(
    batch_size=Choice(values=[25, 50, 100]),
    first_layer_neurons=Choice(values=[10, 50, 200, 300, 500]),
    second_layer_neurons=Choice(values=[10, 50, 200, 500]),
    learning_rate=LogUniform(min_value=-6, max_value=-1),
)

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

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

كما أننا نحدد نهج الإنهاء المبكر - .BanditPolicy يعمل هذا النهج عن طريق التحقق من الوظيفة كل تكرارين. إذا كان المقياس الأساسي، validation_acc، يقع خارج نطاق العشرة بالمائة الأعلى، فسينهي Azure التعلم الآلي المهمة. وهذا يحفظ النموذج من الاستمرار في استكشاف المعلمات الفائقة التي لا تظهر أي وعد بالمساعدة في الوصول إلى المقياس الهدف.

from azure.ai.ml.sweep import BanditPolicy

sweep_job = job_for_sweep.sweep(
    compute=gpu_compute_target,
    sampling_algorithm="random",
    primary_metric="Accuracy",
    goal="Maximize",
    max_total_trials=20,
    max_concurrent_trials=4,
    early_termination_policy=BanditPolicy(slack_factor=0.1, evaluation_interval=2),
)

الآن، يمكنك إرسال هذه المهمة كما كان من قبل. هذه المرة، أنت ستدير مهمة مسح تجتاح عملك بالقطار.

returned_sweep_job = ml_client.create_or_update(sweep_job)

# stream the output and wait until the job is finished
ml_client.jobs.stream(returned_sweep_job.name)

# refresh the latest status of the job after streaming
returned_sweep_job = ml_client.jobs.get(name=returned_sweep_job.name)

يمكنك مراقبة المهمة باستخدام ارتباط واجهة مستخدم الاستوديو الذي يتم تقديمه أثناء تشغيل الوظيفة.

البحث عن أفضل نموذج وتسجيله

بمجرد اكتمال جميع عمليات التشغيل، يمكنك العثور على التشغيل الذي أنتج النموذج بأعلى دقة.

from azure.ai.ml.entities import Model

if returned_sweep_job.status == "Completed":

    # First let us get the run which gave us the best result
    best_run = returned_sweep_job.properties["best_child_run_id"]

    # lets get the model from this run
    model = Model(
        # the script stores the model as "keras_dnn_mnist_model"
        path="azureml://jobs/{}/outputs/artifacts/paths/keras_dnn_mnist_model/".format(
            best_run
        ),
        name="run-model-example",
        description="Model created from run.",
        type="mlflow_model",
    )

else:
    print(
        "Sweep job status: {}. Please wait until it completes".format(
            returned_sweep_job.status
        )
    )

يمكنك بعد ذلك تسجيل هذا النموذج.

registered_model = ml_client.models.create_or_update(model=model)

نشر النموذج كنقطة نهاية عبر الإنترنت

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

لنشر خدمة التعلم الآلي، ستحتاج عادة إلى:

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

لمزيد من المعلومات حول النشر، راجع نشر نموذج التعلم الآلي وتسجيله باستخدام نقطة النهاية المدارة عبر الإنترنت باستخدام Python SDK v2.

إنشاء نقطة نهاية جديدة عبر الإنترنت

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

import uuid

# Creating a unique name for the endpoint
online_endpoint_name = "keras-dnn-endpoint-" + str(uuid.uuid4())[:8]
from azure.ai.ml.entities import (
    ManagedOnlineEndpoint,
    ManagedOnlineDeployment,
    Model,
    Environment,
)

# create an online endpoint
endpoint = ManagedOnlineEndpoint(
    name=online_endpoint_name,
    description="Classify handwritten digits using a deep neural network (DNN) using Keras",
    auth_mode="key",
)

endpoint = ml_client.begin_create_or_update(endpoint).result()

print(f"Endpint {endpoint.name} provisioning state: {endpoint.provisioning_state}")

بمجرد إنشاء نقطة النهاية، يمكنك استردادها كما يلي:

endpoint = ml_client.online_endpoints.get(name=online_endpoint_name)

print(
    f'Endpint "{endpoint.name}" with provisioning state "{endpoint.provisioning_state}" is retrieved'
)

نشر النموذج إلى نقطة النهاية

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

في التعليمات البرمجية التالية، ستقوم بإنشاء نشر واحد يعالج 100٪ من نسبة استخدام الشبكة الواردة. لقد حددنا اسم لون عشوائي (tff-blue) للنشر. يمكنك أيضا استخدام أي اسم آخر مثل tff-green أو tff-red للنشر. تقوم التعليمات البرمجية لنشر النموذج إلى نقطة النهاية ما يلي:

  • نشر أفضل إصدار من النموذج الذي قمت بتسجيله سابقا؛
  • يسجل النموذج، باستخدام score.py الملف؛ و
  • يستخدم البيئة المخصصة (التي قمت بإنشائها سابقا) لإجراء الاستدلال.
from azure.ai.ml.entities import ManagedOnlineDeployment, CodeConfiguration

model = registered_model

# create an online deployment.
blue_deployment = ManagedOnlineDeployment(
    name="keras-blue-deployment",
    endpoint_name=online_endpoint_name,
    model=model,
    # code_configuration=CodeConfiguration(code="./src", scoring_script="score.py"),
    instance_type="Standard_DS3_v2",
    instance_count=1,
)

blue_deployment = ml_client.begin_create_or_update(blue_deployment).result()

إشعار

توقع أن يستغرق هذا النشر بعض الوقت للانتهاء.

اختبار النموذج المنشور

الآن بعد أن قمت بنشر النموذج إلى نقطة النهاية، يمكنك التنبؤ بمخرجات النموذج المنشور، باستخدام invoke الأسلوب على نقطة النهاية.

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

import urllib.request

data_folder = os.path.join(os.getcwd(), "data")
os.makedirs(data_folder, exist_ok=True)

urllib.request.urlretrieve(
    "https://azureopendatastorage.blob.core.windows.net/mnist/t10k-images-idx3-ubyte.gz",
    filename=os.path.join(data_folder, "t10k-images-idx3-ubyte.gz"),
)
urllib.request.urlretrieve(
    "https://azureopendatastorage.blob.core.windows.net/mnist/t10k-labels-idx1-ubyte.gz",
    filename=os.path.join(data_folder, "t10k-labels-idx1-ubyte.gz"),
)

قم بتحميلها في مجموعة بيانات اختبار.

from src.utils import load_data

X_test = load_data(os.path.join(data_folder, "t10k-images-idx3-ubyte.gz"), False)
y_test = load_data(
    os.path.join(data_folder, "t10k-labels-idx1-ubyte.gz"), True
).reshape(-1)

اختر 30 عينة عشوائية من مجموعة الاختبار واكتبها في ملف JSON.

import json
import numpy as np

# find 30 random samples from test set
n = 30
sample_indices = np.random.permutation(X_test.shape[0])[0:n]

test_samples = json.dumps({"input_data": X_test[sample_indices].tolist()})
# test_samples = bytes(test_samples, encoding='utf8')

with open("request.json", "w") as outfile:
    outfile.write(test_samples)

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

import matplotlib.pyplot as plt

# predict using the deployed model
result = ml_client.online_endpoints.invoke(
    endpoint_name=online_endpoint_name,
    request_file="./request.json",
    deployment_name="keras-blue-deployment",
)

# compare actual value vs. the predicted values:
i = 0
plt.figure(figsize=(20, 1))

for s in sample_indices:
    plt.subplot(1, n, i + 1)
    plt.axhline("")
    plt.axvline("")

    # use different color for misclassified sample
    font_color = "red" if y_test[s] != result[i] else "black"
    clr_map = plt.cm.gray if y_test[s] != result[i] else plt.cm.Greys

    plt.text(x=10, y=-10, s=result[i], fontsize=18, color=font_color)
    plt.imshow(X_test[s].reshape(28, 28), cmap=clr_map)

    i = i + 1
plt.show()

إشعار

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

تنظيف الموارد

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

ml_client.online_endpoints.begin_delete(name=online_endpoint_name)

إشعار

توقع أن تستغرق عملية التنظيف هذه بعض الوقت للانتهاء.

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

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