كيفية نشر نموذج R مسجل إلى نقطة نهاية عبر الإنترنت (في الوقت الحقيقي)

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

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

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

إنشاء مجلد بهذه البنية

أنشئ بنية المجلد هذه لمشروعك:

📂 r-deploy-azureml
 ├─📂 docker-context
 │  ├─ Dockerfile
 │  └─ start_plumber.R
 ├─📂 src
 │  └─ plumber.R
 ├─ deployment.yml
 ├─ endpoint.yml

يتم عرض محتويات كل ملف من هذه الملفات وشرحها في هذه المقالة.

Dockerfile

هذا هو الملف الذي يعرف بيئة الحاوية. ستحدد أيضا تثبيت أي حزم R إضافية هنا.

سيبدو نموذج Dockerfile كما يلي:

# REQUIRED: Begin with the latest R container with plumber
FROM rstudio/plumber:latest

# REQUIRED: Install carrier package to be able to use the crated model (whether from a training job
# or uploaded)
RUN R -e "install.packages('carrier', dependencies = TRUE, repos = 'https://cloud.r-project.org/')"

# OPTIONAL: Install any additional R packages you may need for your model crate to run
RUN R -e "install.packages('<PACKAGE-NAME>', dependencies = TRUE, repos = 'https://cloud.r-project.org/')"
RUN R -e "install.packages('<PACKAGE-NAME>', dependencies = TRUE, repos = 'https://cloud.r-project.org/')"

# REQUIRED
ENTRYPOINT []

COPY ./start_plumber.R /tmp/start_plumber.R 

CMD ["Rscript", "/tmp/start_plumber.R"]

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

سباك. R

هام

يوضح هذا القسم كيفية هيكلة السباك. R script. للحصول على معلومات مفصلة حول الحزمة plumber ، راجع plumber الوثائق .

سباك الملفات . R هو البرنامج النصي R حيث ستقوم بتعريف الدالة لتسجيل النقاط. يقوم هذا البرنامج النصي أيضا بتنفيذ المهام الضرورية لجعل نقطة النهاية تعمل. بيان النص:

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

تلميح

تأكد من أن أيا كانت وظيفة التسجيل التي تنتجها يمكن تحويلها مرة أخرى إلى JSON. لا يتم تحويل بعض كائنات R بسهولة.

# plumber.R
# This script will be deployed to a managed endpoint to do the model scoring

# REQUIRED
# When you deploy a model as an online endpoint, Azure Machine Learning mounts your model
# to your endpoint. Model mounting enables you to deploy new versions of the model without
# having to create a new Docker image.

model_dir <- Sys.getenv("AZUREML_MODEL_DIR")

# REQUIRED
# This reads the serialized model with its respecive predict/score method you 
# registered. The loaded load_model object is a raw binary object.
load_model <- readRDS(paste0(model_dir, "/models/crate.bin"))

# REQUIRED
# You have to unserialize the load_model object to make it its function
scoring_function <- unserialize(load_model)

# REQUIRED
# << Readiness route vs. liveness route >>
# An HTTP server defines paths for both liveness and readiness. A liveness route is used to
# check whether the server is running. A readiness route is used to check whether the 
# server's ready to do work. In machine learning inference, a server could respond 200 OK 
# to a liveness request before loading a model. The server could respond 200 OK to a
# readiness request only after the model has been loaded into memory.

#* Liveness check
#* @get /live
function() {
  "alive"
}

#* Readiness check
#* @get /ready
function() {
  "ready"
}

# << The scoring function >>
# This is the function that is deployed as a web API that will score the model
# Make sure that whatever you are producing as a score can be converted 
# to JSON to be sent back as the API response
# in the example here, forecast_horizon (the number of time units to forecast) is the input to scoring_function.  
# the output is a tibble
# we are converting some of the output types so they work in JSON


