Diffusers documentation
NVIDIA ModelOpt
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) عليها. على سبيل المثال، لتجنب أي تكميم في كتل الإسقاط الخاصة بـ 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")