Buckets:

mishig's picture
|
download
raw
8.98 kB

NVIDIA ModelOpt

NVIDIA-ModelOpt هو مكتبة موحدة تجمع بين أحدث تقنيات تحسين النماذج مثل التكميم (quantization) والتقليم (pruning) والتقطير (distillation) وفك التشفير التخميني (speculative decoding) وغيرها. يقوم هذا الأداة بضغط نماذج التعلم العميق من أجل أطر النشر اللاحقة مثل TensorRT-LLM أو TensorRT بغرض تحسين سرعة الاستدلال.

قبل أن تبدأ، تأكد من تثبيت nvidia_modelopt.

pip install -U "nvidia_modelopt[hf]"

قم بتكميم نموذج عن طريق تمرير NVIDIAModelOptConfig إلى from_pretrained() (يمكنك أيضًا تحميل نماذج مُكمَّمة مسبقًا). يعمل هذا مع أي نموذج في أي نمط، طالما أنه يدعم التحميل باستخدام Accelerate ويحتوي على طبقات torch.nn.Linear.

يكمم المثال أدناه الأوزان إلى FP8 فقط.

import torch
from diffusers import AutoModel, SanaPipeline, NVIDIAModelOptConfig

model_id = "Efficient-Large-Model/Sana_600M_1024px_diffusers"
dtype = torch.bfloat16

quantization_config = NVIDIAModelOptConfig(quant_type="FP8", quant_method="modelopt")
transformer = AutoModel.from_pretrained(
    model_id,
    subfolder="transformer",
    quantization_config=quantization_config,
    dtype=dtype,
)
pipe = SanaPipeline.from_pretrained(
    model_id,
    transformer=transformer,
    dtype=dtype,
)
pipe.to("cuda")  # or "mps", "xpu", "cpu"

print(f"Pipeline memory usage: {torch.cuda.max_memory_reserved() / 1024**3:.3f} GB")

prompt = "A cat holding a sign that says hello world"
image = pipe(
    prompt, num_inference_steps=50, guidance_scale=4.5, max_sequence_length=512
).images[0]
image.save("output.png")

ملاحظة:

صُممت طرق التكميم في NVIDIA-ModelOpt لتقليل البصمة الذاكرة لأوزان النموذج باستخدام تقنيات متنوعة من التدريب الواعي بالتكميم (QAT) والتكميم بعد التدريب (PTQ) مع الحفاظ على أداء النموذج. ومع ذلك، يعتمد المكسب الفعلي في الأداء أثناء الاستدلال على إطار النشر (مثل TRT-LLM، TensorRT) وتكوين العتاد المحدد.

يمكن العثور على مزيد من التفاصيل هنا.

NVIDIAModelOptConfig

تقبل فئة NVIDIAModelOptConfig ثلاثة معلمات:

  • quant_type: قيمة نصية تشير إلى أحد أنواع التكميم أدناه.
  • modules_to_not_convert: قائمة بأسماء الوحدات الكاملة أو الجزئية التي يجب عدم إجراء التكميم (Quantization) عليها. على سبيل المثال، لتجنب أي تكميم في كتل الإسقاط (projection blocks) الخاصة بـ SD3Transformer2DModel ضمن pos_embed، يجب تحديد: modules_to_not_convert=["pos_embed.proj.weight"].
  • disable_conv_quantization: قيمة منطقية، عند ضبطها على True تُعطّل التكميم لجميع طبقات الالتفاف في النموذج. وهذا مفيد لأن تكميم القنوات والكتل لا يعمل بشكل جيد عادةً مع طبقات الالتفاف (المستخدمة مع INT4 وNF4 وNVFP4). إذا كنت ترغب في تعطيل التكميم لطبقات التمرير المحددة، فاستخدم modules_to_not_convert بدلاً من ذلك.
  • algorithm: الخوارزمية المستخدمة لتحديد المقياس، والافتراضي هو "max". يمكنك الاطلاع على توثيق modelopt للاطلاع على خوارزميات وتفاصيل إضافية.
  • forward_loop: دالة حلقة الأمامي المستخدمة لمعايرة التنشيط أثناء التكميم. إذا لم تُقدَّم، تعتمد على قيم المقياس الثابتة المحسوبة باستخدام الأوزان فقط.
  • kwargs: قاموس من معاملات الكلمات المفتاحية التي سيتم تمريرها إلى طريقة التكميم الأساسية التي سيتم استدعاؤها بناءً على quant_type.

