البرنامج التعليمي: تدريب وتوزيع نموذج تصنيف الصور باستخدام مثال Jupyter Notebook

ينطبق على: Python SDK azureml v1

في هذا البرنامج التعليمي، يمكنك تدريب نموذج تعلم آلي على موارد الحساب عن بعد. يمكنك استخدام سير عمل التدريب والتوزيع ل Azure التعلم الآلي في دفتر ملاحظات Python Jupyter. يمكنك، بعد ذلك، استخدام دفتر الملاحظات كقالب لتدريب نموذج التعلم الآلي الخاص بك ببياناتك الخاصة.

يدرب هذا البرنامج التعليمي انحداراً لوجستياً بسيطاً باستخدام مجموعة بيانات MNIST وscikit-learn مع Azure Machine Learning. MNIST هي مجموعة بيانات شائعة تتكون من 70000 صورة ذات تدرج رمادي. كل صورة هي رقم مكتوب بخط اليد 28 × 28 بكسل، ممثلاً رقماً من صفر إلى تسعة. الهدف هو إنشاء مصنِّف متعدد الفئات لتحديد الرقم الذي تمثله صورة معينة.

تعرف على كيفية اتخاذ الإجراءات التالية:

  • قم بتنزيل مجموعة بيانات وإلقاء نظرة على البيانات.
  • تدريب نموذج تصنيف الصورة وتسجيل القياسات باستخدام MLflow.
  • وزع النموذج للقيام بالاستدلال في الوقت الفعلي.

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

تشغيل دفتر ملاحظات من مساحة العمل

يتضمن Azure التعلم الآلي خادم دفتر ملاحظات سحابي في مساحة العمل للحصول على تجربة خالية من التثبيت ومكونة مسبقا. استخدم بيئتك الخاصة إذا كنت تفضل التحكم في البيئة والحزم والتبعيات.

استنساخ مجلد دفتر ملاحظات

أكمل إعداد التجربة التالي، ثم شغِّل الخطوات في Azure Machine Learning Studio. تتضمن هذه الواجهة الموحدة أدوات التعلم الآلي لتنفيذ سيناريوهات علوم البيانات لممارسي علوم البيانات من جميع المستويات المهارية.

  1. سجل الدخول إلى Azure Machine Learning Studio.

  2. حدد اشتراكك ومساحة العمل التي قمت بإنشائها.

  3. على اليسار، حدد ⁧Notebooks⁩.

  4. في الجزء العلوي، حدد علامة تبويب Samples.

  5. افتح مجلد SDK v1 .

  6. حدد الزر ... على يمين مجلد البرامج التعليمية، ثم حدد Clone.

    لقطة شاشة تعرض استنساخ مجلد البرامج التعليمية.

  7. تعرض قائمة المجلدات كل مستخدم يصل إلى مساحة العمل. حدد المجلد الخاص بك لاستنساخ مجلد البرامج التعليمية هناك.

فتح دفتر الملاحظات المستنسخ

  1. افتح مجلد البرامج التعليمية التي تم استنساخه في قسم User Files.

  2. حدد ملف quickstart-azureml-in-10mins.ipynb من مجلد tutorials/compute-instance-quickstarts/quickstart-azureml-in-10mins.

    Screenshot shows the Open tutorials folder.

تثبيت الحزم

بمجرد تشغيل مثيل الحساب وظهور النواة، أضف خلية تعليمات برمجية جديدة لتثبيت الحزم المطلوبة لهذا البرنامج التعليمي.

  1. في أعلى دفتر الملاحظات، أضف خلية تعليمات برمجية. Screenshot of add code cell for notebook.

  2. أضف ما يلي إلى الخلية ثم قم بتشغيل الخلية، إما باستخدام أداة Run أو باستخدام Shift+Enter.

    %pip install scikit-learn==0.22.1
    %pip install scipy==1.5.2
    

قد ترى بعض تحذيرات التثبيت. يمكن تجاهل هذه بأمان.

قم بتشغيل دفتر الملاحظات

يتوفر هذا البرنامج التعليمي وملف utils.py المصاحب أيضاً على GitHub إذا كنت ترغب في استخدامه في بيئتك المحلية. إذا كنت لا تستخدم مثيل الحساب، أضف %pip install azureml-sdk[notebooks] azureml-opendatasets matplotlib إلى التثبيت أعلاه.

هام

يحتوي باقي المقال على المحتوى نفسه كما ترى في دفتر الملاحظات.

