خطوات الاستخدام
الخطوة 1: إدخال عدد المعلمات (Parameters) – أدخل العدد الإجمالي لمعلمات النموذج، مثل 7 مليار (7B) أو 70 مليار (70B). هذا الرقم يؤثر مباشرةً على حجم الذاكرة المطلوبة، لأن كل معلمة تُخزَّن بقيمتها العددية التي تحتاج عدد معين من البايتات حسب الدقة المختارة. يمكن معرفة عدد المعلمات من ورقة النموذج أو من مواصفاته.
الخطوة 2: اختيار الدقة (Precision) – الدقة تحدد عدد البايتات لكل معلمة. مثلاً float32 (4 بايت)، float16/bfloat16 (2 بايت)، int8 (1 بايت). كلما زادت الدقة، زادت الذاكرة المستهلكة، ولكن قد تزداد دقة التدريب. يجب اختيار الدقة المناسبة للجهاز؛ فبعض وحدات المعالجة تدعم فقط دقة معينة في العمليات الحسابية.
الخطوة 3: إدخال حجم الدفعة (Batch Size) – عدد العينات التي تُعالج معًا في كل خطوة تدريب. حجم الدفعة يضاعف احتياج الذاكرة تقريبًا، لأنه يحدد عدد التنشيطات (Activations) المخزنة مؤقتًا. إذا كان حجم الدفعة كبيرًا، قد تحتاج لذاكرة إضافية لحساب التدرجات (Gradients) والتحسينات (Optimizer States).
الخطوة 4: فهم المعادلة الأساسية – تقوم الحاسبة بتقدير إجمالي الذاكرة المطلوبة باستخدام المعادلة: VRAM (GB) = (عدد المعلمات × بايت لكل معلمة × (1 للنموذج + 1 للتدرجات + معامل المحسن) × حجم الدفعة) / 10⁹. معامل المحسن (Optimizer Factor) غالبًا 2 لـ Adam (يخزن لحظتين) و0 لـ SGD (لا يخزن لحظات). هذا تقدير تقريبي يتجاهل ذاكرة التنشيطات والترميزات، لذا يُنصح بإضافة هامش أمان 10-20%. وكن واعيًّا بأنه حد أعلى متحفّظ: الأوزان والتدرجات وحالات المحسن تشترك فيها كل عينات الدفعة ولا تتضاعف مع حجمها في الأطر الحقيقية (التي تتضاعف هي التنشيطات)، لذا يبالغ التقدير مع الدفعات الكبيرة.
الخطوة 5: تفسير النتائج – ستحصل على قيمة بالجيجابايت (GB). قارنها مع ذاكرة بطاقة الرسوميات (VRAM) المتوفرة لديك. إذا تجاوزت النتيجة الذاكرة المتاحة، يمكنك تقليل حجم الدفعة، أو استخدام دقة أقل (مثل float16 بدلاً من float32)، أو اختيار نموذج أصغر، أو استخدام تقنيات مثل التدرج التراكمي (Gradient Accumulation) أو التحميل المنخفض الدقة (Low-Rank Adaptation) لتقليل متطلبات الذاكرة.
أمثلة محلولة
تطبيقات عملية على حاسبة ذاكرة وحدة معالجة الرسوميات بخطوات الحل كاملة.
الحل
المعطيات: عدد المعلمات = 70 مليار = 70×10⁹، الدقة float16 = 2 بايت لكل معلمة، حجم الدفعة = 4، المحسن Adam (معامل 2).
الحساب:
- ذاكرة النموذج: 70×10⁹ × 2 = 140×10⁹ بايت = 140 جيجابايت.
- الذاكرة الإجمالية للنموذج + التدرجات + المحسن: 140 (نموذج) + 140 (تدرجات) + (140×2) (محسن) = 140+140+280 = 560 جيجابايت.
- مع حجم دفعة 4: 560 × 4 = 2240 جيجابايت ≈ 2.24 تيرابايت.
هذا يتجاوز بكثير سعة أي بطاقة رسوميات حالية (أقصاها 80 جيجابايت). لذا، يجب استخدام تقنيات مثل التدريب الموزع عبر عدة بطاقات، أو التحميل المنخفض الدقة (مثل int8 أو 4-bit)، أو تقليل حجم الدفعة إلى 1 لتصل إلى 560 جيجابايت.
في الواقع، يُدرب LLaMA 70B على 8 بطاقات A100 (80 جيجابايت لكل بطاقة) مع تقسيم النموذج عبر البطاقات (Model Parallelism) وحجم دفعة صغير لكل بطاقة.
الحل
المعطيات: المعلمات = 110×10⁶، الدقة float32 = 4 بايت، حجم الدفعة = 32، المحسن SGD (معامل 0).
الحساب:
- ذاكرة النموذج: 110×10⁶ × 4 = 440×10⁶ بايت ≈ 0.44 جيجابايت.
- الذاكرة الإجمالية للنموذج + التدرجات: 0.44 + 0.44 = 0.88 جيجابايت (لا حاجة للمحسن).
- مع حجم دفعة 32: 0.88 × 32 = 28.16 جيجابايت.
هذا الرقم لا يشمل ذاكرة التنشيطات والبيانات. في الممارسة العملية، قد تحتاج بطاقة بسعة 32 جيجابايت على الأقل. لكن مع SGD لا نحتاج لذاكرة إضافية للمحسن، على عكس Adam. يمكن تقليل حجم الدفعة إلى 8 لتصل إلى 7.04 جيجابايت، مما يسمح باستخدام بطاقات أقدم مثل GTX 1080 Ti (11 جيجابايت).
أمثلة محسوبة
قيم مُدخَلة ونتيجة محسوبة فعليًا بواسطة حاسبة ذاكرة وحدة معالجة الرسوميات.
LLaMA-2 70B بـ fp16 و Adam و دفعة 4: 2240 جيجابايت
- عدد المعاملات (بالمليار)
- 70
- دقة الحساب
- fp16
- حجم الدفعة
- 4
- المحسن
- adam
BERT-base بـ fp32 و SGD و دفعة 32: 28.16 جيجابايت
- عدد المعاملات (بالمليار)
- 0.11
- دقة الحساب
- fp32
- حجم الدفعة
- 32
- المحسن
- sgd
نموذج 7B بـ fp16 و Adam عند دفعة 1: 56 جيجابايت
- عدد المعاملات (بالمليار)
- 7
- دقة الحساب
- fp16
- حجم الدفعة
- 1
- المحسن
- adam