Transformers documentation

compressed-tensors

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

and get access to the augmented documentation experience

to get started

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.

PyPI
kaynak kod
pip install compressed-tensors

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 GB

Yü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ırmaYükleme sonrası ağırlıklarÇalıştırma
defaultcompressed-tensors biçiminde tutulur: her seri hale getirilmiş tensör (weight_packed, weight_scale, weight_zero_point, …) depolandığı gibi yüklenircompressed-tensors katmanların sahibidir ve modeli ilk ileri geçişte sıkıştırmayı çözer
dequantize=Truemodel dtype'ine (ör. BF16) yüklenirken sıkıştırması kaldırılırherhangi 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=Truekuantize 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ÇekirdekNotlar
Intel XPUtorch.nn.functional.scaled_mmFP8 desteğine sahip tüm XPU cihazları
NVIDIA CUDA (SM89+)torch.nn.functional.scaled_mmAda Lovelace (L4, L40), Hopper (H100), Blackwell ve daha yeni
Apple silikonu (MPS)torch.nn.functional.scaled_mmtorch >= 2.15 gerektirir
CPU / CUDA SM80 (A100) / MPS, torch < 2.15Yedekuse_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 dinamikRedHatAI/Meta-Llama-3.1-8B-Instruct-FP8-dynamic
Gergi başına statikRedHatAI/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örlerBiçimHassasiyet
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: BF16

use_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
Update on GitHub