الوحدة 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.
الوحدة التالية: خطوط المعالجة — كيف نجمع القراءة والتدريب والنشر في تدفّق واحد مُجدوَل أسبوعيًّا.