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.43.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Quanto

Бэкенд Quanto устарел и будет удалён в версии 1.0.0. Рекомендуется перейти на один из других поддерживаемых бэкендов квантования, например bitsandbytes или torchao.

Quanto — это бэкенд квантования для PyTorch в Optimum. Он создан с упором на универсальность и простоту:

  • Все функции доступны в режиме eager (работает с моделями, которые нельзя проследить)
  • Поддерживает обучение с учётом квантования
  • Квантованные модели совместимы с torch.compile
  • Квантованные модели не зависят от устройства (например, CUDA, XPU, MPS, CPU)

Чтобы использовать бэкенд Quanto, сначала необходимо установить optimum-quanto>=0.2.6 и accelerate

pip install optimum-quanto accelerate

Теперь вы можете квантовать модель, передав объект QuantoConfig в метод from_pretrained(). Хотя библиотека Quanto позволяет квантовать модули nn.Conv2d и nn.LayerNorm, в настоящее время Diffusers поддерживает квантование только весов в слоях nn.Linear модели. Приведённый ниже фрагмент кода демонстрирует, как применить квантование float8 с помощью 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")

Пропуск квантования для конкретных модулей

С помощью аргумента modules_to_not_convert в QuantoConfig можно пропустить применение квантования для определённых модулей. Убедитесь, что модули, переданные в этот аргумент, соответствуют ключам модулей в 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,
)

Использование from_single_file с бэкендом Quanto

QuantoConfig совместим с ~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)

Сохранение квантованных моделей

Diffusers поддерживает сериализацию моделей Quanto с помощью метода ~ModelMixin.save_pretrained.

Требования к сериализации и загрузке различаются для моделей, квантованных непосредственно с помощью библиотеки Quanto, и моделей, квантованных с помощью Diffusers с использованием Quanto в качестве бэкенда. В настоящее время невозможно загрузить модели, квантованные непосредственно с помощью Quanto, в Diffusers с использованием ~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>")

Использование torch.compile с Quanto

В настоящее время бэкенд Quanto поддерживает torch.compile для следующих типов квантования:

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

Поддерживаемые типы квантования

Веса

  • float8
  • int8
  • int4
  • int2
Update on GitHub