Diffusers documentation
Квантование
Квантование
Техники квантования снижают затраты памяти и вычислительных ресурсов, представляя веса и активации с помощью типов данных с пониженной точностью, таких как 8-битные целые числа (int8). Это позволяет загружать более крупные модели, которые в обычном режиме не помещаются в память, и ускорять инференс.
Узнайте, как квантовать модели, в руководстве Квантование.
PipelineQuantizationConfig
класс diffusers.PipelineQuantizationConfig
< source >( quant_backend: str = Nonequant_kwargs: dict[str, str | float | int | dict] = Nonecomponents_to_quantize: list[str] | str | None = Nonequant_mapping: dict[str, DiffQuantConfigMixin | 'TransformersQuantConfigMixin'] = None )
Параметры
- quant_backend (
str) — Бэкенд квантования, который будет использоваться. При использовании этого параметра предполагается, что бэкенд доступен как дляdiffusers, так и дляtransformers. - quant_kwargs (
dict) — Параметры для инициализации класса бэкенда квантования. - components_to_quantize (
list) — Компоненты конвейера, подлежащие квантованию. - quant_mapping (
dict) — Соответствие, определяющее спецификации квантования, используемые для компонентов конвейера. При использовании этого аргумента от пользователей не ожидается предоставлениеquant_backend,quant_kawargsиcomponents_to_quantize.
Класс конфигурации, используемый при применении квантования на лету в from_pretrained().
BFLQuantizationConfig
класс diffusers.BFLQuantizationConfig
< source >( compute_dtype: 'torch.dtype' | None = None )
Конфигурация для загрузки контрольных точек, квантованных с использованием схем Black Forest Labs fp8r и nvfp4.
Обе схемы читаются из контрольной точки через ~FromSingleFileMixin.from_single_file; квантование модели на лету не поддерживается. Линейный слой квантуется, если его вес сопровождается тензорами масштаба:
fp8r:weightимеет типfloat8_e4m3fnи форму[N, K], аweight_scale— это fp32-масштаб для каждой строки с формой[N].nvfp4:weightимеет типuint8и форму[N, K/2](два значения E2M1 на байт),weight_scale— это блочный масштабfloat8_e4m3fnформы[N, K/16], аweight_scale_2иinput_scale— скаляры fp32, хранящие глобальный масштаб весов и откалиброванный масштаб активаций (раскладка ModelOpt NVFP4).
BitsAndBytesConfig
класс diffusers.BitsAndBytesConfig
< source >( load_in_8bit = Falseload_in_4bit = Falsellm_int8_threshold = 6.0llm_int8_skip_modules = Nonellm_int8_enable_fp32_cpu_offload = Falsellm_int8_has_fp16_weight = Falsebnb_4bit_compute_dtype = Nonebnb_4bit_quant_type = 'fp4'bnb_4bit_use_double_quant = Falsebnb_4bit_quant_storage = None**kwargs )
Параметры
- load_in_8bit (
bool, необязательный, по умолчаниюFalse) — Этот флаг используется для включения 8-битного квантования с помощью LLM.int8(). - load_in_4bit (
bool, необязательный, по умолчаниюFalse) — Этот флаг используется для включения 4-битного квантования путём замены слоёв Linear на слои FP4/NF4 изbitsandbytes. - llm_int8_threshold (
float, необязательный, по умолчанию 6.0) — Этот параметр соответствует порогу выбросов для обнаружения выбросов, описанному в статьеLLM.int8() : 8-bit Matrix Multiplication for Transformers at Scale: https://huggingface.co/papers/2208.07339 Любое значение скрытых состояний, превышающее этот порог, будет считаться выбросом, и операции с такими значениями будут выполняться в fp16. Значения обычно распределены нормально, то есть большинство значений находятся в диапазоне [-3.5, 3.5], но в больших моделях встречаются некоторые исключительные систематические выбросы с совершенно иным распределением. Эти выбросы часто находятся в интервале [-60, -6] или [6, 60]. Квантование Int8 хорошо работает для значений порядка ~5, но за пределами этого диапазона возникает значительное снижение производительности. Хорошим порогом по умолчанию является 6, но для более нестабильных моделей (маленькие модели, дообучение) может потребоваться более низкий порог. - llm_int8_skip_modules (
list[str], необязательный) — Явный список модулей, которые не следует конвертировать в 8 бит. Это полезно для таких моделей, как Jukebox, у которых несколько головок расположены в разных местах и не обязательно на последней позиции. Например, для моделейCausalLMпоследняяlm_headобычно сохраняется в исходномdtype. - llm_int8_enable_fp32_cpu_offload (
bool, необязательный, по умолчаниюFalse) — Этот флаг предназначен для продвинутых сценариев использования и пользователей, знакомых с данной функцией. Если вы хотите разделить модель на разные части и выполнять вычисления для одних частей в формате int8 на GPU, а для других — в формате fp32 на CPU, вы можете использовать этот флаг. Это полезно для выгрузки (offloading) больших моделей, таких какgoogle/flan-t5-xxl. Обратите внимание, что операции int8 не будут выполняться на CPU. - llm_int8_has_fp16_weight (
bool, необязательный, по умолчаниюFalse) — Этот флаг запускает LLM.int8() с основными весами 16-битного формата. Это полезно для дообучения, так как веса не нужно конвертировать туда и обратно для обратного прохода. - bnb_4bit_compute_dtype (
torch.dtypeor str, optional, по умолчаниюtorch.float32) — Определяет тип вычислений, который может отличаться от типа входных данных. Например, входные данные могут быть fp32, но для ускорения вычисления можно настроить на bf16. - bnb_4bit_quant_type (
str, необязательный, по умолчанию"fp4") — Определяет тип данных квантования в слоях bnb.nn.Linear4Bit. Доступны типы данных FP4 и NF4, которые указываются значениямиfp4илиnf4. - bnb_4bit_use_double_quant (
bool, необязательный, по умолчаниюFalse) — Этот флаг используется для вложенной квантизации, при которой константы квантизации из первого этапа квантизации квантуются повторно. - bnb_4bit_quant_storage (
torch.dtypeor str, optional, по умолчаниюtorch.uint8) — Определяет тип хранилища для упаковки квантованных 4-битных параметров. - kwargs (
dict[str, Any], необязательный) — Дополнительные параметры для инициализации объекта конфигурации.
Это обёртка, содержащая все возможные атрибуты и функции, с которыми можно работать с моделью, загруженной с помощью bitsandbytes.
Это заменяет load_in_8bit или load_in_4bit, поэтому оба варианта взаимоисключающи.
В настоящее время поддерживаются только квантование LLM.int8(), FP4 и NF4. Если в bitsandbytes будут добавлены новые методы, то в этот класс будут добавлены соответствующие аргументы.
Возвращает True, если модель можно квантовать, иначе False.
Проверка безопасности, что аргументы корректны — также заменяет некоторые аргументы типа NoneType их значениями по умолчанию.
Этот метод возвращает метод квантования, использованный для модели. Если модель не поддерживает квантование, возвращается None.
to_diff_dict
< source >( ) → dict[str, Any]
Возвращает
dict[str, Any]
Словарь всех атрибутов, из которых состоит этот экземпляр конфигурации,
Удаляет все атрибуты из config, соответствующие атрибутам конфигурации по умолчанию, для лучшей читаемости и сериализует в словарь Python.
GGUFQuantizationConfig
класс diffusers.GGUFQuantizationConfig
< source >( compute_dtype: 'torch.dtype' | None = None )
Это класс конфигурации для методов квантования GGUF.
NunchakuLiteQuantizationConfig
класс diffusers.NunchakuLiteQuantizationConfig
< source >( compute_dtype: 'torch.dtype' | str | None = Nonesvdq_w4a4: dict[str, Any] | None = Noneawq_w4a16: dict[str, Any] | None = None**kwargs )
Параметры
- compute_dtype (
torch.dtype, по умолчаниюtorch.bfloat16) — dtype, используемый во время выполнения для буферов с плавающей точкой в квантованных модулях. - svdq_w4a4 (
dict, необязательный) — Явная конфигурация цели SVDQ W4A4 с параметрамиprecision,group_size,rankиtargets. - awq_w4a16 (
dict, необязательный) — Явная целевая конфигурация AWQ W4A16 с параметрамиprecision,group_sizeиtargets.
Конфигурация для загрузки контрольных точек Nunchaku Lite.
Поддержка Nunchaku Lite в Diffusers позволяет загружать предварительно квантованные контрольные точки. Чтобы создать совместимую контрольную точку, используйте diffuse-compressor, чтобы выбрать или адаптировать целевую конфигурацию для архитектуры модели, выполнить квантование и экспорт трансформера, а затем упаковать его в пайплайн Diffusers с компактным quantization_config, сохранённым в config.json.
Экспортированный state dict должен точно соответствовать архитектуре целевой модели Diffusers. Чекпоинты, квантованные с использованием объединённых QKV-проекций, не будут загружены в конфигурацию модели, ожидающую отдельные модули проекций Q, K и V.
Пример компактной конфигурации config.json:
{
"_class_name": "ErnieImageTransformer2DModel",
"quantization_config": {
"quant_method": "nunchaku_lite",
"compute_dtype": "bfloat16",
"svdq_w4a4": {
"precision": "nvfp4",
"group_size": 16,
"rank": 32,
"targets": ["layers.0.self_attention.to_q"]
},
"awq_w4a16": {
"precision": "int4",
"group_size": 64,
"targets": ["final_linear"]
}
}
}QuantoConfig
класс diffusers.QuantoConfig
< source >( weights_dtype: str = 'int8'modules_to_not_convert: list[str] | None = None**kwargs )
Это обёртка, содержащая все возможные атрибуты и возможности, с которыми можно работать с моделью, загруженной с помощью quanto.
QuantoConfigустарела и будет удалена в версии 1.0.0. Рекомендуется перейти на один из других поддерживаемых бэкендов квантования, например BitsAndBytesConfig или TorchAoConfig.
modules_to_not_convert (list, необязательный, по умолчанию None):
Список модулей, которые не следует квантовать. Полезно для квантования моделей, которые явно требуют, чтобы некоторые модули оставались в исходной точности (например, энкодер Whisper, энкодер Llava, слои gate в Mixtral).
Проверка безопасности: аргументы корректны
SDNQConfig
класс diffusers.SDNQConfig
< source >( *args**kwargs )
Параметры
- weights_dtype (
str, необязательный, по умолчанию"int8") — Целевой тип данных для весов после квантования, например"int8","uint4","float8_e4m3fn". См.sdnq.common.accepted_weight_dtypesдля всех поддерживаемых значений. - group_size (
int, необязательный, по умолчанию0) — Количество элементов тензора, разделяющих одну группу квантования.0автоматически выбирает значение на основеweights_dtype,-1отключает группировку и использует построчное квантование. - use_svd (
bool, необязательный, по умолчаниюFalse) — Определяет, следует ли применять алгоритм SVDQuant поверх квантования SDNQ. - use_quantized_matmul (
bool, необязательный, по умолчаниюFalse) — Использовать ли квантованный INT8 / FP8 / FP16 matmul на прямом проходе вместо BF16 / FP16. - modules_to_not_convert (
list, необязательный, по умолчаниюNone) — Список модулей, которые нужно пропустить при квантовании. - kwargs (
dict[str, Any], необязательный) — Дополнительные именованные аргументы, передаваемые вsdnq.SDNQConfig(например,quantized_matmul_dtype,svd_rank,use_hadamard,quant_conv,quant_embedding,modules_dtype_dict).
Класс конфигурации для SDNQ (SD.Next Quantization).
Библиотека sdnq предоставляет собственный конфиг и квантизатор, совместимые с diffusers; данный класс представляет собой тонкую фабрику, которая делегирует работу этим компонентам, чтобы чекпоинты с quant_method="sdnq" загружались нативно в diffusers. Все аргументы передаются в sdnq.SDNQConfig. Требуется библиотека sdnq: pip install sdnq.
Ссылка: https://github.com/Disty0/sdnq
TorchAoConfig
класс diffusers.TorchAoConfig
< source >( quant_type: 'AOBaseConfig'modules_to_not_convert: list[str] | None = None**kwargs )
Параметры
- quant_type (
AOBaseConfig) — Экземпляр подклассаAOBaseConfig, определяющий тип квантования. См. документацию torchao для доступных классов конфигурации (например,Int4WeightOnlyConfig,Int8WeightOnlyConfig,Float8WeightOnlyConfig,Float8DynamicActivationFloat8WeightConfigи т. д.). - modules_to_not_convert (
list[str], необязательный, по умолчаниюNone) — Список модулей, которые не следует квантовать. Полезно для квантования моделей, которые явно требуют, чтобы некоторые модули оставались в исходной точности.
Это класс конфигурации для методов квантования и разреженности torchao.
Пример:
from diffusers import FluxTransformer2DModel, TorchAoConfig
from torchao.quantization import Int8WeightOnlyConfig
quantization_config = TorchAoConfig(Int8WeightOnlyConfig())
transformer = FluxTransformer2DModel.from_pretrained(
"black-forest-labs/Flux.1-Dev",
subfolder="transformer",
quantization_config=quantization_config,
torch_dtype=torch.bfloat16,
)Создание конфигурации из словаря.
Создайте соответствующий метод квантования на основе конфигурации.
Преобразование конфигурации в словарь.
DiffusersQuantizer
класс diffusers.DiffusersQuantizer
< source >( quantization_config: QuantizationConfigMixin**kwargs )
Абстрактный класс квантизатора HuggingFace. На данный момент поддерживает квантизацию моделей HF diffusers для вывода и/или квантизации. Этот класс используется только в diffusers.models.modeling_utils.ModelMixin.from_pretrained и пока не может быть легко использован вне контекста этого метода.
Атрибуты
quantization_config (diffusers.quantizers.quantization_config.QuantizationConfigMixin):
Конфигурация квантования, определяющая параметры квантования вашей модели, которую вы хотите квантовать.
modules_to_not_convert (list[str], необязательно):
Список имён модулей, которые не следует конвертировать при квантовании модели.
required_packages (list[str], необязательно):
Список необходимых pip-пакетов, которые нужно установить перед использованием квантизатора.
requires_calibration (bool):
Требуется ли методу квантования калибровка модели перед её использованием.
при необходимости дополнительного объема памяти для квантования отрегулируйте аргумент max_memory для infer_auto_device_map()
adjust_target_dtype
< source >( torch_dtype: torch.dtype )
Переопределите этот метод, если вы хотите изменить переменную target_dtype, используемую в from_pretrained для вычисления device_map, в случае, если device_map является str. Например, для bitsandbytes мы принудительно устанавливаем target_dtype в torch.int8, а для 4-битного режима передаем пользовательский enum accelerate.CustomDtype.int4.
check_if_quantized_param
< source >( model: ModelMixinparam_value: torch.Tensorparam_name: strstate_dict: dict**kwargs )
проверяет, является ли загруженный компонент state_dict частью квантованного параметра + некоторая валидация; определено только для методов квантования, требующих создания новых параметров для квантования.
проверяет, имеет ли квантованный параметр ожидаемую форму.
забирает необходимые компоненты из state_dict и создаёт квантованный параметр.
При необходимости можно деквантовать модель, чтобы получить исходную модель, однако это приведёт к некоторой потере точности / производительности. Обратите внимание, что не все схемы квантования поддерживают эту операцию.
Коэффициент, используемый в caching_allocator_warmup для определения количества байт, которые следует зарезервировать заранее для прогрева cuda.
Коэффициент 2 означает, что мы выделяем все байты пустой модели (поскольку выделение происходит в fp16), коэффициент 4 означает,
что мы выделяем половину памяти, занимаемой весами в пустой модели, и т. д.…
get_special_dtypes_update
< source >( modeltorch_dtype: torch.dtype )
returns dtypes for modules that are not quantized - used for the computation of the device_map in case one
passes a str as a device_map. The method will use the modules_to_not_convert that is modified in _process_model_before_weight_loading. diffusers models don’t have any modules_to_not_convert attributes
yet but this can change soon in the future.
postprocess_model
< source >( model: ModelMixin**kwargs )
Выполните постобработку модели после загрузки весов. Убедитесь, что вы переопределяете абстрактный метод _process_model_after_weight_loading.
preprocess_model
< source >( model: ModelMixin**kwargs )
Настройка атрибутов модели и/или преобразование модели до загрузки весов. На этом этапе модель должна быть
инициализирована на meta-устройстве, поэтому вы можете свободно манипулировать каркасом модели, чтобы заменить
модули на месте. Убедитесь, что вы переопределяете абстрактный метод _process_model_before_weight_loading.
update_device_map
< source >( device_map: dict[str, typing.Any] | None )
Переопределите этот метод, если вы хотите передать новое устройство map, чтобы переопределить существующее. Например, для
bitsandbytes, поскольку accelerate является обязательным требованием, если device_map не передан, device_map устанавливается в
`“auto”“
update_missing_keys
< source >( modelmissing_keys: listprefix: str )
Переопределите этот метод, если хотите изменить missing_keys.
update_torch_dtype
< source >( torch_dtype: torch.dtype )
Некоторые методы квантования требуют явного задания dtype модели целевым dtype. Вам нужно переопределить этот метод, если вы хотите убедиться, что это поведение сохраняется
Этот метод используется для потенциальной проверки конфликтов с аргументами, передаваемыми в from_pretrained. Его необходимо определить для всех будущих квантизаторов, интегрированных с diffusers. Если явная проверка не требуется, просто верните ничего.