Buckets:

mishig's picture
|
download
raw
8.03 kB

NVIDIA ModelOpt

NVIDIA-ModelOpt, kuantizasyon, budama, damıtma, spekülatif çözümleme gibi son teknoloji model optimizasyon tekniklerini bir araya getiren birleşik bir kütüphanedir. TensorRT-LLM veya TensorRT gibi aşağı akış dağıtım çerçeveleri için derin öğrenme modellerini sıkıştırarak çıkarım hızını optimize eder.

Başlamadan önce, nvidia_modelopt'un yüklü olduğundan emin olun.

pip install -U "nvidia_modelopt[hf]"

NVIDIAModelOptConfig nesnesini from_pretrained() fonksiyonuna geçirerek bir modeli kuantize edin (önceden kuantize edilmiş modelleri de yükleyebilirsiniz). Bu yöntem, Accelerate ile yüklemeyi destekleyen ve torch.nn.Linear katmanları içeren herhangi bir modalitedeki herhangi bir model için geçerlidir.

Aşağıdaki örnek yalnızca ağırlıkları FP8'e kuantize eder.

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")

Not:

NVIDIA-ModelOpt'taki kuantizasyon yöntemleri, model performansını korurken çeşitli QAT (Quantization-Aware Training) ve PTQ (Post-Training Quantization) tekniklerini kullanarak model ağırlıklarının bellek ayak izini azaltmak üzere tasarlanmıştır. Ancak, çıkarım sırasında elde edilen gerçek performans artışı, dağıtım çerçevesine (ör. TRT-LLM, TensorRT) ve belirli donanım yapılandırmasına bağlıdır.

Daha fazla ayrıntı burada bulunabilir.

NVIDIAModelOptConfig

NVIDIAModelOptConfig sınıfı üç parametre kabul eder:

  • quant_type: Aşağıdaki kuantizasyon türlerinden birini belirten bir dize değeri.
  • modules_to_not_convert: Kuantizasyonun uygulanmaması gereken modül tam/kısmi modül adlarının listesi. Örneğin, SD3Transformer2DModel'in pos_embed projeksiyon bloklarında herhangi bir kuantizasyon uygulanmaması için şu şekilde belirtilebilir: modules_to_not_convert=["pos_embed.proj.weight"].
  • disable_conv_quantization: Modeldeki tüm konvolüsyon katmanları için kuantizasyonu devre dışı bırakmak için True olarak ayarlanabilen bir boole değeri. Kanal ve blok kuantizasyonu genellikle konvolüsyon katmanlarıyla (INT4, NF4, NVFP4 ile kullanılır) iyi çalışmadığından bu özellik faydalıdır. Belirli konvolüsyon katmanları için kuantizasyonu devre dışı bırakmak istiyorsanız bunun yerine modules_to_not_convert kullanın.
  • algorithm: Ölçek belirlemek için kullanılacak algoritma, varsayılan olarak "max"'dır. Daha fazla algoritma ve detay için modelopt dokümantasyonunu kontrol edebilirsiniz.
  • forward_loop: Kuantizasyon sırasında aktivasyonların kalibre edilmesi için kullanılacak ileri döngü işlevi. Sağlanmazsa, yalnızca ağırlıklar kullanılarak hesaplanan statik ölçek değerlerine dayanır.
  • kwargs: quant_type'ye göre çağrılacak olan altta yatan kuantizasyon yöntemine iletilecek anahtar kelime argümanlarının sözlüğü.

Desteklenen kuantizasyon türleri

ModelOpt, int8, fp8, int4, nf4 ve nvfp4 için yalnızca ağırlık, kanal ve blok kuantizasyonunu destekler. Kuantizasyon yöntemleri, modelin çıkarım sırasında performansını korurken model ağırlıklarının bellek ayak izini azaltmak üzere tasarlanmıştır.

Sadece ağırlık kuantizasyonu, model ağırlıklarını belirli bir düşük bit veri türünde saklar ancak bfloat16 gibi daha yüksek hassasiyetli bir veri türüyle hesaplama yapar. Bu, model ağırlıklarından kaynaklanan bellek gereksinimini azaltır ancak aktivasyon hesaplama için bellek zirvelerini korur.

Desteklenen kuantizasyon yöntemleri aşağıdaki gibidir:

Kantizasyon Türü Desteklenen Şemalar Zorunlu Kwargs Ek Notlar
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

Mevcut kuantizasyon yöntemlerini ve kullanılabilen kapsamlı yapılandırma seçenekleri listesini daha iyi anlamak için resmi modelopt belgelerine başvurun.

Kantize modellerin seri hale getirilmesi ve dizide çıkarılması

Belirtilen bir dtype ile kuantize edilmiş bir modeli serialize etmek için, önce modeli istenen kuantizasyon dtype'i ile yükleyin ve ardından save_pretrained() yöntemini kullanarak kaydedin.

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)

Serileştirilmiş bir kuantize modeli yüklemek için from_pretrained() yöntemini kullanın.

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.03 kB
·
Xet hash:
7dcbefcf425942c9426600ed01bf85aa894e7b18cfa51747ed667de91387bb3c

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