Diffusers documentation

Quanto

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

Quanto

Backend Quanto telah ditinggalkan dan akan dihapus pada versi 1.0.0. Pertimbangkan untuk beralih ke salah satu backend kuantisasi lain yang didukung, seperti bitsandbytes atau torchao.

Quanto adalah backend kuantisasi PyTorch untuk Optimum. Ia dirancang dengan mempertimbangkan fleksibilitas dan kesederhanaan:

  • Semua fitur tersedia dalam mode eager (berfungsi dengan model yang tidak dapat dilacak)
  • Mendukung pelatihan yang sadar kuantisasi
  • Model terkuantisasi kompatibel dengan torch.compile
  • Model terkuantisasi bersifat tidak bergantung pada perangkat (misalnya CUDA, XPU, MPS, CPU)

Untuk menggunakan backend Quanto, Anda perlu menginstal optimum-quanto>=0.2.6 dan accelerate terlebih dahulu.

pip install optimum-quanto accelerate

Sekarang Anda dapat mengkuantisasi model dengan meneruskan objek QuantoConfig ke metode from_pretrained(). Meskipun pustaka Quanto mengizinkan pengkuantisasian modul nn.Conv2d dan nn.LayerNorm, saat ini Diffusers hanya mendukung pengkuantisasian bobot pada lapisan nn.Linear dari sebuah model. Cuplikan berikut menunjukkan cara menerapkan kuantisasi float8 dengan Quanto.

import torch
from diffusers import FluxTransformer2DModel, QuantoConfig

model_id = "black-forest-labs/FLUX.1-dev"
quantization_config = QuantoConfig(weights_dtype="float8")
transformer = FluxTransformer2DModel.from_pretrained(
      model_id,
      subfolder="transformer",
      quantization_config=quantization_config,
      dtype=torch.bfloat16,
)

pipe = FluxPipeline.from_pretrained(model_id, transformer=transformer, dtype=dtype)
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")

Mengabaikan Kuantisasi pada modul tertentu

Anda dapat melewati penerapan kuantisasi pada modul tertentu dengan menggunakan argumen modules_to_not_convert di QuantoConfig. Pastikan modul yang diteruskan ke argumen ini sesuai dengan kunci modul di state_dict

import torch
from diffusers import FluxTransformer2DModel, QuantoConfig

model_id = "black-forest-labs/FLUX.1-dev"
quantization_config = QuantoConfig(weights_dtype="float8", modules_to_not_convert=["proj_out"])
transformer = FluxTransformer2DModel.from_pretrained(
      model_id,
      subfolder="transformer",
      quantization_config=quantization_config,
      dtype=torch.bfloat16,
)

Menggunakan from_single_file dengan Backend Quanto

QuantoConfig kompatibel dengan ~FromOriginalModelMixin.from_single_file.

import torch
from diffusers import FluxTransformer2DModel, QuantoConfig

ckpt_path = "https://huggingface.co/black-forest-labs/FLUX.1-dev/blob/main/flux1-dev.safetensors"
quantization_config = QuantoConfig(weights_dtype="float8")
transformer = FluxTransformer2DModel.from_single_file(ckpt_path, quantization_config=quantization_config, dtype=torch.bfloat16)

Menyimpan model terkuantisasi

Diffusers mendukung serialisasi model Quanto menggunakan metode ~ModelMixin.save_pretrained.

Persyaratan serialisasi dan pemuatan berbeda untuk model yang dikuantisasi langsung dengan pustaka Quanto dan model yang dikuantisasi dengan Diffusers menggunakan Quanto sebagai backend. Saat ini, tidak mungkin memuat model yang dikuantisasi langsung dengan Quanto ke dalam Diffusers menggunakan ~ModelMixin.from_pretrained

import torch
from diffusers import FluxTransformer2DModel, QuantoConfig

model_id = "black-forest-labs/FLUX.1-dev"
quantization_config = QuantoConfig(weights_dtype="float8")
transformer = FluxTransformer2DModel.from_pretrained(
      model_id,
      subfolder="transformer",
      quantization_config=quantization_config,
      dtype=torch.bfloat16,
)
# save quantized model to reuse
transformer.save_pretrained("<your quantized model save path>")

# you can reload your quantized model with
model = FluxTransformer2DModel.from_pretrained("<your quantized model save path>")

Menggunakan torch.compile dengan Quanto

Saat ini backend Quanto mendukung torch.compile untuk tipe kuantisasi berikut:

  • Bobot int8
import torch
from diffusers import FluxPipeline, FluxTransformer2DModel, QuantoConfig

model_id = "black-forest-labs/FLUX.1-dev"
quantization_config = QuantoConfig(weights_dtype="int8")
transformer = FluxTransformer2DModel.from_pretrained(
    model_id,
    subfolder="transformer",
    quantization_config=quantization_config,
    dtype=torch.bfloat16,
)
transformer = torch.compile(transformer, mode="max-autotune", fullgraph=True)

pipe = FluxPipeline.from_pretrained(
    model_id, transformer=transformer, dtype=dtype
)
pipe.to("cuda")  # or "mps", "xpu", "cpu"
images = pipe("A cat holding a sign that says hello").images[0]
images.save("flux-quanto-compile.png")

Jenis Kuantisasi yang Didukung

Bobot

  • float8
  • int8
  • int4
  • int2
Update on GitHub