#* @param forecast_horizon 
#* @post /score
function(forecast_horizon) {
  scoring_function(as.numeric(forecast_horizon)) |> 
    tibble::as_tibble() |> 
    dplyr::transmute(period = as.character(yr_wk),
                     dist = as.character(logmove),
                     forecast = .mean) |> 
    jsonlite::toJSON()
}

start_plumber. R

start_plumber الملف . R هو البرنامج النصي R الذي يتم تشغيله عند بدء تشغيل الحاوية، ويستدعي السباك الخاص بك . R script. استخدم البرنامج النصي التالي كما هو.

entry_script_path <- paste0(Sys.getenv('AML_APP_ROOT'),'/', Sys.getenv('AZUREML_ENTRY_SCRIPT'))

pr <- plumber::plumb(entry_script_path)

args <- list(host = '0.0.0.0', port = 8000); 

if (packageVersion('plumber') >= '1.0.0') {
  pr$setDocs(TRUE)
} else { 
  args$swagger <- TRUE 
} 

do.call(pr$run, args)

إنشاء حاوية

تفترض هذه الخطوات أن لديك Azure Container Registry مقترنا بمساحة العمل الخاصة بك، والتي يتم إنشاؤها عند إنشاء بيئتك المخصصة الأولى. لمعرفة ما إذا كانت لديك بيئة مخصصة:

  1. سجل الدخول إلى Azure Machine Learning Studio.
  2. حدد مساحة العمل إذا لزم الأمر.
  3. في جزء التنقل الأيمن، حدد Environments.
  4. في الجزء العلوي، حدد Custom environments.
  5. إذا رأيت بيئات مخصصة، فلا حاجة إلى المزيد.
  6. إذا لم تشاهد أي بيئات مخصصة، فبادر بإنشاء بيئة R أو أي بيئة مخصصة أخرى. (لن تستخدم هذه البيئة للنشر، ولكن ستستخدم سجل الحاوية الذي تم إنشاؤه أيضا لك.)

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

  1. افتح نافذة طرفية وسجل الدخول إلى Azure. إذا كنت تقوم بذلك من مثيل حساب Azure التعلم الآلي، فاستخدم:

    az login --identity
    

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

  2. تأكد من أن لديك أحدث إصدارات CLI والملحق ml :

    az upgrade
    
  3. إذا كان لديك اشتراكات Azure متعددة، فقم بتعيين الاشتراك النشط إلى الاشتراك الذي تستخدمه لمساحة العمل الخاصة بك. (يمكنك تخطي هذه الخطوة إذا كان لديك حق الوصول إلى اشتراك واحد فقط.) استبدل <SUBSCRIPTION-NAME> باسم اشتراكك. قم أيضا بإزالة الأقواس <>.

    az account set --subscription "<SUBSCRIPTION-NAME>"
    
  4. تعيين مساحة العمل الافتراضية. إذا كنت تقوم بذلك من مثيل حساب، يمكنك استخدام الأمر التالي كما هو. إذا كنت تستخدم أي كمبيوتر آخر، فاستبدل مجموعة الموارد واسم مساحة العمل بدلا من ذلك. (يمكنك العثور على هذه القيم في Azure التعلم الآلي studio.)

    az configure --defaults group=$CI_RESOURCE_GROUP workspace=$CI_WORKSPACE
    
  5. تأكد من أنك في دليل المشروع الخاص بك.

    cd r-deploy-azureml
    
  6. لإنشاء الصورة في السحابة، قم بتنفيذ أوامر bash التالية في المحطة الطرفية الخاصة بك. استبدل <IMAGE-NAME> بالاسم الذي تريد إعطاء الصورة.

    إذا كانت مساحة العمل الخاصة بك في شبكة ظاهرية، فشاهد تمكين Azure Container Registry (ACR) للحصول على خطوات إضافية لإضافتها --image-build-compute إلى az acr build الأمر في السطر الأخير من هذه التعليمة البرمجية.

    WORKSPACE=$(az config get --query "defaults[?name == 'workspace'].value" -o tsv)
    ACR_NAME=$(az ml workspace show -n $WORKSPACE --query container_registry -o tsv | cut -d'/' -f9-)
    IMAGE_TAG=${ACR_NAME}.azurecr.io/<IMAGE-NAME>
    
    az acr build ./docker-context -t $IMAGE_TAG -r $ACR_NAME
    

