Transformers documentation
compressed-tensors
compressed-tensors
compressed-tensors, yoğun, int-kuantize (int8), float-kuantize (fp8) ve paket-kuantize (int32 içine paketlenmiş int4 veya int8 ağırlık-kuantize) gibi çeşitli kuantizasyon biçimlerini depolamak ve yüklemek için birleşik bir kontrol noktası biçimi sağlamak üzere safetensors dosyalarını sıkıştırılmış tensör veri türlerine genişletir.
compressed-tensors, PEFT ile ince ayarı destekler ve aşağıdaki özellikleri de içerir.
- fp8, int4, int8 ağırlık ve aktivasyon hassasiyetleri.
- tensor, channel, group, block, token için kuantizasyon ölçekleri ve sıfır noktası stratejileri.
- Dinamik token başına aktivasyon kuantizasyonu (veya herhangi bir statik strateji).
- Sadece nn.Linear modülleri değil, keyfi modüllerin kuantizasyonu.
- Ad veya sınıf üzerinden belirli modüller için hedefli destek.
En güncel kararlı sürümü (önerilen) almak için PyPI üzerinden compressed-tensors paketini yükleyin veya en güncel özelliklere erişmek için kaynak kodundan yükleyin.
pip install compressed-tensors
git clone https://github.com/neuralmagic/compressed-tensors
cd compressed-tensors
pip install -e .Hugging Face Hub'da uyumlu bir model bulmak için compressed-tensors etiketini kullanarak arama yapın.
Önceden kantize edilmiş modeller doğrudan yüklenebilir. Bir modeli compressed-tensors biçimine kantize etmek için llm-compressor dokümanına bakın. Alternatif olarak, modeller bağımsız olarak oluşturulup bir compressed-tensors yapılandırmasıyla serialize edilebilir.
from transformers import AutoModelForCausalLM
ct_model = AutoModelForCausalLM.from_pretrained("nm-testing/Meta-Llama-3.1-8B-Instruct-FP8-hf", device_map="auto")
# measure memory usage
mem_params = sum([param.nelement()*param.element_size() for param in ct_model.parameters()])
print(f"{mem_params/2**30:.4f} GB")
# 8.4575 GBYükleme modları
A compressed-tensors checkpoint, ağırlıklarını sıkıştırılmış biçimde (fp8 veya paketlenmiş int4/int8) saklar. Bu ağırlıkların nasıl çalıştırılacağı, iki CompressedTensorsConfig argümanına bağlıdır.
| Yapılandırma | Yükleme sonrası ağırlıklar | Çalıştırma |
|---|---|---|
| default | compressed-tensors biçiminde tutulur: her seri hale getirilmiş tensör (weight_packed, weight_scale, weight_zero_point, …) depolandığı gibi yüklenir | compressed-tensors katmanların sahibidir ve modeli ilk ileri geçişte sıkıştırmayı çözer |
dequantize=True | model dtype'ine (ör. BF16) yüklenirken sıkıştırması kaldırılır | herhangi bir quantization_scheme kalmamış düz bir yoğun model, bu nedenle w8a8 aktivasyonları da kuantize edilmez; bu dtype ile ince ayar yapılabilir veya bu dtype ile kaydedilebilir |
use_optimized_inference=True | kuantize olarak tutuldu | Çekirdeği içinden geçen bir şemaya sahip katmanlar, şu anda W8A8 fp8; yalnızca çıkarım |
Varsayılan olarak, save_pretrained() sıkıştırılmış tensörleri değiştirilmeden geri yazar; bu nedenle yüklenen model, aynı sıkıştırılmış tensör biçiminde kaydedilir.
FP8 çekirdek hızlandırma
FP8 compressed-tensors modelini FP8 olarak tutmak ve matmullarını donanım hızlandırmalı FP8 çekirdekleri (torch.nn.functional.scaled_mm, torch._scaled_mm_v2’ye yönlendirir; eski torch sürümleri torch._scaled_mm’e geri düşer) üzerinden çalıştırmak için use_optimized_inference=True parametresini geçirin; bunun yerine ağırlıkları BF16’ya dekantize etmek yerine. Ağırlıkları çıkarım boyunca FP8’de tutmak bellek kullanımını azaltır ve hesaplamayı hızlandırır. Bu yalnızca çıkarım içindir, bu nedenle ince ayar yaparken kapalı bırakın.
| Cihaz | Çekirdek | Notlar |
|---|---|---|
| Intel XPU | torch.nn.functional.scaled_mm | FP8 desteğine sahip tüm XPU cihazları |
| NVIDIA CUDA (SM89+) | torch.nn.functional.scaled_mm | Ada Lovelace (L4, L40), Hopper (H100), Blackwell ve daha yeni |
| Apple silikonu (MPS) | torch.nn.functional.scaled_mm | torch >= 2.15 gerektirir |
| CPU / CUDA SM80 (A100) / MPS, torch < 2.15 | Yedek | use_optimized_inference=True parametresi yok sayılır, model dequantize edilmiş olarak çalışır |
FP8 çekirdek yolu bu kuantizasyon yerleşimlerini destekler.
| Strateji | Örnek model |
|---|---|
| Kanal başına dinamik | RedHatAI/Meta-Llama-3.1-8B-Instruct-FP8-dynamic |
| Gergi başına statik | RedHatAI/Meta-Llama-3.1-8B-Instruct-FP8 |
Önceden FP8 olarak kuantize edilmiş bir modelin yüklenmesi
FP8 çekirdekleri isteğe bağlıdır: use_optimized_inference=True ile talep edin; model yapılandırması FP8 kuantizasyonunu belirtiyorsa ve desteklenen bir GPU mevcutsa kullanılırlar.
from transformers import AutoModelForCausalLM, AutoTokenizer, CompressedTensorsConfig
model = AutoModelForCausalLM.from_pretrained(
"RedHatAI/Meta-Llama-3.1-8B-Instruct-FP8-dynamic",
quantization_config=CompressedTensorsConfig(use_optimized_inference=True),
device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained("RedHatAI/Meta-Llama-3.1-8B-Instruct-FP8-dynamic")
inputs = tokenizer("Hello, how are you?", return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_new_tokens=20)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))Yükleme sırasında dekuantizasyon
use_optimized_inference=True kullanılmadığında model, standart compressed-tensors yolunu izler: ağırlıklar sıkıştırılmış halde bırakılır ve compressed-tensors bunları ilk ileri geçişte (forward pass) sıkıştırmasını çözer. Modeli ince ayarlamak (fine-tune) veya orijinal hassasiyetinde (ör. BF16) kaydetmek istiyorsanız, bunun yerine yükleme sırasında sıkıştırmasını çözmek için dequantize=True parametresini iletin. Sonuç, düz bir yoğun (dense) modeldir: compressed-tensors şeması eklenmediğinden, aktivasyon kuantizasyonu (ör. w8a8) da düşer.
from transformers import AutoModelForCausalLM, CompressedTensorsConfig
model = AutoModelForCausalLM.from_pretrained(
"RedHatAI/Meta-Llama-3.1-8B-Instruct-FP8-dynamic",
quantization_config=CompressedTensorsConfig(dequantize=True),
device_map="auto",
)Model kontrol noktası
Compressed-tensor modelleri, yapılandırma girdisi üzerinden tanımlanır. Aşağıdaki örnek, nm-testing/Meta-Llama-3.1-8B-Instruct-FP8-hf config.json dosyasından alınmıştır.
Sıkıştırma sırasında ve sonrasında esnek ifadeye izin verecek şekilde birçok giriş bulunsa da, yükleme ve çıkarım için girişler, yalnızca birkaç ana girişe odaklanacak şekilde basitleştirilebilir.
"quantization_config": {
"config_groups": {
"group_0": {
"input_activations": {
"num_bits": 8,
"strategy": "tensor",
"type": "float"
},
"targets": ["Linear"],
"weights": {
"num_bits": 8,
"strategy": "tensor",
"type": "float"
}
}
},
"format": "naive-quantized",
"ignore": ["lm_head"],
"quant_method": "compressed-tensors",
"quantization_status": "frozen"
},Yapılandırma dosyası, ağırlık ve aktivasyonların statik tensör başına stratejiyle fp8'e kuantize edildiği bir yapılandırma grubunun (group_0) kuantizasyonunu belirtir. ignore anahtarında gösterildiği üzere lm_head modülü kuantize edilmemiştir.
Model ağırlıklarına daha ayrıntılı bir bakış için, model kartındaki safetensors görüntüleyicisini kullanarak tüm nn.Linear modülleri için kuantize ağırlıkları, giriş ölçeğini ve ağırlık ölçeğini görüntüleyin.
| Tensörler | Biçim | Hassasiyet |
|---|---|---|
| model.layers.0.input_layernorm.weight | [4 096] | BF16 |
| model.layers.0.mlp.down_proj.input_scale | [1] | BF16 |
| model.layers.0.mlp.down_proj.weight | [4 096, 14 336] | F8_E4M3 |
| model.layers.0.mlp.down_proj.weight_scale | [1] | BF16 |
| model.layers.0.mlp.gate_proj.input_scale | [1] | BF16 |
| model.layers.0.mlp.gate_proj.weight | [14 336, 4 096] | F8_E4M3 |
| model.layers.0.mlp.gate_proj.weight_scale | [1] | BF16 |
| model.layers.0.mlp.up_proj.input_scale | [1] | BF16 |
| model.layers.0.mlp.up_proj.weight | [14 336, 4 096] | F8_E4M3 |
| model.layers.0.mlp.up_proj.weight_scale | [1] | BF16 |
| model.layers.0.post_attention_layernorm.weight | [4 096] | BF16 |
| model.layers.0.self_attn.k_proj.input_scale | [1] | BF16 |
| model.layers.0.self_attn.k_proj.weight | [1 024, 4 096] | F8_E4M3 |
| model.layers.0.self_attn.k_proj.weight_scale | [1] | BF16 |
| model.layers.0.self_attn.o_proj.input_scale | [1] | BF16 |
| model.layers.0.self_attn.o_proj.weight | [4 096, 4 096] | F8_E4M3 |
| model.layers.0.self_attn.o_proj.weight_scale | [1] | BF16 |
| model.layers.0.self_attn.q_proj.input_scale | [1] | BF16 |
| model.layers.0.self_attn.q_proj.weight | [4 096, 4 096] | F8_E4M3 |
| model.layers.0.self_attn.q_proj.weight_scale | [1] | BF16 |
| model.layers.0.self_attn.v_proj.input_scale | [1] | BF16 |
| model.layers.0.self_attn.v_proj.weight | [1 024, 4 096] | F8_E4M3 |
| model.layers.0.self_attn.v_proj.weight_scale | [1] | BF16 |
~quantizers.HFQuantizer entegrasyonu ile bir compressed-tensors modeli yüklendiğinde, hedeflenen modüller compressed-tensors'a devredilir: çözümlenmiş quantization_scheme eklenir, quantization_status ayarlanır, checkpoint'in sakladığı parametreler (weight fp8'de, ayrıca weight_scale ve statik bir strateji için input_scale) kaydedilir ve bunların üzerine kendi forward geçişi kurulur. Modüller nn.Linear örnekleri olarak kaldığı için print bunu gösterir — güncel compressed-tensors sürümleri artık bunları bir CompressedLinear alt sınıfıyla sarmalamaz. ignore altında listelenen modüller, örneğin lm_head, olduğu gibi bırakılır.
dequantize=False (varsayılan) kullanıldığında, yükleme işlemi tamamlandığında ağırlıklar hâlâ sıkıştırılmış kalır ve compressed-tensors, modelin tamamını ilk ileri geçişte (forward pass) açar. dequantize=True ise her ağırlığı yüklenirken açar; bu sayede yoğun (dense) ağırlıklara ulaşmak için ileri geçiş gerekmez ve modüller, quantization_scheme içermeyen düz yoğun katmanlardır.
import torch
from transformers import AutoModelForCausalLM, CompressedTensorsConfig
model_id = "nm-testing/Meta-Llama-3.1-8B-Instruct-FP8-hf"
ct_model = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=CompressedTensorsConfig(dequantize=False),
device_map="auto",
)
q_proj = ct_model.model.layers[0].self_attn.q_proj
print(q_proj, q_proj.quantization_status)
# Linear(in_features=4096, out_features=4096, bias=False) QuantizationStatus.COMPRESSED
# ^ compressed-tensors module: fp8 weight, weight_scale, and its own forward
ct_model(input_ids=torch.tensor([[0, 1, 2]], device=ct_model.device))
print(q_proj, q_proj.quantization_status)
# Linear(in_features=4096, out_features=4096, bias=False) QuantizationStatus.DECOMPRESSED
# ^ weight is BF16 now, decompressed by that forward pass
ct_model = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=CompressedTensorsConfig(dequantize=True),
device_map="auto",
)
print(ct_model.model.layers[0].self_attn.q_proj)
# Linear(in_features=4096, out_features=4096, bias=False) weight: BF16use_optimized_inference=True kullanıldığında, bir fp8 yapılandırma grubu kapsamındaki katmanlar, fp8 ağırlığı ve ölçeğini satır bazlı matmul çekirdeğinin beklediği yerleşimde tutan CompressedTensorsFP8Linear ile değiştirilir. Bu ağırlıklar, ileri geçişler dahil olmak üzere fp8 olarak kalır.
from transformers import AutoModelForCausalLM, CompressedTensorsConfig
ct_model = AutoModelForCausalLM.from_pretrained(
"nm-testing/Meta-Llama-3.1-8B-Instruct-FP8-hf",
quantization_config=CompressedTensorsConfig(use_optimized_inference=True),
device_map="auto",
)
print(ct_model.model.layers[0].self_attn.q_proj)
# CompressedTensorsFP8Linear(in_features=4096, out_features=4096, bias=False) weight: F8_E4M3