أنواع التكميم المدعومة

يدعم ModelOpt تكميم الأوزان فقط، والقنوات، والكتل بصيغ int8 وfp8 وint4 وnf4 وnvfp4. صُممت طرق التكميم لتقليل البصمة الذاكرة لأوزان النموذج مع الحفاظ على أداء النموذج أثناء الاستدلال.

تخزين التكميم على الأوزان فقط يحفظ أوزان النموذج في نوع بيانات منخفض البتات محدد، لكنه يؤدي العمليات الحسابية بنوع بيانات أعلى دقة، مثل bfloat16. وهذا يقلل من متطلبات الذاكرة الناتجة عن أوزان النموذج، مع الحفاظ على ذروات الذاكرة اللازمة لحساب التنشيطات.

طرق التكميم المدعومة هي على النحو التالي:

نوع التكميم الأنظمة المدعومة معلمات الإلزامية ملاحظات إضافية
INT8 int8 weight only, int8 channel quantization, int8 block quantization quant_type, quant_type + channel_quantize, quant_type + channel_quantize + block_quantize
FP8 fp8 weight only, fp8 channel quantization, fp8 block quantization quant_type, quant_type + channel_quantize, quant_type + channel_quantize + block_quantize
INT4 int4 weight only, int4 block quantization quant_type, quant_type + channel_quantize + block_quantize channel_quantize = -1 is only supported for now
NF4 nf4 weight only, nf4 double block quantization quant_type, quant_type + channel_quantize + block_quantize + scale_channel_quantize + scale_block_quantize channel_quantize = -1 and scale_channel_quantize = -1 are only supported for now
NVFP4 nvfp4 weight only, nvfp4 block quantization quant_type, quant_type + channel_quantize + block_quantize channel_quantize = -1 is only supported for now

راجع وثائق modelopt الرسمية لفهم أفضل لطرق التكميم المتاحة والقائمة الشاملة لخيارات التكوين المتوفرة.

تسلسل وفك تسلسل النماذج المُكمّاة

لتسلسل نموذج مُكمَّم في نوع بيانات محدد، حمّل النموذج أولاً بنوع بيانات الكمّ المطلوب ثم احفظه باستخدام طريقة save_pretrained().

import torch
from diffusers import AutoModel, NVIDIAModelOptConfig
from modelopt.torch.opt import enable_huggingface_checkpointing

enable_huggingface_checkpointing()

model_id = "Efficient-Large-Model/Sana_600M_1024px_diffusers"
quant_config_fp8 = {"quant_type": "FP8", "quant_method": "modelopt"}
quant_config_fp8 = NVIDIAModelOptConfig(**quant_config_fp8)
model = AutoModel.from_pretrained(
    model_id,
    subfolder="transformer",
    quantization_config=quant_config_fp8,
    dtype=torch.bfloat16,
)
model.save_pretrained('path/to/sana_fp8', safe_serialization=False)

لتحميل نموذج كمّي مُسلسَل، استخدم طريقة from_pretrained().

import torch
from diffusers import AutoModel, NVIDIAModelOptConfig, SanaPipeline
from modelopt.torch.opt import enable_huggingface_checkpointing

enable_huggingface_checkpointing()

quantization_config = NVIDIAModelOptConfig(quant_type="FP8", quant_method="modelopt")
transformer = AutoModel.from_pretrained(
    "path/to/sana_fp8",
    subfolder="transformer",
    quantization_config=quantization_config,
    dtype=torch.bfloat16,
)
pipe = SanaPipeline.from_pretrained(
    "Efficient-Large-Model/Sana_600M_1024px_diffusers",
    transformer=transformer,
    dtype=torch.bfloat16,
)
pipe.to("cuda")  # or "mps", "xpu", "cpu"
prompt = "A cat holding a sign that says hello world"
image = pipe(
    prompt, num_inference_steps=50, guidance_scale=4.5, max_sequence_length=512
).images[0]
image.save("output.png")

Xet Storage Details

Size:
8.98 kB
·
Xet hash:
3d6ffd7455884d81a551f8987c05a3712cb748518b7337d703ae43ea764cd953

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.