في المشهد سريع التطور للبنية التحتية للذكاء الاصطناعي، غالباً ما يسرق الاستدلال في الوقت الفعلي الأضواء. ومع ذلك، فإن معظم أحمال عمل الذكاء الاصطناعي في الإنتاج ليست تفاعلية. إنها مهام غير متزامنة، كثيفة البيانات، ومكثفة حسابياً مثل تحليل الفيديو، ومعالجة الوثائق، أو تحديث محركات التوصية. هذا هو مجال الاستدلال الدفعي (Batch Inference).
بينما يعطي الاستدلال عبر الإنترنت (في الوقت الفعلي) الأولوية لانخفاض زمن الاستجابة، فإن الاستدلال الدفعي يعطي الأولوية لـ الإنتاجية (Throughput) و كفاءة التكلفة. من خلال معالجة كميات كبيرة من البيانات في وقت واحد، يمكن للمنظمات تعظيم استخدام الأجهزة، وتقليل تكاليف كل تنبؤ بشكل كبير، وتبسيط التعقيد التشغيلي. يستكشف هذا المنشور البنية، والفوائد، وتنفيذ الاستدلال الدفعي لأنظمة التعلم الآلي الحديثة.
لماذا تختار الاستدلال الدفعي؟
عادةً ما ينبع قرار تنفيذ الاستدلال الدفعي من ثلاثة قيود أساسية: تحمل زمن الاستجابة، وتحسين التكلفة، والكفاءة الحسابية.
- الإنتاجية على حساب زمن الاستجابة: إذا لم يكن المستخدم بحاجة إلى نتيجة في أجزاء من الألف من الثانية (مثل إنشاء تقرير يومي أو تضمين مجموعة بيانات كبيرة للبحث)، فإن الدفعي يتفوق. فهو يسمح للنموذج باستخدام ذاكرة وحدة معالجة الرسومات (GPU) بشكل أكثر فعالية من خلال معالجة عينات متعددة بالتوازي.
- كفاءة التكلفة: في بيئات الحوسبة السحابية، غالباً ما يتم احتساب الموارد بناءً على كل ثانية من وقت الحوسبة. وقت الخمول على وحدة معالجة رسومات قوية أثناء فترات انخفاض حركة المرور هو مال مهدر. يملأ الدفعي هذا الوقت بالعمل، مما يعظم العائد على الاستثمار للأجهزة باهظة الثمن.
- بنية تحتية مبسطة: يمكن تشغيل مهام الدفعي على مثيلات مؤقتة (Spot Instances) أو مجموعات وحدات معالجة مركزية (CPU) أرخص، في حين أن الخدمات في الوقت الفعلي غالباً ما تتطلب مثيلات محجوزة وعالية الأداء مع اتفاقيات مستوى خدمة (SLAs) صارمة.
بنية خط أنابيب الاستدلال الدفعي
يتبع خط أنابيب الاستدلال الدفعي القوي عادةً سير عمل غير متزامن. يتضمن ذلك تحضير البيانات، وتحميل النموذج، وتنفيذ الاستدلال، وتخزين النتائج. على عكس واجهات برمجة التطبيقات (APIs) في الوقت الفعلي التي يجب أن تكون متاحة دائماً، يمكن جدولة مهام الدفعي، أو تشغيلها عند حدوث أحداث، أو تشغيلها عند الطلب.
تشمل المكونات الرئيسية ما يلي:
- استيعاب البيانات: قراءة البيانات من تخزين الكائنات (S3، GCS) أو قواعد البيانات.
- المعالجة المسبقة: تطبيع البيانات وتجزئتها (Tokenizing) إلى موترات (Tensors).
- خدمة النموذج: تشغيل النموذج على أجهزة محسنة.
- المعالجة اللاحقة والتخزين: حفظ النتائج مرة أخرى في التخزين للاستهلاك من قبل الأنظمة التالية.
تنفيذ الدفعي بكفاءة باستخدام باي توتش (PyTorch)
لنلقِ نظرة على مثال عملي باستخدام باي توتش. المبدأ الأساسي هو تكديس الموترات الفردية في موتر دفعة واحد. هذا يسمح للنموذج بمعالجة الدفعة بأكملها في تمرير أمامي واحد (Forward Pass).
import torch
import torch.nn as nn
# نموذج محاكى
class SimpleModel(nn.Module):
def __init__(self):
super().__init__()
self.layer = nn.Linear(10, 1)
def forward(self, x):
return self.layer(x)
model = SimpleModel()
model.eval()
# 1. تحديد حجم الدفعة
BATCH_SIZE = 32
# 2. محاكاة دفعات البيانات الواردة
# في الإنتاج، تأتي هذه البيانات من S3، أو Kafka، أو قاعدة بيانات
data_loader = [torch.randn(1, 10) for _ in range(100)] # 100 عينة فردية
# 3. المعالجة على دفعات
batch_count = 0
for i in range(0, len(data_loader), BATCH_SIZE):
# تكديس العينات الفردية في موتر الدفعة
batch_data = torch.stack(data_loader[i:i+BATCH_SIZE])
# نقل البيانات إلى وحدة معالجة الرسومات إذا كانت متاحة
batch_data = batch_data.cuda()
# تمرير أمامي واحد للدفعة بأكملها
with torch.no_grad():
outputs = model(batch_data)
batch_count += 1
print(f"Processed batch {batch_count}: {outputs.shape}")
في هذا المثال، بدلاً من إجراء 32 استدعاءً للدالة منفصلة، نقوم بإجراء استدعاء واحد فقط. هذا يقلل بشكل كبير من عبء مترجم بايثون وزمن إطلاق نواة وحدة معالجة الرسومات (GPU kernel launch latency).
أفضل الممارسات للتحسين
للحصول على أقصى استفادة من الاستدلال الدفعي، ضع في اعتبارك الاستراتيجيات التالية:
- الدYNAMIC Batching (التجميع الديناميكي): استخدم أطر عمل الخدمة مثل TorchServe أو Triton Inference Server التي يمكنها تجميع الطلبات من قائمة انتظار حتى يتم الوصول إلى عتبة حجم الدفعة، مما يحسن كل من زمن الاستجابة والإنتاجية.
- الكمّنة (Quantization): يمكن أن يؤدي استخدام كمّنة INT8 إلى تسريع الاستدلال بشكل كبير وتقليل متطلبات عرض النطاق الترددي للذاكرة دون فقدان كبير في الدقة.
- الإدخال/الإخراج غير المتزامن: افصل بين تحميل البيانات والاستدلال باستخدام تقنيات التحميل المسبق (Prefetching). بينما تعالج وحدة معالجة الرسومات الدفعة N، يجب أن تكون وحدة المعالجة المركزية (CPU) قد بدأت بالفعل في تحضير الدفعة N+1.
الخاتمة
الاستدلال الدفعي ليس مجرد حل بديل عندما لا يكون الاستدلال في الوقت الفعلي ممكناً؛ بل هو خيار استراتيجي لتوسيع نطاق الذكاء الاصطناعي بمسؤولية. من خلال الاستفادة من توازي الأجهزة وتقليل الأعباء، يتيح المعالجة الدفعية للمنظمات التعامل مع مجموعات البيانات الضخمة بكفاءة. مع نمو نماذج الذكاء الاصطناعي واتساع مجموعات البيانات، سيظل إتقان الاستدلال الدفعي مهارة حاسمة لأي مهندس تعلم آلي أو مهندس بنية يهدف إلى بناء أنظمة ذكاء اصطناعي قابلة للتوسع وفعالة من حيث التكلفة.