Diffusers documentation

Квантование

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Квантование

Техники квантования снижают затраты памяти и вычислительных ресурсов, представляя веса и активации с помощью типов данных с пониженной точностью, таких как 8-битные целые числа (int8). Это позволяет загружать более крупные модели, которые в обычном режиме не помещаются в память, и ускорять инференс.

Узнайте, как квантовать модели, в руководстве Квантование.

PipelineQuantizationConfig

класс diffusers.PipelineQuantizationConfig

< >

( 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

< >

( compute_dtype: 'torch.dtype' | None = None )

Параметры

  • compute_dtype (torch.dtype, по умолчанию torch.bfloat16) — dtype для активаций и неоквантованных слоёв. На устройствах без слиянных ядер FP8 или NVFP4 веса деквантуются в этот dtype на каждом проходе.

Конфигурация для загрузки контрольных точек, квантованных с использованием схем 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

< >

( 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.dtype or 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.dtype or str, optional, по умолчанию torch.uint8) — Определяет тип хранилища для упаковки квантованных 4-битных параметров.
  • kwargs (dict[str, Any], необязательный) — Дополнительные параметры для инициализации объекта конфигурации.

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

Это заменяет load_in_8bit или load_in_4bit, поэтому оба варианта взаимоисключающи.

В настоящее время поддерживаются только квантование LLM.int8(), FP4 и NF4. Если в bitsandbytes будут добавлены новые методы, то в этот класс будут добавлены соответствующие аргументы.

is_quantizable

< >

( )

Возвращает True, если модель можно квантовать, иначе False.

post_init

< >

( )

Проверка безопасности, что аргументы корректны — также заменяет некоторые аргументы типа NoneType их значениями по умолчанию.

quantization_method

< >

( )

Этот метод возвращает метод квантования, использованный для модели. Если модель не поддерживает квантование, возвращается None.

to_diff_dict

< >

( ) → dict[str, Any]

Возвращает

dict[str, Any]

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

Удаляет все атрибуты из config, соответствующие атрибутам конфигурации по умолчанию, для лучшей читаемости и сериализует в словарь Python.

GGUFQuantizationConfig

класс diffusers.GGUFQuantizationConfig

< >

( compute_dtype: 'torch.dtype' | None = None )

Параметры

  • compute_dtype — (torch.dtype, по умолчанию torch.float32): Определяет тип вычислений, который может отличаться от типа входных данных. Например, входные данные могут быть в формате fp32, но для ускорения вычислений можно установить bf16.

Это класс конфигурации для методов квантования GGUF.

NunchakuLiteQuantizationConfig

класс diffusers.NunchakuLiteQuantizationConfig

< >

( 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

< >

( weights_dtype: str = 'int8'modules_to_not_convert: list[str] | None = None**kwargs )

Параметры

  • weights_dtype (str, необязательный, по умолчанию "int8") — Целевой тип данных для весов после квантования. Поддерживаемые значения: (“float8”,“int8”,“int4”,“int2”)

Это обёртка, содержащая все возможные атрибуты и возможности, с которыми можно работать с моделью, загруженной с помощью quanto.

QuantoConfig устарела и будет удалена в версии 1.0.0. Рекомендуется перейти на один из других поддерживаемых бэкендов квантования, например BitsAndBytesConfig или TorchAoConfig.

modules_to_not_convert (list, необязательный, по умолчанию None): Список модулей, которые не следует квантовать. Полезно для квантования моделей, которые явно требуют, чтобы некоторые модули оставались в исходной точности (например, энкодер Whisper, энкодер Llava, слои gate в Mixtral).

post_init

< >

( )

Проверка безопасности: аргументы корректны

SDNQConfig

класс diffusers.SDNQConfig

< >

( *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

< >

( 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,
)

from_dict

< >

( config_dictreturn_unused_kwargs = False**kwargs )

Создание конфигурации из словаря.

get_apply_tensor_subclass

< >

( )

Создайте соответствующий метод квантования на основе конфигурации.

to_dict

< >

( )

Преобразование конфигурации в словарь.

DiffusersQuantizer

класс diffusers.DiffusersQuantizer

< >

( 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): Требуется ли методу квантования калибровка модели перед её использованием.

adjust_max_memory

< >

( max_memory: dict[str, int | str] )

при необходимости дополнительного объема памяти для квантования отрегулируйте аргумент max_memory для infer_auto_device_map()

adjust_target_dtype

< >

( torch_dtype: torch.dtype )

Параметры

  • torch_dtype (torch.dtype, необязательный) — torch_dtype, используемый для вычисления device_map.

Переопределите этот метод, если вы хотите изменить переменную target_dtype, используемую в from_pretrained для вычисления device_map, в случае, если device_map является str. Например, для bitsandbytes мы принудительно устанавливаем target_dtype в torch.int8, а для 4-битного режима передаем пользовательский enum accelerate.CustomDtype.int4.

check_if_quantized_param

< >

( model: ModelMixinparam_value: torch.Tensorparam_name: strstate_dict: dict[str, typing.Any]**kwargs )

проверяет, является ли загруженный компонент state_dict частью квантованного параметра + некоторая валидация; определено только для методов квантования, требующих создания новых параметров для квантования.

check_quantized_param_shape

< >

( *args**kwargs )

проверяет, имеет ли квантованный параметр ожидаемую форму.

create_quantized_param

< >

( *args**kwargs )

забирает необходимые компоненты из state_dict и создаёт квантованный параметр.

dequantize

< >

( model )

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

get_cuda_warm_up_factor

< >

( )

Коэффициент, используемый в caching_allocator_warmup для определения количества байт, которые следует зарезервировать заранее для прогрева cuda. Коэффициент 2 означает, что мы выделяем все байты пустой модели (поскольку выделение происходит в fp16), коэффициент 4 означает, что мы выделяем половину памяти, занимаемой весами в пустой модели, и т. д.…

get_special_dtypes_update

< >

( modeltorch_dtype: torch.dtype )

Параметры

  • model (~diffusers.models.modeling_utils.ModelMixin) — Модель, которую нужно квантовать
  • torch_dtype (torch.dtype) — dtype, переданный в метод from_pretrained.

возвращает dtypes для модулей, которые не квантованы — используется для вычисления device_map, если в качестве device_map передаётся str. Метод использует modules_to_not_convert, который изменяется в _process_model_before_weight_loading. У моделей diffusers пока нет атрибутов modules_to_not_convert, но в будущем это может измениться.

postprocess_model

< >

( model: ModelMixin**kwargs )

Параметры

  • model (~diffusers.models.modeling_utils.ModelMixin) — Модель, которую нужно квантовать
  • kwargs (dict, необязательный) — Параметры с ключами, которые передаются в _process_model_after_weight_loading.

Выполните постобработку модели после загрузки весов. Убедитесь, что вы переопределяете абстрактный метод _process_model_after_weight_loading.

preprocess_model

< >

( model: ModelMixin**kwargs )

Параметры

  • model (~diffusers.models.modeling_utils.ModelMixin) — Модель, которую нужно квантовать
  • kwargs (dict, необязательный) — Параметры с ключами, которые передаются в _process_model_before_weight_loading.

Настройка атрибутов модели и/или преобразование модели до загрузки весов. На этом этапе модель должна быть инициализирована на meta-устройстве, поэтому вы можете свободно манипулировать каркасом модели, чтобы заменить модули на месте. Убедитесь, что вы переопределяете абстрактный метод _process_model_before_weight_loading.

update_device_map

< >

( device_map: dict[str, typing.Any] | None )

Параметры

  • device_map (dict | str, необязательный) — device_map, передаваемый через метод from_pretrained.

Переопределите этот метод, если вы хотите передать новое устройство map, чтобы переопределить существующее. Например, для bitsandbytes, поскольку accelerate является обязательным требованием, если device_map не передан, device_map устанавливается в `“auto”“

update_missing_keys

< >

( modelmissing_keys: list[str]prefix: str )

Параметры

  • missing_keys (list[str], необязательный) — Список отсутствующих ключей в контрольной точке по сравнению со state dict модели

Переопределите этот метод, если хотите изменить missing_keys.

update_torch_dtype

< >

( torch_dtype: torch.dtype )

Параметры

  • torch_dtype (torch.dtype) — входящий dtype, передаваемый в from_pretrained

Некоторые методы квантования требуют явного задания dtype модели целевым dtype. Вам нужно переопределить этот метод, если вы хотите убедиться, что это поведение сохраняется

validate_environment

< >

( *args**kwargs )

Этот метод используется для потенциальной проверки конфликтов с аргументами, передаваемыми в from_pretrained. Его необходимо определить для всех будущих квантизаторов, интегрированных с diffusers. Если явная проверка не требуется, просто верните ничего.

Update on GitHub