قم بالتبديل إلى Jupyter Notebook الآن إذا كنت تريد تشغيل التعليمة البرمجية أثناء القراءة. لتشغيل خلية تعليمات برمجية واحدة في دفتر الملاحظات، فانقر خلية التعليمات البرمجية واضغط على Shift+Enter. أو، شغل دفتر الملاحظات بالكامل باختيارتشغيل الكل من شريط الأدوات العلوي.

استيراد البيانات

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

  • تنزيل مجموعة بيانات MNIST
  • عرض بعض عينات الصور

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

import os
from azureml.opendatasets import MNIST

data_folder = os.path.join(os.getcwd(), "/tmp/qs_data")
os.makedirs(data_folder, exist_ok=True)

mnist_file_dataset = MNIST.get_file_dataset()
mnist_file_dataset.download(data_folder, overwrite=True)

ألقِ نظرة على البيانات

حمِّل الملفات المضغوطة في صفائف numpy. ثم استخدم matplotlib لرسم 30 صورة عشوائية من مجموعة البيانات مع وجود تسمياتها فوقها.

لاحظ أن هذه الخطوة تتطلب دالة load_data ، مضمنة utils.py في ملف. يتم وضع هذا الملف في نفس المجلد مثل دفتر الملاحظات هذا. تحلل دالة load_data ببساطة الملفات المضغوطة في صفائف numpy.

from utils import load_data
import matplotlib.pyplot as plt
import numpy as np
import glob


# note we also shrink the intensity values (X) from 0-255 to 0-1. This helps the model converge faster.
X_train = (
    load_data(
        glob.glob(
            os.path.join(data_folder, "**/train-images-idx3-ubyte.gz"), recursive=True
        )[0],
        False,
    )
    / 255.0
)
X_test = (
    load_data(
        glob.glob(
            os.path.join(data_folder, "**/t10k-images-idx3-ubyte.gz"), recursive=True
        )[0],
        False,
    )
    / 255.0
)
y_train = load_data(
    glob.glob(
        os.path.join(data_folder, "**/train-labels-idx1-ubyte.gz"), recursive=True
    )[0],
    True,
).reshape(-1)
y_test = load_data(
    glob.glob(
        os.path.join(data_folder, "**/t10k-labels-idx1-ubyte.gz"), recursive=True
    )[0],
    True,
).reshape(-1)


# now let's show some randomly chosen images from the traininng set.
count = 0
sample_size = 30
plt.figure(figsize=(16, 6))
for i in np.random.permutation(X_train.shape[0])[:sample_size]:
    count = count + 1
    plt.subplot(1, sample_size, count)
    plt.axhline("")
    plt.axvline("")
    plt.text(x=10, y=-10, s=y_train[i], fontsize=18)
    plt.imshow(X_train[i].reshape(28, 28), cmap=plt.cm.Greys)
plt.show()

تعرض التعليمات البرمجية مجموعة عشوائية من الصور مع تسمياتها، على غرار هذا:

Sample images with their labels.

نموذج تدريب وتسجيل القياسات مع MLflow

تدريب النموذج باستخدام التعليمات البرمجية التالية. تستخدم هذه التعليمة البرمجية التسجيل التلقائي ل MLflow لتعقب المقاييس وبيانات نموذج السجل.

ستستخدم المصنف LogisticRegression من إطار عمل SciKit Learn لتصنيف البيانات.

إشعار

يستغرق تدريب النموذج حوالي دقيقتين لإكماله.

# create the model
import mlflow
import numpy as np
from sklearn.linear_model import LogisticRegression
from azureml.core import Workspace

# connect to your workspace
ws = Workspace.from_config()

# create experiment and start logging to a new run in the experiment
experiment_name = "azure-ml-in10-mins-tutorial"

# set up MLflow to track the metrics
mlflow.set_tracking_uri(ws.get_mlflow_tracking_uri())
mlflow.set_experiment(experiment_name)
mlflow.autolog()

# set up the Logistic regression model
reg = 0.5
clf = LogisticRegression(
    C=1.0 / reg, solver="liblinear", multi_class="auto", random_state=42
)

# train the model
with mlflow.start_run() as run:
    clf.fit(X_train, y_train)

عرض التجربة

في القائمة اليسرى في استوديو التعلم الآلي من Microsoft Azure حدّد "Jobs" ثم حدّد تجربتك (azure-ml-in10-mins-tutorial). تتولى الوظيفة تجميع العديد من عمليات التشغيل من برنامج نصي محدد أو جزء من تعليمة برمجية. يمكن تجميع وظائف متعددة معًا كتجربة.

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

