# Начало работы

Квантование направлено на представление данных с меньшим количеством битов при сохранении точности исходных данных. Это часто означает преобразование типа данных для представления той же информации с меньшим числом битов. Например, если веса вашей модели хранятся в формате 32-битных чисел с плавающей запятой и квантуются до 16-битных чисел с плавающей запятой, размер модели уменьшается вдвое, что облегчает её хранение и снижает потребление памяти. Более низкая точность также может ускорить инференс, поскольку выполнение вычислений с меньшим числом битов занимает меньше времени.

Diffusers поддерживает несколько бэкендов квантования, чтобы сделать крупные диффузионные модели, такие как [Flux](../api/pipelines/flux), более доступными. В этом руководстве показано, как использовать класс [PipelineQuantizationConfig](/docs/diffusers/main/ru/api/quantization#diffusers.PipelineQuantizationConfig) для квантования пайплайна при его инициализации из предобученной или неквантованной контрольной точки.

## Квантование на уровне пайплайна

Существует два способа использования [PipelineQuantizationConfig](/docs/diffusers/main/ru/api/quantization#diffusers.PipelineQuantizationConfig) в зависимости от того, насколько глубоко вы хотите настроить конфигурацию квантования.

- для базовых сценариев использования определите аргументы `quant_backend`, `quant_kwargs` и `components_to_quantize`
- для детального управления квантованием определите `quant_mapping`, который предоставляет конфигурацию квантования для отдельных компонентов модели

### Базовая квантизация

Инициализируйте [PipelineQuantizationConfig](/docs/diffusers/main/ru/api/quantization#diffusers.PipelineQuantizationConfig) со следующими параметрами.

- `quant_backend` определяет, какой бэкенд квантования использовать. В настоящее время поддерживаются следующие бэкенды: `bitsandbytes_4bit`, `bitsandbytes_8bit`, `gguf`, `quanto` и `torchao`.
- `quant_kwargs` задаёт аргументы квантования, которые следует использовать.

> [!TIP]
> Аргументы `quant_kwargs` различаются в зависимости от бэкенда. Чтобы просмотреть аргументы для каждого бэкенда, обратитесь к документации [Quantization API](../api/quantization).

- `components_to_quantize` определяет, какие компоненты пайплайна следует квантовать. Как правило, квантовать нужно наиболее вычислительно затратные компоненты, например трансформер. Если в пайплайне есть несколько текстовых энкодеров, как в [FluxPipeline](/docs/diffusers/main/ru/api/pipelines/flux#diffusers.FluxPipeline), стоит рассмотреть квантование и их. В примере ниже квантуется текстовый энкодер T5 в [FluxPipeline](/docs/diffusers/main/ru/api/pipelines/flux#diffusers.FluxPipeline), при этом модель CLIP остаётся без изменений.

   `components_to_quantize` принимает список для нескольких моделей или строку для одной модели.

Пример ниже загружает бэкенд bitsandbytes со следующими аргументами из [BitsAndBytesConfig](/docs/diffusers/main/ru/api/quantization#diffusers.BitsAndBytesConfig): `load_in_4bit`, `bnb_4bit_quant_type` и `bnb_4bit_compute_dtype`.

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

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_quant_config` в [from_pretrained()](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained), чтобы квантовать пайплайн.

```py
pipe = DiffusionPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

image = pipe("photo of a cute dog").images[0]
```

### Расширенная квантизация

Аргумент `quant_mapping` предоставляет дополнительные варианты для квантования каждого отдельного компонента в конвейере, например, для объединения различных бэкендов квантования.

Инициализируйте [PipelineQuantizationConfig](/docs/diffusers/main/ru/api/quantization#diffusers.PipelineQuantizationConfig) и передайте в него `quant_mapping`. С помощью `quant_mapping` вы можете указать параметры квантования для каждого компонента конвейера, например, для трансформера и текстового энкодера.

Пример ниже использует два бэкенда квантования, [QuantoConfig](/docs/diffusers/main/ru/api/quantization#diffusers.QuantoConfig) и [transformers.BitsAndBytesConfig](https://huggingface.co/docs/transformers/main/en/main_classes/quantization#transformers.BitsAndBytesConfig), для трансформера и текстового энкодера.

```py
import torch
from diffusers import DiffusionPipeline
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig
from diffusers.quantizers.quantization_config import QuantoConfig
from diffusers.quantizers import PipelineQuantizationConfig
from transformers import BitsAndBytesConfig as TransformersBitsAndBytesConfig

pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={
        "transformer": QuantoConfig(weights_dtype="int8"),
        "text_encoder_2": TransformersBitsAndBytesConfig(
            load_in_4bit=True, compute_dtype=torch.bfloat16
        ),
    }
)
```

В [Transformers](https://huggingface.co/docs/transformers/main_classes/quantization#transformers.BitsAndBytesConfig) есть отдельный backend bitsandbytes. Для компонентов, поступающих из Transformers, необходимо импортировать и использовать [transformers.BitsAndBytesConfig](https://huggingface.co/docs/transformers/main/en/main_classes/quantization#transformers.BitsAndBytesConfig). Например, `text_encoder_2` в [FluxPipeline](/docs/diffusers/main/ru/api/pipelines/flux#diffusers.FluxPipeline) является [T5EncoderModel](https://huggingface.co/docs/transformers/main/en/model_doc/t5#transformers.T5EncoderModel) из Transformers, поэтому нужно использовать [transformers.BitsAndBytesConfig](https://huggingface.co/docs/transformers/main/en/main_classes/quantization#transformers.BitsAndBytesConfig) вместо [diffusers.BitsAndBytesConfig](/docs/diffusers/main/ru/api/quantization#diffusers.BitsAndBytesConfig).

> [!TIP]
> Используйте метод [базовой квантизации](#basic-quantization), описанный выше, если вы не хотите управлять этими отдельными импортами или не уверены, откуда берётся каждый компонент конвейера.

```py
import torch
from diffusers import DiffusionPipeline
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig
from diffusers.quantizers import PipelineQuantizationConfig
from transformers import BitsAndBytesConfig as TransformersBitsAndBytesConfig

pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={
        "transformer": DiffusersBitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16),
        "text_encoder_2": TransformersBitsAndBytesConfig(
            load_in_4bit=True, compute_dtype=torch.bfloat16
        ),
    }
)
```

Передайте `pipeline_quant_config` в [from_pretrained()](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained), чтобы квантовать пайплайн.

```py
pipe = DiffusionPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

image = pipe("photo of a cute dog").images[0]
```

## Загрузка предквантованных контрольных точек

Некоторые бэкенды квантования поддерживают загрузку контрольных точек, которые уже были квантованы и загружены в Hub. В этом случае конфигурация квантования хранится в файле `config.json` модели и читается автоматически — вам не нужно создавать [PipelineQuantizationConfig](/docs/diffusers/main/ru/api/quantization#diffusers.PipelineQuantizationConfig) или передавать аргумент `quantization_config`.

```py
import torch
from diffusers import DiffusionPipeline

pipe = DiffusionPipeline.from_pretrained(
    "rootonchair/ERNIE-Image-Turbo-nunchaku-lite-nvfp4",
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"
```

Следующие бэкенды поддерживают загрузку предквантованных контрольных точек из коробки.

| Бэкенд | Примечания |
|---|---|
| [bitsandbytes](./bitsandbytes) | Конфигурация сохраняется в `config.json`; дополнительные аргументы не требуются. Поддерживает как квантование на лету, так и загрузку предварительно квантованных контрольных точек. |
| [torchao](./torchao) | Аналогично вышеприведенному. |
| [GGUF](./gguf) | Использует `from_single_file` с классами моделей; загрузка на уровне пайплайна не поддерживается. |
| [BFL](./bfl) | Загружает однофайловые чекпоинты Black Forest Labs `fp8r` и `nvfp4` с помощью `from_single_file`; загрузка на уровне пайплайна не поддерживается. |
| [AutoRound](./autoround) | Поддерживается только загрузка; сначала выполните квантование с помощью AutoRound CLI или Python API. |
| [Nunchaku Lite](./nunchaku) | Конфигурация сохраняется в `config.json`; требуется пакет `kernels`. Поддерживается только загрузка. |
| [ModelOpt](./modelopt) | Поддерживается только загрузка предварительно квантованных моделей. |
| [SDNQ](./sdnq) | Поддерживает как квантование на лету, так и загрузку предварительно квантованных моделей; требуется пакет `sdnq`. |

## Ресурсы

Ознакомьтесь с материалами ниже, чтобы узнать больше о квантовании.

- Если вы только начинаете знакомство с квантованием, мы рекомендуем пройти следующие вводные курсы, созданные совместно с DeepLearning.AI.

    - [Основы квантования с Hugging Face](https://www.deeplearning.ai/short-courses/quantization-fundamentals-with-hugging-face/)
    - [Квантование: подробный разбор](https://www.deeplearning.ai/short-courses/quantization-in-depth/)

- Если вы хотите добавить новый метод квантования, обратитесь к [руководству по добавлению нового метода квантования](https://huggingface.co/docs/transformers/main/en/quantization/contribute).

- Обзор квантования в Transformers [Overview](https://huggingface.co/docs/transformers/quantization/overview#when-to-use-what) содержит краткое описание преимуществ и недостатков различных бэкендов квантования.

- Ознакомьтесь с блогом [Exploring Quantization Backends in Diffusers](https://huggingface.co/blog/diffusers-quantization), где кратко описаны каждый из бэкендов квантования, принципы выбора бэкенда и способы сочетания квантования с другими методами оптимизации памяти.

