Diffusers documentation

NVIDIA ModelOpt

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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. وهذا يقلل من متطلبات الذاكرة الناتجة عن أوزان النموذج، مع الحفاظ على ذروات الذاكرة اللازمة لحساب التنشيطات.

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

نوع التكميمالأنظمة المدعومةمعلمات الإلزاميةملاحظات إضافية
INT8int8 weight only, int8 channel quantization, int8 block quantizationquant_type, quant_type + channel_quantize, quant_type + channel_quantize + block_quantize
FP8fp8 weight only, fp8 channel quantization, fp8 block quantizationquant_type, quant_type + channel_quantize, quant_type + channel_quantize + block_quantize
INT4int4 weight only, int4 block quantizationquant_type, quant_type + channel_quantize + block_quantizechannel_quantize = -1 is only supported for now
NF4nf4 weight only, nf4 double block quantizationquant_type, quant_type + channel_quantize + block_quantize + scale_channel_quantize + scale_block_quantizechannel_quantize = -1 and scale_channel_quantize = -1 are only supported for now
NVFP4nvfp4 weight only, nvfp4 block quantizationquant_type, quant_type + channel_quantize + block_quantizechannel_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")
Update on GitHub