الإصدار يتحكم في النماذج الخاصة بك مع نموذج التسجيل

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

# register the model
model_uri = "runs:/{}/model".format(run.info.run_id)
model = mlflow.register_model(model_uri, "sklearn_mnist_model")

توزيع النموذج للاستدلال في الوقت الفعلي

في هذا القسم، تعرف على كيفية نشر نموذج بحيث يمكن للتطبيق أن يستهلك (الاستدلال) النموذج عبر REST.

إنشاء تكوين التوزيع

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

# create environment for the deploy
from azureml.core.environment import Environment
from azureml.core.conda_dependencies import CondaDependencies
from azureml.core.webservice import AciWebservice

# get a curated environment
env = Environment.get(
    workspace=ws, 
    name="AzureML-sklearn-1.0"
)
env.inferencing_stack_version='latest'

# create deployment config i.e. compute resources
aciconfig = AciWebservice.deploy_configuration(
    cpu_cores=1,
    memory_gb=1,
    tags={"data": "MNIST", "method": "sklearn"},
    description="Predict MNIST with sklearn",
)

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

توزع خلية التعليمة البرمجية التالية النموذج إلى Azure Container Instance.

إشعار

يستغرق النشر حوالي 3 دقائق لإكماله. ولكن قد يكون أطول إلى حتى يكون متاحا للاستخدام، ربما ما دام 15 دقيقة.**

%%time
import uuid
from azureml.core.model import InferenceConfig
from azureml.core.environment import Environment
from azureml.core.model import Model

# get the registered model
model = Model(ws, "sklearn_mnist_model")

# create an inference config i.e. the scoring script and environment
inference_config = InferenceConfig(entry_script="score.py", environment=env)

# deploy the service
service_name = "sklearn-mnist-svc-" + str(uuid.uuid4())[:4]
service = Model.deploy(
    workspace=ws,
    name=service_name,
    models=[model],
    inference_config=inference_config,
    deployment_config=aciconfig,
)

service.wait_for_deployment(show_output=True)

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

  1. وظيفة init يتم تنفيذها مرة واحدة عند بدء الخدمة - في هذه الوظيفة تحصل عادةً على النموذج من السجل وتعيين المتغيرات العامة
  2. وظيفة run(data) يتم تنفيذها في كل مرة يتم فيها إجراء مكالمة بالخدمة. في هذه الوظيفة، تقوم عادةً بتنسيق بيانات الإدخال وتشغيل التنبؤ وإخراج النتيجة المتوقعة.

عرض نقطة النهاية

بمجرد نشر النموذج بنجاح، يمكنك عرض نقطة النهاية بالانتقال إلى نقاط النهاية في القائمة اليسرى في Azure التعلم الآلي studio. سترى حالة نقطة النهاية (صحية/غير صحية) والسجلات والاستهلاك (كيف يمكن للتطبيقات استهلاك النموذج).

اختبار الخدمة النموذجية

يمكنك اختبار النموذج عن طريق إرسال طلب HTTP خام لاختبار خدمة الويب.

# send raw HTTP request to test the web service.
import requests

# send a random row from the test set to score
random_index = np.random.randint(0, len(X_test) - 1)
input_data = '{"data": [' + str(list(X_test[random_index])) + "]}"

headers = {"Content-Type": "application/json"}

resp = requests.post(service.scoring_uri, input_data, headers=headers)

print("POST to url", service.scoring_uri)
print("label:", y_test[random_index])
print("prediction:", resp.text)

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

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

# if you want to keep workspace and only delete endpoint (it will incur cost while running)
service.delete()

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

حذف كل شيء

استخدم هذه الخطوات لحذف مساحة عمل التعلم الآلي من Microsoft Azure وجميع موارد الحساب.

هام

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

إذا كنت لا تخطط لاستخدام الموارد التي أنشأتها، فاحذفها، حتى لا تتحمل أي رسوم:

  1. من مدخل Microsoft Azure، حدد Resource groups من أقصى الجانب الأيمن.

  2. من القائمة، حدد مجموعة الموارد التي أنشأتها.

  3. حدد Delete resource group.

    لقطة شاشة للتحديدات لحذف مجموعة موارد في مدخل Microsoft Azure.

  4. أدخل اسم مجموعة الموارد. ثم حدد حذف.