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

O backend Quanto está obsoleto e será removido na versão 1.0.0. Considere alternar para um dos outros backends de quantização suportados, como bitsandbytes ou torchao.

Quanto é um backend de quantização do PyTorch para o Optimum. Ele foi projetado com foco em versatilidade e simplicidade:

  • Todos os recursos estão disponíveis no modo eager (funciona com modelos que não podem ser rastreados)
  • Suporta treinamento com quantização
  • Modelos quantizados são compatíveis com torch.compile
  • Modelos quantizados são agnósticos em relação ao dispositivo (por exemplo, CUDA, XPU, MPS, CPU)

Para usar o backend Quanto, você primeiro precisa instalar optimum-quanto>=0.2.6 e accelerate

pip install optimum-quanto accelerate

Agora você pode quantizar um modelo passando o objeto QuantoConfig para o método from_pretrained(). Embora a biblioteca Quanto permita quantizar os módulos nn.Conv2d e nn.LayerNorm, atualmente, o Diffusers suporta apenas a quantização dos pesos nas camadas nn.Linear de um modelo. O trecho a seguir demonstra como aplicar a quantização float8 com o 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")

Pular a Quantização em módulos específicos

É possível pular a aplicação de quantização em determinados módulos usando o argumento modules_to_not_convert no QuantoConfig. Certifique-se de que os módulos passados para este argumento correspondam às chaves dos módulos no 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,
)

Usando from_single_file com o Backend Quanto

QuantoConfig é compatível com ~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)

Salvando modelos quantizados

O Diffusers suporta a serialização de modelos Quanto usando o método ~ModelMixin.save_pretrained.

Os requisitos de serialização e carregamento são diferentes para modelos quantizados diretamente com a biblioteca Quanto e modelos quantizados com Diffusers usando Quanto como backend. Atualmente, não é possível carregar modelos quantizados diretamente com Quanto no Diffusers usando ~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>")

Usando torch.compile com Quanto

Atualmente, o backend Quanto suporta torch.compile para os seguintes tipos de quantização:

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

Tipos de Quantização Suportados

Pesos

  • float8
  • int8
  • int4
  • int2
Update on GitHub