Buckets:

mishig's picture
|
download
raw
14.4 kB

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

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

Diffusers поддерживает несколько бэкендов квантования, чтобы сделать крупные диффузионные модели, такие как Flux, более доступными. В этом руководстве показано, как использовать класс PipelineQuantizationConfig для квантования пайплайна при его инициализации из предобученной или неквантованной контрольной точки.

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

Существует два способа использования PipelineQuantizationConfig в зависимости от того, насколько глубоко вы хотите настроить конфигурацию квантования.

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

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

Инициализируйте PipelineQuantizationConfig со следующими параметрами.

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

Аргументы quant_kwargs различаются в зависимости от бэкенда. Чтобы просмотреть аргументы для каждого бэкенда, обратитесь к документации Quantization API.

  • components_to_quantize определяет, какие компоненты пайплайна следует квантовать. Как правило, квантовать нужно наиболее вычислительно затратные компоненты, например трансформер. Если в пайплайне есть несколько текстовых энкодеров, как в FluxPipeline, стоит рассмотреть квантование и их. В примере ниже квантуется текстовый энкодер T5 в FluxPipeline, при этом модель CLIP остаётся без изменений.

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

Пример ниже загружает бэкенд bitsandbytes со следующими аргументами из BitsAndBytesConfig: load_in_4bit, bnb_4bit_quant_type и bnb_4bit_compute_dtype.

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(), чтобы квантовать пайплайн.

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 и передайте в него quant_mapping. С помощью quant_mapping вы можете указать параметры квантования для каждого компонента конвейера, например, для трансформера и текстового энкодера.

Пример ниже использует два бэкенда квантования, QuantoConfig и transformers.BitsAndBytesConfig, для трансформера и текстового энкодера.

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 есть отдельный backend bitsandbytes. Для компонентов, поступающих из Transformers, необходимо импортировать и использовать transformers.BitsAndBytesConfig. Например, text_encoder_2 в FluxPipeline является T5EncoderModel из Transformers, поэтому нужно использовать transformers.BitsAndBytesConfig вместо diffusers.BitsAndBytesConfig.

Используйте метод базовой квантизации, описанный выше, если вы не хотите управлять этими отдельными импортами или не уверены, откуда берётся каждый компонент конвейера.

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(), чтобы квантовать пайплайн.

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 или передавать аргумент quantization_config.

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 Конфигурация сохраняется в config.json; дополнительные аргументы не требуются. Поддерживает как квантование на лету, так и загрузку предварительно квантованных контрольных точек.
torchao Аналогично вышеприведенному.
GGUF Использует from_single_file с классами моделей; загрузка на уровне пайплайна не поддерживается.
BFL Загружает однофайловые чекпоинты Black Forest Labs fp8r и nvfp4 с помощью from_single_file; загрузка на уровне пайплайна не поддерживается.
AutoRound Поддерживается только загрузка; сначала выполните квантование с помощью AutoRound CLI или Python API.
Nunchaku Lite Конфигурация сохраняется в config.json; требуется пакет kernels. Поддерживается только загрузка.
ModelOpt Поддерживается только загрузка предварительно квантованных моделей.
SDNQ Поддерживает как квантование на лету, так и загрузку предварительно квантованных моделей; требуется пакет sdnq.

Ресурсы

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

Xet Storage Details

Size:
14.4 kB
·
Xet hash:
1a1aa70b3772bfeb293e73f98f82e2bd0ecead3b8d8b2e22962aafcb66a5608a

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.