هام

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

az acr سيقوم الأمر تلقائيا بتحميل مجلد docker-context - الذي يحتوي على البيانات الاصطناعية لإنشاء الصورة - إلى السحابة حيث سيتم إنشاء الصورة واستضافتها في Azure Container Registry.

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

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

نقطة النهاية هي نقطة نهاية HTTPS يمكن للعملاء - مثل التطبيق - استدعائها لتلقي إخراج تسجيل النقاط لنموذج مدرب. وهو يوفر:

  • المصادقة باستخدام المصادقة المستندة إلى "المفتاح والرمز المميز"
  • إنهاء SSL
  • URI تسجيل ثابت (endpoint-name.region.inference.ml.Azure.com)

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

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

  1. في دليل المشروع، أضف ملف endpoint.yml مع التعليمات البرمجية التالية. استبدل <ENDPOINT-NAME> بالاسم الذي تريد منحه نقطة النهاية المدارة.

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: <ENDPOINT-NAME>
    auth_mode: aml_token
    
  2. باستخدام نفس المحطة الطرفية حيث قمت بإنشاء الصورة، قم بتنفيذ أمر CLI التالي لإنشاء نقطة نهاية:

    az ml online-endpoint create -f endpoint.yml
    
  3. اترك المحطة الطرفية مفتوحة لمتابعة استخدامها في القسم التالي.

قم بإنشاء توزيع

  1. لإنشاء النشر الخاص بك، أضف التعليمات البرمجية التالية إلى ملف deployment.yml .

    • استبدل <ENDPOINT-NAME> باسم نقطة النهاية الذي قمت بتعريفه في ملف endpoint.yml

    • استبدل <DEPLOYMENT-NAME> بالاسم الذي تريد منحه النشر

    • استبدل <MODEL-URI> ب URI الخاص بالنموذج المسجل في شكل azureml:modelname@latest

    • استبدل <IMAGE-TAG> بالقيمة من:

      echo $IMAGE_TAG
      
    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: <DEPLOYMENT-NAME>
    endpoint_name: <ENDPOINT-NAME>
    code_configuration:
      code: ./src
      scoring_script: plumber.R
    model: <MODEL-URI>
    environment:
      image: <IMAGE-TAG>
      inference_config:
        liveness_route:
          port: 8000
          path: /live
        readiness_route:
          port: 8000
          path: /ready
        scoring_route:
          port: 8000
          path: /score
    instance_type: Standard_DS2_v2
    instance_count: 1
    
  2. بعد ذلك، في المحطة الطرفية الخاصة بك قم بتنفيذ أمر CLI التالي لإنشاء النشر (لاحظ أنك تقوم بتعيين 100٪ من نسبة استخدام الشبكة إلى هذا النموذج):

    az ml online-deployment create -f deployment.yml --all-traffic --skip-script-validation
    

إشعار

قد يستغرق نشر الخدمة عدة دقائق. انتظر حتى يتم الانتهاء من النشر قبل المتابعة إلى القسم التالي.

اختبار

بمجرد إنشاء النشر بنجاح، يمكنك اختبار نقطة النهاية باستخدام studio أو CLI:

انتقل إلى Azure التعلم الآلي studio وحدد من نقاط النهاية القائمة اليسرى. بعد ذلك، حدد r-endpoint-iris الذي أنشأته سابقا.

أدخل json التالي في مربع نص Input data to rest real-time endpoint :

{
    "forecast_horizon" : [2]
}

حدد اختبار. ينبغي أن تشاهد المخرج التالي:

Screenshot shows results from testing a model.

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

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

az ml online-endpoint delete --name r-endpoint-forecast

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

لمزيد من المعلومات حول استخدام R مع Azure التعلم الآلي، راجع نظرة عامة على قدرات R في Azure التعلم الآلي