Quantization-Aware Training (QAT)
يحاكي التدريب الواعي بالتكميم (QAT) التقريب إلى INT8 أثناء التدريب، لتتكيف الأوزان قبل التصدير وتحافظ على الدقة التي يفقدها التحويل العادي إلى INT8.
التدريب الواعي بالتكميم (QAT) تقنية تدريب تُهيّئ النموذج للاستدلال بدقة منخفضة عبر محاكاة التكميم أثناء التدريب. عادةً ما تُدرَّب النماذج وتُخزَّن أوزانها كأعداد بفاصلة عائمة بدقة 32 بت (FP32)، ويحوّل تكميم النماذج هذه الأوزان إلى تنسيقات مثل أعداد صحيحة بدقة 8 بت (INT8) للنشر، ما يجعل الأوزان أصغر بأربع مرات ويتيح لوحدات CPU وGPU ووحدات المعالجة العصبية (NPUs) استخدام العمليات الحسابية الصحيحة السريعة. ويقرّب التحويل كل قيمة ويقصّ القيم الشاذة، ما يكلّف الصحة. يُدرج QAT هذا التقريب في التمريرة الأمامية بينما لا يزال النموذج يتعلم، بحيث يعثر الانحدار المتدرج على أوزان تظل فعّالة بعد التكميم. ويُجرى عادةً كمرحلة قصيرة من الضبط الدقيق لنموذج مدرّب مسبقًا. وقد قرن مخطط الاستدلال باستخدام الحسابات الصحيحة فقط من Google لوحدات CPU المحمولة استدلال INT8 بإجراء التدريب هذا، وأصبح QAT منذ ذلك الحين أداة معيارية لنشر الذكاء الاصطناعي الطرفي.
آلية عمل التدريب الواعي بالتكميم#
يضيف QAT عمليات تكميم زائفة، تُسمى أيضًا أزواج التكميم وإزالة التكميم (Q/DQ)، إلى أوزان النموذج وتفعيلاتِه. تحوّل كل عملية منها عددًا بفاصلة عائمة إلى أقرب مستوى INT8 باستخدام مقياس ونقطة صفر، ثم تحوّله فورًا مجددًا إلى عدد بفاصلة عائمة. وهكذا تواصل الشبكة الحساب بالفاصلة العائمة لكنها ترى القيم المقربة نفسها التي سيستخدمها محرك INT8. وتُستمد المقاييس من المعايرة، التي تسجّل النطاق المعتاد لكل موتر باستخدام بضع دفعات من البيانات، كما تتعلمها بعض الطرق أثناء التدريب.
يكون تدرج التقريب صفرًا في معظم الحالات، ما يوقف التعلم. يستخدم QAT مقدِّر المرور المباشر (STE)، الذي يتعامل مع خطوة التقريب باعتبارها دالة الهوية أثناء الانتشار العكسي، بحيث تمر التدرجات إلى أوزان FP32 الأساسية:
import torch
# FP32 weights that training keeps and updates
w = torch.tensor([0.3137, -0.7214, 0.0521, 1.1800], requires_grad=True)
# Symmetric INT8 fake quantization: snap each weight to one of 255 levels, then map back to float
scale = w.detach().abs().max().item() / 127
w_q = torch.fake_quantize_per_tensor_affine(w, scale, 0, -127, 127)
print(f"Fake-quantized: {[round(v, 4) for v in w_q.tolist()]}")
# The forward pass sees the rounded weights; the straight-through estimator still delivers gradients to w
x = torch.tensor([1.0, 2.0, 3.0, 4.0])
loss = (w_q * x).sum()
loss.backward()
print(f"Gradient on FP32 weights: {w.grad.tolist()}")تستخدم التمريرة الأمامية الأوزان المقربة 0.3159 و−0.7247 و0.0557 و1.18، ويقع كل منها ضمن نصف خطوة تكميم (0.0046) من قيمته في FP32، ومع ذلك فإن التدرج الذي يصل إلى أوزان FP32 يساوي تمامًا المدخلات: 1.0 و2.0 و3.0 و4.0، كما لو لم يحدث أي تقريب. وعلى مدى خطوات عديدة، يحرّك المحسّن الأوزان إلى مواضع يكون فيها ضرر خطأ التقريب أقل ما يمكن، ويُصدَّر النموذج المدرّب إلى INT8 بمقاييسه المتعلَّمة.
التدريب الواعي بالتكميم مقارنةً بالتكميم بعد التدريب#
يحوّل التكميم بعد التدريب (PTQ) نموذجًا مكتملًا بتنسيق FP32 مباشرةً، مستخدمًا بضع مئات من صور المعايرة لتحديد النطاقات. يستغرق ذلك دقائق ولا يتطلب مسار تدريب، لكن الأوزان لا تتاح لها فرصة التكيف مع التقريب، لذا قد تفقد النماذج الحساسة قدرًا ملحوظًا من الصحة. يتطلب QAT جولة ضبط دقيق باستخدام بيانات التدريب كاملة، ويستعيد معظم هذا الفقد في المقابل. تبدأ الفرق عادةً بتجربة PTQ ولا تنتقل إلى QAT إلا عندما يكون انخفاض صحة INT8 كبيرًا جدًا:
يجري Ultralytics YOLO تدريب QAT عندما يتلقى التدريب quantize=8: فهو يعاير التكميم الزائف لـ INT8 عبر NVIDIA Model Optimizer، ويضبط النموذج بدقة مع تضمين التكميم في حلقة التدريب، ويحفظ النطاقات التي تكتبها عمليات تصدير ONNX وTensorRT كعقد Q/DQ من دون بيانات معايرة منفصلة. في محركات TensorRT على COCO val2017، خفّض PTQ قيمة mAP50-95 لنموذج YOLO26 المتوسط من 0.527 إلى 0.470، بينما أبقاها QAT عند 0.514. ولم يخسر النموذج النانوي سوى 0.010 مع PTQ، لذا لم يضف QAT أي فائدة هناك.
from ultralytics import YOLO
# ابدأ من نقطة تحقق YOLO26 مدرّبة بتنسيق FP32
model = YOLO("yolo26n.pt")
# أجرِ الضبط الدقيق بمعدل تعلم منخفض، مع تضمين التكميم الزائف لـ INT8 في الحلقة
model.train(data="coco8.yaml", epochs=5, quantize=8, optimizer="AdamW", lr0=0.00001, cos_lr=True)
# صدّر إلى ONNX؛ تصبح نطاقات INT8 المتعلَّمة عقد Q/DQ، لذا لا حاجة إلى بيانات معايرة
model.export(format="onnx", quantize=8)حالات استخدام QAT#
- الرؤية الطرفية: كواشف INT8 على الهواتف المحمولة والكاميرات الذكية والطائرات المسيّرة ووحدات NPU، حيث تعجز المسرّعات التي لا تدعم إلا الأعداد الصحيحة عن تشغيل نماذج الفاصلة العائمة.
- خوادم الاستدلال: تشغّل محركات GPU مثل TensorRT نوى Tensor Core من نوع INT8 لزيادة الإنتاجية، ويحافظ QAT على صحة قريبة من FP32.
- النماذج اللغوية: أصبح QAT يصل الآن إلى أقل من 8 بتات. أصدرت Google نقاط تحقق Gemma 3 QAT بتنسيق 4-bit Q4_0 تحافظ على جودة قريبة من bfloat16 مع استهلاك جزء بسيط من الذاكرة.
تتضمن أطر العمل الرئيسية أدوات QAT، ومنها torchao في PyTorch، ومجموعة أدوات تحسين النماذج في TensorFlow، وNNCF من Intel لـ OpenVINO.
التدريب الواعي بالتكميم مقارنةً بالمصطلحات ذات الصلة#
- تكميم النماذج: المصطلح الشامل لخفض الدقة العددية. ويُعد PTQ وQAT مساري العمل الرئيسيين له.
- التدريب بـ الدقة المختلطة: يجري التدريب بدقة FP16 أو BF16 لتوفير الذاكرة والوقت، من دون تهيئة النموذج لاستدلال INT8.
- الدقة النصفية: الاستدلال بدقة FP16، التي تتحملها معظم النماذج دون إعادة تدريب، لذا نادرًا ما تكون هناك حاجة إلى QAT لها.
- تشذيب النماذج: يزيل الأوزان أو القنوات بدلًا من خفض دقتها، ويمكن الجمع بين أسلوبي الضغط.
- تقطير المعرفة: يدرّب بنية أصغر لمحاكاة بنية أكبر. وغالبًا ما يُدمج مع QAT، حيث يعمل النموذج كامل الدقة معلّمًا لنسخته المكمّمة.










