#
Quantization

Quantization techniques reduce memory and computational costs by representing weights and activations with lower-precision data types like 8-bit integers (int8). This enables loading larger models you normally wouldn’t be able to fit into memory, and speeding up inference. Diffusers supports 8-bit and 4-bit quantization with bitsandbytes.

Quantization techniques that aren’t supported in Transformers can be added with the DiffusersQuantizer class.

Learn how to quantize models in the Quantization guide.

##
BitsAndBytesConfig

###
class diffusers.BitsAndBytesConfig

< source >

( *args **kwargs )

##
GGUFQuantizationConfig

###
class diffusers.GGUFQuantizationConfig

< source >

( *args **kwargs )

##
QuantoConfig

###
class diffusers.QuantoConfig

< source >

( *args **kwargs )

##
TorchAoConfig

###
class diffusers.TorchAoConfig

< source >

( *args **kwargs )

##
DiffusersQuantizer

###
class diffusers.DiffusersQuantizer

< source >

( quantization_config: QuantizationConfigMixin **kwargs )

Abstract class of the HuggingFace quantizer. Supports for now quantizing HF diffusers models for inference and/or quantization. This class is used only for diffusers.models.modeling_utils.ModelMixin.from_pretrained and cannot be easily used outside the scope of that method yet.

Attributes quantization_config (`diffusers.quantizers.quantization_config.QuantizationConfigMixin`): The quantization config that defines the quantization parameters of your model that you want to quantize. modules_to_not_convert (`List[str]`, optional): The list of module names to not convert when quantizing the model. required_packages (`List[str]`, optional): The list of required pip packages to install prior to using the quantizer requires_calibration (`bool`): Whether the quantization method requires to calibrate the model before using it.

####
adjust_max_memory

< source >

( max_memory: typing.Dict[str, typing.Union[int, str]] )

adjust max_memory argument for infer_auto_device_map() if extra memory is needed for quantization

####
adjust_target_dtype

< source >

( torch_dtype: torch.dtype )

Parameters

- torch_dtype (`torch.dtype`, optional) — The torch_dtype that is used to compute the device_map.

Override this method if you want to adjust the `target_dtype` variable used in `from_pretrained` to compute the device_map in case the device_map is a `str`. E.g. for bitsandbytes we force-set `target_dtype` to `torch.int8` and for 4-bit we pass a custom enum `accelerate.CustomDtype.int4`.

####
check_if_quantized_param

< source >

( model: ModelMixin param_value: torch.Tensor param_name: str state_dict: typing.Dict[str, typing.Any] **kwargs )

checks if a loaded state_dict component is part of quantized param + some validation; only defined for quantization methods that require to create a new parameters for quantization.

####
check_quantized_param_shape

< source >

( *args **kwargs )

checks if the quantized param has expected shape.

####
create_quantized_param

< source >

( *args **kwargs )

takes needed components from state_dict and creates quantized param.

####
dequantize

< source >

( model )

Potentially dequantize the model to retrive the original model, with some loss in accuracy / performance. Note not all quantization schemes support this.

####
get_special_dtypes_update

< source >

( model torch_dtype: torch.dtype )

Parameters

- model (`~diffusers.models.modeling_utils.ModelMixin`) — The model to quantize
- torch_dtype (`torch.dtype`) — The dtype passed in `from_pretrained` method.

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 )

Parameters

- model (`~diffusers.models.modeling_utils.ModelMixin`) — The model to quantize
- kwargs (`dict`, optional) — The keyword arguments that are passed along `_process_model_after_weight_loading`.

Post-process the model post weights loading. Make sure to override the abstract method `_process_model_after_weight_loading`.

####
preprocess_model

< source >

( model: ModelMixin **kwargs )

Parameters

- model (`~diffusers.models.modeling_utils.ModelMixin`) — The model to quantize
- kwargs (`dict`, optional) — The keyword arguments that are passed along `_process_model_before_weight_loading`.

Setting model attributes and/or converting model before weights loading. At this point the model should be initialized on the meta device so you can freely manipulate the skeleton of the model in order to replace modules in-place. Make sure to override the abstract method `_process_model_before_weight_loading`.

####
update_device_map

< source >

( device_map: typing.Optional[typing.Dict[str, typing.Any]] )

Parameters

- device_map (`Union[dict, str]`, optional) — The device_map that is passed through the `from_pretrained` method.

Override this method if you want to pass a override the existing device map with a new one. E.g. for bitsandbytes, since `accelerate` is a hard requirement, if no device_map is passed, the device_map is set to `“auto”“

####
update_missing_keys

< source >

( model missing_keys: typing.List[str] prefix: str )

Parameters

- missing_keys (`List[str]`, optional) — The list of missing keys in the checkpoint compared to the state dict of the model

Override this method if you want to adjust the `missing_keys`.

####
update_torch_dtype

< source >

( torch_dtype: torch.dtype )

Parameters

- torch_dtype (`torch.dtype`) — The input dtype that is passed in `from_pretrained`

Some quantization methods require to explicitly set the dtype of the model to a target dtype. You need to override this method in case you want to make sure that behavior is preserved

####
validate_environment

< source >

( *args **kwargs )

This method is used to potentially check for potential conflicts with arguments that are passed in `from_pretrained`. You need to define it for all future quantizers that are integrated with diffusers. If no explicit check are needed, simply return nothing.

< > Update on GitHub