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

Квантование

Техники квантования снижают затраты памяти и вычислительных ресурсов, представляя веса и активации с помощью типов данных с пониженной точностью, таких как 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 )

при необходимости дополнительного объема памяти для квантования отрегулируйте аргумент 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**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.

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

< >

( 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: listprefix: 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