كيفية حزم نموذج مسجل مع Docker

توضح هذه المقالة كيفية حزم نموذج مسجل للتعلم الآلي من Azure باستخدام Docker.

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

تفترض هذه المقالة أنك قمت بالفعل بتدريب نموذج وتسجيله في مساحة عمل التعلم الآلي. لمعرفة كيفية تدريب وتسجيل نموذج scikit-learn، اتبع هذا البرنامج التعليمي.

نماذج الحزمة

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

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

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

إنشاء Dockerfile: قم بتنزيل Dockerfile والنموذج والبرنامج النصي للإدراج والأصول الأخرى اللازمة لإنشاء صورة Docker. يمكنك بعد ذلك فحص الملفات أو إجراء تغييرات قبل إنشاء الصورة محلياً.

يمكن استخدام كلتا الحزمتين للحصول على صورة Docker محلية.

تلميح

يتشابه إنشاء الحزمة مع توزيع النموذج. يمكنك استخدام نموذج مسجل وتكوين استدلال.

هام

لتنزيل صورة تم إنشاؤها بالكامل أو إنشاء صورة محلياً، تحتاج إلى تثبيت Docker في بيئة التطوير لديك.

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

ينشئ المثال التالي صورة مسجلة في سجل حاوية Azure لمساحة العمل لديك:

package = Model.package(ws, [model], inference_config)
package.wait_for_creation(show_output=True)

بعد إنشاء حزمة، يمكنك استخدام package.pull() لسحب الصورة إلى بيئة Docker المحلية. سيعرض إخراج هذا الأمر اسم الصورة. على سبيل المثال:

Status: Downloaded newer image for myworkspacef78fd10.azurecr.io/package:20190822181338.

بعد تنزيل النموذج، استخدم الأمر docker images لسرد الصور المحلية:

REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
myworkspacef78fd10.azurecr.io/package    20190822181338      7ff48015d5bd        4 minutes ago       1.43 GB

لبدء حاوية محلية استناداً إلى هذه الصورة، استخدم الأمر التالي لبدء حاوية مسماة من shell أو سطر الأوامر. استبدل القيمة <imageid> بمعرف الصورة الذي تم إرجاعه بواسطة الأمر docker images.

docker run -p 6789:5001 --name mycontainer <imageid>

يبدأ هذا الأمر أحدث إصدار من الصورة المسماة myimage. يقوم بتعيين المنفذ المحلي 6789 إلى المنفذ في الحاوية التي تستمع إليها خدمة الويب (5001). كما أنه يعين الاسم mycontainer إلى الحاوية، ما يجعل الحاوية أسهل في الإيقاف. بعد بدء تشغيل الحاوية، يمكنك إرسال الطلبات إلى http://localhost:6789/score.

إنشاء Dockerfile والتبعيات

يوضح المثال التالي كيفية تنزيل Dockerfile والنموذج والأصول الأخرى اللازمة لإنشاء صورة محلياً. تشير المعلمة generate_dockerfile=True إلى أنك تريد الملفات، وليس صورة تم إنشاؤها بالكامل.

package = Model.package(ws, [model], inference_config, generate_dockerfile=True)
package.wait_for_creation(show_output=True)
# Download the package.
package.save("./imagefiles")
# Get the Azure container registry that the model/Dockerfile uses.
acr=package.get_container_registry()
print("Address:", acr.address)
print("Username:", acr.username)
print("Password:", acr.password)

تقوم هذه التعليمة البرمجية بتنزيل الملفات اللازمة لإنشاء الصورة إلى الدليل imagefiles. يشير Dockerfile المضمن في الملفات المحفوظة إلى صورة أساسية مخزنة في سجل حاوية Azure. عند إنشاء الصورة على تثبيت Docker المحلي، تحتاج إلى استخدام العنوان واسم المستخدم وكلمة المرور للمصادقة على السجل. استخدم الخطوات التالية لإنشاء الصورة باستخدام تثبيت Docker محلي:

  1. من shell أو جلسة سطر الأوامر، استخدم الأمر التالي لمصادقة Docker مع سجل حاوية Azure. استبدل <address> و<username> و<password> بالقيم التي تم استردادها بواسطة package.get_container_registry().

    docker login <address> -u <username> -p <password>
    
  2. لإنشاء الصورة، استخدم الأمر التالي. استبدل <imagefiles> بمسار الدليل، حيثما حفظ package.save() الملفات.

    docker build --tag myimage <imagefiles>
    

    يعين هذا الأمر اسم الصورة إلى myimage.

للتحقق من إنشاء الصورة، استخدم الأمر docker images. يجب أن تشاهد الصورة myimage في القائمة:

REPOSITORY      TAG                 IMAGE ID            CREATED             SIZE
<none>          <none>              2d5ee0bf3b3b        49 seconds ago      1.43 GB
myimage         latest              739f22498d64        3 minutes ago       1.43 GB

لبدء حاوية جديدة استناداً إلى هذه الصورة، استخدم الأمر التالي:

docker run -p 6789:5001 --name mycontainer myimage:latest

يبدأ هذا الأمر أحدث إصدار من الصورة المسماة myimage. يقوم بتعيين المنفذ المحلي 6789 إلى المنفذ في الحاوية التي تستمع إليها خدمة الويب (5001). كما أنه يعين الاسم mycontainer إلى الحاوية، ما يجعل الحاوية أسهل في الإيقاف. بعد بدء تشغيل الحاوية، يمكنك إرسال الطلبات إلى http://localhost:6789/score.

مثال العميل لاختبار الحاوية المحلية

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

import requests
import json

# URL for the web service.
scoring_uri = 'http://localhost:6789/score'

# Two sets of data to score, so we get two results back.
data = {"data":
        [
            [ 1,2,3,4,5,6,7,8,9,10 ],
            [ 10,9,8,7,6,5,4,3,2,1 ]
        ]
        }
# Convert to JSON string.
input_data = json.dumps(data)

# Set the content type.
headers = {'Content-Type': 'application/json'}

# Make the request and display the response.
resp = requests.post(scoring_uri, input_data, headers=headers)
print(resp.text)

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

إيقاف حاوية Docker

لإيقاف الحاوية، استخدم الأمر التالي من shell أو سطر أوامر مختلفاً:

docker kill mycontainer

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