Diffusers documentation

Компиляция и выгрузка квантованных моделей

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

Компиляция и выгрузка квантованных моделей

Оптимизация моделей часто связана с компромиссом между скоростью вывода и потреблением памяти. Например, хотя кэширование может ускорить вывод, оно также увеличивает потребление памяти, поскольку требует хранения выходов промежуточных слоев внимания. Более сбалансированная стратегия оптимизации сочетает квантование модели, torch.compile и различные методы выгрузки.

Ознакомьтесь с руководством по torch.compile, чтобы узнать больше о компиляции и о том, как её можно применить здесь. Например, региональная компиляция может значительно сократить время компиляции, не теряя при этом в ускорении.

Для генерации изображений сочетание квантования и выгрузки модели часто обеспечивает наилучший баланс между качеством, скоростью и потреблением памяти. Групповая выгрузка менее эффективна для генерации изображений, поскольку обычно невозможно полностью перекрыть передачу данных, если ядро вычислений завершается быстрее. Это приводит к некоторому накладному расходу на коммуникацию между CPU и GPU.

Для генерации видео сочетание квантования и group-offloading обычно даёт лучший результат, поскольку модели для видео более ограничены по вычислительным мощностям.

Таблица ниже содержит сравнение комбинаций стратегий оптимизации и их влияния на задержку и потребление памяти для Flux.

комбинациязадержка (с)потребление памяти (ГБ)
квантование32.60214.9453
квантование, torch.compile25.84714.9448
квантование, torch.compile, выгрузка модели на CPU32.31212.2369
These results are benchmarked on Flux with a RTX 4090. The transformer and text_encoder components are quantized. Refer to the benchmarking script if you're interested in evaluating your own model.

В этом руководстве показано, как скомпилировать и выгрузить квантованную модель с помощью bitsandbytes. Убедитесь, что вы используете PyTorch nightly и последнюю версию bitsandbytes.

Хотя в этом примере мы используем bitsandbytes, другие бэкенды квантования, такие как TorchAO, также поддерживают эти функции.

pip install -U bitsandbytes

Квантование и torch.compile

Начните с квантования модели для сокращения объёма памяти, необходимого для её хранения, и компиляции для ускорения вывода.

Настройте Dynamo с параметром capture_dynamic_output_shape_ops = True, чтобы обрабатывать динамические выходные данные при компиляции моделей bitsandbytes.

import torch
from diffusers import DiffusionPipeline
from diffusers.quantizers import PipelineQuantizationConfig

torch._dynamo.config.capture_dynamic_output_shape_ops = True

# quantize
pipeline_quant_config = PipelineQuantizationConfig(
    quant_backend="bitsandbytes_4bit",
    quant_kwargs={"load_in_4bit": True, "bnb_4bit_quant_type": "nf4", "bnb_4bit_compute_dtype": torch.bfloat16},
    components_to_quantize=["transformer", "text_encoder_2"],
)
pipeline = DiffusionPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

# compile
pipeline.transformer.to(memory_format=torch.channels_last)
pipeline.transformer.compile(mode="max-autotune", fullgraph=True)
pipeline("""
    cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
    highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
"""
).images[0]

Квантование, torch.compile и выгрузка

Помимо квантования и torch.compile, попробуйте offloading, если вам нужно дополнительно снизить потребление памяти. Offloading перемещает различные слои или компоненты модели с CPU на GPU по мере необходимости для вычислений.

Настройте Dynamo cache_size_limit при offloading, чтобы избежать чрезмерной перекомпиляции, и установите capture_dynamic_output_shape_ops = True для обработки динамических выходов при компиляции моделей bitsandbytes.

offloading модели на CPU
group offloading

Перемещение модели на CPU переносит отдельный компонент конвейера, например трансформерную модель, на GPU, когда она требуется для вычислений. В остальное время компонент перемещается на CPU.

import torch
from diffusers import DiffusionPipeline
from diffusers.quantizers import PipelineQuantizationConfig

torch._dynamo.config.cache_size_limit = 1000
torch._dynamo.config.capture_dynamic_output_shape_ops = True

# quantize
pipeline_quant_config = PipelineQuantizationConfig(
    quant_backend="bitsandbytes_4bit",
    quant_kwargs={"load_in_4bit": True, "bnb_4bit_quant_type": "nf4", "bnb_4bit_compute_dtype": torch.bfloat16},
    components_to_quantize=["transformer", "text_encoder_2"],
)
pipeline = DiffusionPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

# model CPU offloading
pipeline.enable_model_cpu_offload()

# compile
pipeline.transformer.compile()
pipeline(
    "cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California, highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain"
).images[0]
Update on GitHub