انتقل إلى المحتوى الرئيسي

الوحدة 8 — نقاط النهاية المتّصلة وبالدفعات

النموذج المسجَّل في الوحدة 7 لا ينفع أحدًا وهو في السجلّ. الوحدة الحالية تُخرجه إلى العالم عبر نقاط النهاية، بنمطين متكاملَين: متّصل للطلبات الحيّة، وبالدفعات للحساب على ملايين السطور.

نمطا النشر

النمطالحالة الطبيعيةزمن الاستجابةالتكلفة
نقطة نهاية متّصلةتنبّؤ في تدفّق تطبيق حيّمن مللي ثانية إلى ثانيةحوسبة تعمل دائمًا
نقطة نهاية بالدفعاتتنبّؤات ليلية على ملايين السطورمن دقائق إلى ساعاتحوسبة تُستدعى عند الطلب

لسلسلة متاجرنا، النمطان يتعايشان:

  • بالدفعات أسبوعيًّا لإنتاج التنبّؤات للأربعة أسابيع القادمة على 100 ألف زوج متجر/منتج.
  • متّصل كخدمة لموقع الشركة الداخلي حين يريد مدير متجر تنبّؤًا فوريًّا لمنتج جديد.

نقطة النهاية المتّصلة المُدارة

Managed Online Endpoint يعني أنّ Azure يُديّر الخوادم لك. عليك فقط أن تصف: أيّ نموذج، أيّ حجم عقد، وأيّ بيئة.

# endpoints/online-endpoint.yml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
name: demand-forecast-online
auth_mode: key

الإنشاء:

az ml online-endpoint create --file endpoints/online-endpoint.yml

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

# endpoints/deployment-blue.yml
$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: blue
endpoint_name: demand-forecast-online
model: azureml:demand-forecast:12
instance_type: Standard_DS3_v2
instance_count: 2
az ml online-deployment create --file endpoints/deployment-blue.yml --all-traffic

--all-traffic يُوجّه 100% من الحركة إلى هذا النشر.

تقسيم الحركة (Traffic Split)

القوّة الحقيقية للنقطة المتّصلة المُدارة تظهر عند نشر نسخة جديدة. تنشئ نشرًا ثانيًا green مع النموذج الجديد، لكن دون أن تُحوّل الحركة إليه فورًا:

az ml online-deployment create --file endpoints/deployment-green.yml

ثمّ توجّه 10% من الحركة الحقيقية إليه لمشاهدة سلوكه:

az ml online-endpoint update \
--name demand-forecast-online \
--traffic "blue=90 green=10"

بعد يوم من الرصد على أخطاء 500 وزمن الاستجابة والدقّة (عبر تسجيل الإدخال والإخراج)، تنتقل تدريجيًّا:

az ml online-endpoint update --traffic "blue=50 green=50"
# ثمّ يوم آخر
az ml online-endpoint update --traffic "blue=0 green=100"
# ثمّ تحذف النشر الأزرق
az ml online-deployment delete --name blue --endpoint demand-forecast-online

هذا النشر الأزرق/الأخضر يقلّل خطر النشر السيّئ من كارثة تطال جميع المستخدمين إلى مشكلة تطال 10% منهم فقط، وتُتراجَع عنها بأمر واحد.

شفرة التسجيل (score.py)

النموذج بصيغة MLflow لا يحتاج score.py. Azure ML يبني الخادم آليًّا. لكن لو استعملت custom_model أو أردت تحكّمًا خاصًّا (تحويل بيانات دخول مركّب، تسجيل خاصّ، ذاكرة تخزين مؤقّت)، تكتب:

# src/score.py
import os
import json
import joblib
import numpy as np

def init():
global model
model_dir = os.getenv("AZUREML_MODEL_DIR")
model = joblib.load(os.path.join(model_dir, "model.pkl"))

def run(raw_data: str) -> list:
data = json.loads(raw_data)["data"]
X = np.array(data)
preds = model.predict(X)
return preds.tolist()
  • init() يعمل مرّة واحدة عند بدء العقدة. حمّل النموذج هنا.
  • run() يُنفَّذ لكلّ طلب. اجعله سريعًا.
  • AZUREML_MODEL_DIR متغيّر بيئة يُشير إلى مجلّد النموذج المُحمَّل تلقائيًّا.

الاختبار المحلّي:

curl -X POST "https://demand-forecast-online.<region>.inference.ml.azure.com/score" \
-H "Authorization: Bearer $KEY" \
-H "Content-Type: application/json" \
-d '{"data": [[3, 42, 2026, 36, 4.99]]}'

نقاط النهاية بالدفعات

للتنبّؤات على ملايين السطور، النقطة المتّصلة غير مناسبة: كلّ طلب يفتح اتّصالًا HTTP، ولها زمن انتظار افتراضي قصير. نقطة النهاية بالدفعات تُدير مهمّة Azure ML خلف الكواليس:

$schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
name: demand-forecast-batch

مع نشر يُصرّح النموذج والعنقود والدفعة:

$schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
name: weekly
endpoint_name: demand-forecast-batch
model: azureml:demand-forecast:12
compute: azureml:cpu-cluster
resources:
instance_count: 4
settings:
mini_batch_size: 5000
max_concurrency_per_instance: 2
output_action: append_row

الإطلاق:

az ml batch-endpoint invoke \
--name demand-forecast-batch \
--input azureml:sales_predict_input:2026.36 \
--output-path azureml://datastores/sales_blob/paths/forecasts/2026/week-36/

النقطة بالدفعات تكتب النتائج في مخزن بيانات، لا تعيدها في استجابة HTTP.

الحصص، الاختناق، والأمان

النقطة المتّصلة المُدارة لها حصص وحدات خاصّة، منفصلة عن حصّة أنوية VM المعتادة. تحقّق قبل الإطلاق:

az ml online-endpoint list-quota

للحماية من فيض الطلبات، فعّل الاختناق (request_settings.max_concurrent_requests_per_instance) وضع مقياسًا (min_instances, max_instances للتوسّع التلقائي).

للأمان، استعمل auth_mode: aad_token بدل key في الإنتاج. يستوجب هذا Managed Identity من العميل، لكن يُلغي مخاطر تسريب مفتاح.

تقسيم حركة نسي

نشر جديد بدل الحالي، دون تحديث الحركة، يعني أنّ 100% من المستخدمين يستمرّون على النموذج القديم بينما النشر الأخضر «الجديد» يعمل بلا زبون. الأسوأ: 200% حوسبة تُدفَع. دائمًا تحقّق من az ml online-endpoint show بعد كلّ تغيير.

الخلاصة

  • نقطة نهاية متّصلة للطلبات الحيّة، بالدفعات للحساب على ملايين السطور.
  • النشر الأزرق/الأخضر مع تقسيم حركة يقلّل خطر النشر السيّئ.
  • صيغة MLflow تُبدل الحاجة إلى score.py؛ الصيغ المخصّصة تحتاج init() وrun().
  • نقاط النهاية بالدفعات تكتب النتائج في مخزن البيانات، لا في استجابة HTTP.
  • استعمل aad_token وليس key في الإنتاج، وراقب حصص النقاط المستقلّة عن حصص VM.

الوحدة التالية: خطوط المعالجة — كيف نجمع القراءة والتدريب والنشر في تدفّق واحد مُجدوَل أسبوعيًّا.