التكميم هو أسلوب لتقليل التكاليف الحسابية والذاكرة لتقييم نماذج التعلم العميق من خلال تمثيل أوزانها وعمليات التنشيط باستخدام أنواع بيانات منخفضة الدقة مثل عدد صحيح 8 بت (int8) بدلاً من النقطة العائمة المعتادة 32 بت (float32).

إن تقليل عدد البتات يعني أن النموذج الناتج يتطلب مساحة تخزين أقل في الذاكرة، وهو أمر بالغ الأهمية لنشر نماذج اللغات الكبيرة على أجهزة المستهلك. كما أنه يتيح تحسينات محددة لأنواع البيانات ذات عرض البت المنخفض، مثل int8 أو float8 مضاعفات المصفوفة على أجهزة CUDA.

تتوفر العديد من المكتبات مفتوحة المصدر لقياس نماذج التعلم العميق من pytorch، وتوفر كل منها ميزات قوية جدًا، ولكنها غالبًا ما تقتصر على تكوينات وأجهزة نموذجية محددة.

وأيضًا، على الرغم من أنها تعتمد على نفس مبادئ التصميم، إلا أنها لسوء الحظ غالبًا ما تكون غير متوافقة مع بعضها البعض.

اليوم، نحن متحمسون لتقديم quanto، وهي واجهة تكميم PyTorch لـ Optimum.

لقد تم تصميمه مع مراعاة التنوع والبساطة:

  • جميع الميزات متوفرة في وضع حريص (يعمل مع نماذج لا يمكن تتبعها)،
  • يمكن وضع النماذج الكمية على أي جهاز (بما في ذلك CUDA وMPS)،
  • يقوم تلقائيًا بإدراج بذرة التكميم والتكميم،
  • يقوم تلقائيًا بإدراج العمليات الوظيفية الكمية،
  • يقوم بإدراج وحدات كمية تلقائيًا (انظر أدناه قائمة الوحدات المدعومة)،
  • يوفر سير عمل سلسًا من النموذج العائم إلى النموذج الديناميكي إلى النموذج الكمي الثابت،
  • التسلسل متوافق مع PyTorch weight_only و 🤗 أجهزة الأمان،
  • مضاعفات المصفوفة المتسارعة على أجهزة CUDA (int8-int8، fp16-int4، bf16-int8، bf16-int4)،
  • يدعم أوزان int2 وint4 وint8 وfloat8،
  • يدعم تنشيط int8 وfloat8.

يبدو أن أساليب التكميم الحديثة تركز على تكميم نماذج اللغات الكبيرة (LLMs)، في حين تهدف تقنية الكم إلى توفير بدايات تكميم بسيطة للغاية لمخططات تكميم بسيطة (تكميم خطي، تكميم لكل مجموعة) قابلة للتكيف عبر أي طريقة.

سير العمل الكمي

Quanto متاح كحزمة نقطة.

pip install optimum-quanto

يتكون سير عمل التكميم النموذجي من الخطوات التالية:

1. الكم

تقوم الخطوة الأولى بتحويل النموذج العائم القياسي إلى نموذج كمي ديناميكي.

from optimum.quanto import quantize, qint8

quantize(model, weights=qint8, activations=qint8)

في هذه المرحلة، يتم تعديل استنتاج النموذج فقط لتحديد كمية الأوزان ديناميكيًا.

2. المعايرة (اختياري إذا لم يتم قياس عمليات التنشيط)

يدعم Quanto وضع المعايرة الذي يسمح بتسجيل نطاقات التنشيط أثناء تمرير عينات تمثيلية من خلال النموذج الكمي.

from optimum.quanto import Calibration

with Calibration(momentum=0.9):
    model(samples)

يؤدي هذا تلقائيًا إلى تنشيط تكميم عمليات التنشيط في الوحدات الكمية.

3. اللحن، المعروف أيضًا باسم التدريب على الوعي الكمي (اختياري)

إذا انخفض أداء النموذج كثيرًا، فيمكن ضبطه لبضع فترات لاستعادة أداء النموذج العائم.

import torch

model.train()
for batch_idx, (data, target) in enumerate(train_loader):
    data, target = data.to(device), target.to(device)
    optimizer.zero_grad()
    output = model(data).dequantize()
    loss = torch.nn.functional.nll_loss(output, target)
    loss.backward()
    optimizer.step()

4. تجميد الأوزان الصحيحة

عند تجميد نموذج، يتم استبدال الأوزان العائمة بأوزان كمية.

from optimum.quanto import freeze

freeze(model)

5. تسلسل النموذج الكمي

يمكن إجراء تسلسل لأوزان النماذج الكمية إلى أ state_dict، وحفظه في ملف . كلاهما pickle و safetensors (مستحسن) مدعومة.

from safetensors.torch import save_file

save_file(model.state_dict(), 'model.safetensors')

من أجل إعادة تحميل هذه الأوزان، تحتاج أيضًا إلى تخزين خريطة تكميم النماذج الكمية.

import json

from optimum.quanto import quantization_map

with open('quantization_map.json', w) as f:
  json.dump(quantization_map(model))

5. إعادة تحميل النموذج الكمي

