أنماط تقديم النماذج
أنماط تقديم النماذج
إخراج النموذج المدرَّب من بيئة التجارب ووضعه في مسار يخدم التنبؤات فعلياً للمستخدمين هو عمل أصعب مما يبدو. انتهت مهمة التدريب بنجاح، واجتازت مقاييس التقييم حدودك، وجرى ترقية النموذج في السجل — والآن يبدأ العمل الحقيقي. تقديم نموذج على نطاق الإنتاج يستلزم التفكير في وقت واحد في ميزانيات الزمن الاستجابي، وسقف الإنتاجية، وتكلفة الأجهزة، وطبولوجيا النشر، ودلالات الإخفاق. يغطي هذا الدرس الأنماط الثلاثة القياسية للتقديم التي ستواجهها، والقرارات البنية التحتية التي تحدد ما إذا كان كل نمط يناسب حالة استخدامك.
التقديم الآني (الاستدلال عبر الإنترنت)
يُجيب التقديم الآني على طلب التنبؤ بشكل متزامن ضمن ميزانية زمن استجابي — تتراوح عادةً بين بضعة ملي ثوانٍ للنماذج البسيطة وبضع مئات من الملي ثوانٍ للنماذج العميقة الكبيرة. يظل العميل منتظراً للاستجابة. هذا هو النمط الصحيح عندما تحتاج التنبؤ في وقت الطلب: اكتشاف الاحتيال في لحظة الدفع، أو توصية المنتجات عند تحميل الصفحة، أو اعتدال المحتوى عند نشر المنشور.
تمتلك مجموعة التقديم للاستدلال الآني ثلاث طبقات تعرفها من الخدمات المصغرة التقليدية، بالإضافة إلى طبقة رابعة خاصة بتعلم الآلة:
- موازن الحمل / بوابة API: يوجّه طلبات التنبؤ ويطبّق المصادقة وحدود المعدل ويوفر نقطة نهاية HTTPS الخارجية. لا يختلف عن خدماتك الحالية.
- خادم النموذج: العملية التي تحتفظ بأوزان النموذج في الذاكرة (VRAM للـ GPU أو RAM للـ CPU) وتنفذ التمرير الأمامي. خوادم النماذج للإنتاج — Triton Inference Server وTorchServe وTF Serving وvLLM — تعرض نقاط نهاية gRPC وREST، وتدعم التجميع، وتتعامل مع إصدارات متعددة من النموذج في آنٍ واحد، وتصدر مقاييس Prometheus. لا تلفّ سكريبت Python خاماً في تطبيق Flask وتسميه خادم نموذج؛ هذا النمط ينهار تحت أي حمل حقيقي.
- مخزن الميزات (المسار الآني): للنماذج التي تحتاج ميزات محسوبة مسبقاً غير موجودة في حمولة الطلب، يجلبها خادم النموذج من مخزن ميزات منخفض الزمن الاستجابي (Redis، أو Feast online store، أو Tecton). هذا هو أكبر مساهم في الزمن الاستجابي خارج الاستدلال ذاته؛ أبقِه دون 5 ملي ثوانٍ.
- تكامل سجل النموذج: تراقب طبقة التقديم إصدارات النماذج الجديدة في السجل وتستبدلها دون توقف. يدعم Triton هذا بشكل أصلي؛ بينما يستطلع TF Serving دليل النموذج بصفة دورية.
التقديم الدفعي (الاستدلال دون اتصال)
يشغّل التقديم الدفعي النموذج كمهمة مجدولة على مجموعة كبيرة من المدخلات ويكتب النتائج في مخزن بيانات. ثم يبحث المستهلكون عن التنبؤات المحسوبة مسبقاً وقت الاستعلام بدلاً من استدعاء النموذج. هذا النمط صحيح عندما يمكنك تحمّل الحساب المسبق — محتوى البريد الإلكتروني المخصص الذي يُنشأ ليلاً، أو درجات التراجع الأسبوعية لجميع حسابات العملاء، أو تصنيف المستندات بين عشية وضحاها عبر نظام إدارة مستندات.
المقايضة هي حداثة البيانات. مهمة دفعية تعمل كل 24 ساعة تعني أن التنبؤات قديمة بأقصاه 24 ساعة. لكثير من المشكلات التجارية هذا مقبول. لاكتشاف الاحتيال، فهو ليس كذلك. اختر الدُفعي عندما:
- مجموعة المدخلات منتهية وقابلة للحصر (جميع المستخدمين، جميع المنتجات، جميع المستندات).
- التنبؤ صالح لفترة كافية بحيث لا يسبب الإهمال ضرراً.
- النموذج أكبر من أن يُقدَّم في الوقت الحقيقي ضمن ميزانية الزمن الاستجابي.
- التكلفة قيد — الاستدلال الدُفعي على نُسخ GPU المؤقتة أرخص عادةً بمعدل 3-10 أضعاف مقارنةً بنقاط النهاية الآنية الدائمة التشغيل.
على نطاق واسع، يعمل الاستدلال الدفعي على Spark (PySpark مع pandas_udf لتجميع استدعاءات النموذج)، أو Ray Batch، أو مهمة Kubernetes بسيطة تتوازى على شظايا المدخلات. تهبط المخرجات في BigQuery أو DynamoDB أو Redis أو المسار غير المتصل بمخزن الميزات، حسب نمط البحث.
أطر التقديم في الإنتاج
NVIDIA Triton Inference Server هو المعيار الصناعي لأعباء العمل على GPU. يدعم TensorFlow SavedModel وONNX وPyTorch TorchScript وTensorRT والخلفيات المخصصة بـ Python. يتيح جدولة المجموعات في Triton ربط ما قبل المعالجة والاستدلال وما بعد المعالجة كطلب منطقي واحد. يجمع التجميع الديناميكي الطلبات الواردة خلال نافذة قابلة للتهيئة في استدعاء كرنل GPU واحد، محسناً بشكل كبير استخدام GPU دون أن يعلم العميل.
vLLM هو المعيار لتقديم نماذج اللغة الكبيرة. يطبّق PagedAttention — إدارة كاش KV مقتبسة من الذاكرة الافتراضية في أنظمة التشغيل — للقضاء على هدر الذاكرة من التسلسلات متغيرة الطول. على A100 80GB واحد، يحقق vLLM عادةً إنتاجية أعلى بمقدار 3-5 أضعاف مقارنةً بحلقة generate() النائفة من HuggingFace.
TF Serving هو الخيار القياسي لعمليات نشر TensorFlow SavedModel. إنه أبسط من Triton ومُجرَّب في الإنتاج عبر البنية التحتية الداخلية لـ Google. إذا كانت مؤسستك تعتمد TensorFlow بكثافة ولا تحتاج دعم أطر متعددة، فإن TF Serving هو الخيار الأقل تعقيداً تشغيلياً.
Ray Serve يملأ الفجوة عندما تحتاج مرونة Python أولاً: منطق مخصص لما قبل وبعد المعالجة، أو نماذج مجمّعة، أو رسوم نشر بها تفريعات. يتكامل مع النظام البيئي الأوسع لـ Ray (Ray Train وRay Tune) للتعامل مع دورة حياة MLOps الكاملة على مجموعة عناقيد واحدة.
التوسع التلقائي للاستدلال
أعباء عمل الاستدلال متقطعة. خدمة التوصيات ترى ارتفاعاً في الحركة بمقدار 10 أضعاف خلال ساعات ذروة التسوق. نموذج الاحتيال يرى ارتفاعاً كلما أجرى تاجر كبير عرضاً ترويجياً. التوفير الثابت للتعامل مع الذروات يعني إنفاق ميزانية GPU على طاقة خاملة خلال ساعات الهدوء. عند 2-4 دولارات/ساعة للـ GPU الواحد من نوع A10G، تتراكم تكلفة الخمول سريعاً.
Kubernetes Horizontal Pod Autoscaler (HPA) يعمل للنماذج المعتمدة على CPU لكنه أعمى عن الإشارات الخاصة بـ GPU الأكثر أهمية: استخدام GPU، وعمق طابور التجميع، وعدد الطلبات المعلقة. الجواب في الإنتاج هو KEDA (Kubernetes Event-Driven Autoscaling) مقترناً بمقاييس مخصصة من خادم النموذج:
لأعباء العمل الحساسة للتكلفة أو المتقطعة، فكّر في التوسع إلى الصفر. كل من Knative Serving وAWS SageMaker Serverless Inference يدعم التوسع الحقيقي إلى الصفر: النشر يتقلص إلى صفر نُسخ عند الخمول ويتوسع عند الطلب الأول (زمن بدء التشغيل البارد: 1-30 ثانية حسب حجم النموذج). هذا ممكن للنماذج ذات الحركة غير المتكررة؛ لكنه كارثي للمسارات الحساسة للزمن الاستجابي حيث سيخرق بدء التشغيل البارد هدف مستوى الخدمة.
resources.requests.nvidia.com/gpu مساوياً لـ resources.limits.nvidia.com/gpu. موارد GPU في Kubernetes غير قابلة للضغط — إما يضع الجدولي الحاوية على عقدة بها GPU متاح أو لا. ضبط طلب أقل من الحد يؤدي إلى جدولة غير متوقعة وتعارضات في مشاركة GPU. اضبطهما دائماً متساويَيْن.اختبار حمل مكدس التقديم
لا تُرقِّ نموذجاً للتقديم الآني أبداً دون اختبار حمل على نسخة تجهيزية تطابق نوع GPU وذاكرة الإنتاج. أداة perf_analyzer من Triton مصممة لهذا الغرض تحديداً؛ وبدلاً من ذلك، يعمل k6 مع سكريبت طلب نموذج مخصص على أي نقطة نهاية REST أو gRPC.
nvidia-smi خلال اختبار الحمل قبل تحديد maxReplicaCount. قاعدة عامة: اترك هامش VRAM 10-15% لنمو كاش KV وعبء كرنل CUDA وإصدارات النماذج المتزامنة.إصدارات الكناري للنماذج
يجب أن يتبع نشر إصدار نموذج جديد نفس انضباط الكناري الذي تطبقه على أكواد التطبيق — لكن مع تعقيد إضافي وهو أن جودة النموذج يمكن أن تتدهور بهدوء في مجموعات فرعية غير مرئية في المقاييس المجمّعة. استخدم شبكة الخدمة (Istio أو Linkerd) أو ميزة تقسيم حركة المرور في خادم النموذج لتوجيه 5% من حركة الإنتاج إلى الإصدار الجديد. راقب كلاً من مقاييس البنية التحتية (الزمن الاستجابي، معدل الأخطاء) ومقاييس جودة النموذج (توزيع درجات التنبؤ، مؤشرات الأداء الرئيسية للأعمال) قبل الترقية. إذا تحوّل توزيع درجات النموذج الجديد بشكل كبير نسبةً إلى الإصدار الحالي — مقاساً بفحص KL divergence في خط المراقبة — فتراجع فوراً.
مجموعة سجل النماذج (الدرس 3)، وخط CI/CD الذي يشترط اجتياز مقاييس التقييم (الدرس 5)، وطبقة التقديم الإنتاجية مع التوسع التلقائي المناسب، ومراقبة الانجراف (الدرس 7) — هذه المجموعة هي ما يميز منصة ML ناضجة عن مشروع بحثي يصادف أنه يعمل في الإنتاج.