يمكن إعادة تحميل النموذج الكمي المتسلسل من ملف state_dict و أ quantization_map باستخدام requantize المساعد. لاحظ أنك تحتاج أولاً إلى إنشاء نموذج فارغ.

import json

from safetensors.torch import load_file

state_dict = load_file('model.safetensors')
with open('quantization_map.json', r) as f:
  quantization_map = json.load(f)


with torch.device('meta'):
  new_model = ...
requantize(new_model, state_dict, quantization_map, device=torch.device('cuda'))

يرجى الرجوع إلى الأمثلة الخاصة بإنشاء سير عمل التكميم. يمكنك أيضًا التحقق من هذا الدفتر حيث نعرض لك كيفية قياس نموذج BLOOM باستخدام الكم!

أداء

يوجد أدناه رسمان بيانيان يقيمان دقة التكوينات الكمية المختلفة لـ meta-llama/Meta-Llama-3.1-8B.

ملحوظة: الشريط الأول في كل مجموعة يتوافق دائمًا مع النموذج غير الكمي.

يتم الحصول على هذه النتائج دون تطبيق أي خوارزمية تحسين ما بعد التدريب مثل hqq أو AWQ.

يوضح الرسم البياني أدناه زمن الوصول لكل رمز تم قياسه على وحدة معالجة الرسومات NVIDIA A10.

meta-llama/Meta-Llama-3.1-8B متوسط ​​زمن الاستجابة لكل رمز مميز

ترقبوا النتائج المحدثة لأننا نعمل باستمرار على تحسين الكم باستخدام أدوات التحسين والنوى المحسنة.

برجاء الرجوع إلى معايير القياس الكمي للحصول على نتائج تفصيلية لبنيات وتكوينات النماذج المختلفة.

التكامل في المحولات

تم دمج Quanto بسلاسة في مكتبة محولات Hugging Face. يمكنك تكميم أي نموذج عن طريق تمرير QuantoConfig ل from_pretrained!

حاليًا، تحتاج إلى استخدام أحدث إصدار من برنامج تسريع للتأكد من أن التكامل متوافق تمامًا.

from transformers import AutoModelForCausalLM, AutoTokenizer, QuantoConfig

model_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id)

quantization_config = QuantoConfig(weights="int8")

quantized_model = AutoModelForCausalLM.from_pretrained(
    model_id,
    quantization_config= quantization_config
)

يمكنك قياس الأوزان و/أو عمليات التنشيط في int8 أو float8 أو int4 أو int2 بمجرد تمرير الوسيطة الصحيحة في QuantoConfig. يمكن أن تكون عمليات التنشيط إما في int8 أو float8. بالنسبة لـ float8، يجب أن يكون لديك جهاز متوافق مع دقة float8، وإلا فإن quanto سينقل الأوزان والتنشيطات بصمت إلى torch.float32 أو torch.float16 (اعتمادًا على نوع البيانات الأصلي للنموذج) عندما نقوم بإجراء matmul (فقط عندما يكون الوزن كميًا). إذا حاولت استخدام float8 باستخدام أجهزة MPS، torch سوف يثير حاليا خطأ.

Quanto لا يختص بالجهاز، مما يعني أنه يمكنك تحديد حجم النموذج الخاص بك وتشغيله بغض النظر عما إذا كنت تستخدم وحدة المعالجة المركزية (CPU) أو وحدة معالجة الرسومات (GPU) أو MPS (Apple Silicon).

Quanto هو أيضًا صديق لـ torch.compile. يمكنك تكميم نموذج باستخدام الكم والاتصال torch.compile إلى النموذج لتجميعه لتوليد أسرع. قد لا تعمل هذه الميزة خارج الصندوق في حالة تضمين التكميم الديناميكي (على سبيل المثال، تمكين التدريب على القياس الكمي أو التنشيط الكمي). تأكد من الاحتفاظ بها activations=None عند إنشاء الخاص بك QuantoConfig في حالة استخدام تكامل المحولات.

من الممكن أيضًا تكميم أي نموذج، بغض النظر عن الطريقة التي تستخدم الكم! نوضح كيفية القياس الكمي openai/whisper-large-v3 نموذج في int8 باستخدام quanto.

from transformers import AutoModelForSpeechSeq2Seq

model_id = "openai/whisper-large-v3"
quanto_config = QuantoConfig(weights="int8")

model = AutoModelForSpeechSeq2Seq.from_pretrained(
   model_id,
   torch_dtype=torch.float16,
   device_map="cuda",
   quantization_config=quanto_config
)

قم بإلقاء نظرة على هذا الدفتر للحصول على برنامج تعليمي كامل حول كيفية استخدام quanto بشكل صحيح مع تكامل المحولات!

المساهمة في الكمية

إن المساهمات في Quanto موضع ترحيب كبير، خاصة في المجالات التالية:

  • نواة محسنة للعمليات الكمومية التي تستهدف أجهزة محددة،
  • أدوات تحسين ما بعد التدريب والتكميم لاستعادة الدقة المفقودة أثناء التكميم،
  • دروس مساعده ل transformers أو diffusers نماذج.

شاركها.
اترك تعليقاً