Diffusers documentation
Cuantización
Cuantización
Las técnicas de cuantización reducen los costos de memoria y de cómputo al representar los pesos y las activaciones con tipos de datos de menor precisión, como enteros de 8 bits (int8). Esto permite cargar modelos más grandes que normalmente no cabrían en la memoria y acelerar la inferencia.
Aprende a cuantizar modelos en la guía de Cuantización.
PipelineQuantizationConfig
clase 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 )
Parámetros
- quant_backend (
str) — Backend de cuantización que se utilizará. Al usar esta opción, se asume que el backend está disponible tanto paradiffuserscomo paratransformers. - quant_kwargs (
dict) — Parámetros para inicializar la clase del backend de cuantización. - components_to_quantize (
list) — Componentes de un pipeline que se van a cuantizar. - quant_mapping (
dict) — Mapeo que define las especificaciones de cuantización a utilizar para los componentes del pipeline. Al usar este argumento, no se espera que los usuarios proporcionenquant_backend,quant_kawargsycomponents_to_quantize.
Clase de configuración que se utiliza al aplicar cuantización sobre la marcha en from_pretrained().
BFLQuantizationConfig
clase diffusers.BFLQuantizationConfig
< source >( compute_dtype: 'torch.dtype' | None = None )
Config para cargar puntos de control cuantizados con los esquemas fp8r y nvfp4 de Black Forest Labs.
Ambos esquemas se leen desde el punto de control a través de ~FromSingleFileMixin.from_single_file; no se admite la cuantización de un modelo sobre la marcha. Una capa lineal se cuantiza cuando su peso viene acompañado de tensores de escala:
fp8r:weightesfloat8_e4m3fncon forma[N, K]yweight_scalees una escala fp32 por fila[N].nvfp4:weightesuint8con forma[N, K/2](dos valores E2M1 por byte),weight_scalees una escala de bloquefloat8_e4m3fn[N, K/16], yweight_scale_2yinput_scaleson escalares fp32 que contienen la escala global de pesos y la escala de activaciones calibrada (el diseño NVFP4 de ModelOpt).
BitsAndBytesConfig
clase 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 )
Parámetros
- load_in_8bit (
bool, opcional, valor predeterminadoFalse) — Esta bandera se utiliza para habilitar la cuantización de 8 bits con LLM.int8(). - load_in_4bit (
bool, opcional, valor predeterminadoFalse) — Esta bandera se utiliza para habilitar la cuantización de 4 bits reemplazando las capas Linear con capas FP4/NF4 debitsandbytes. - llm_int8_threshold (
float, opcional, valor predeterminado 6.0) — Corresponde al umbral de valores atípicos para la detección de outliers, tal como se describe en el artículoLLM.int8() : 8-bit Matrix Multiplication for Transformers at Scale: https://huggingface.co/papers/2208.07339 Cualquier valor de los estados ocultos que supere este umbral se considerará un outlier y la operación sobre esos valores se realizará en fp16. Los valores suelen estar distribuidos de forma normal, es decir, la mayoría de los valores están en el rango [-3.5, 3.5], pero existen algunos outliers sistemáticos excepcionales que están distribuidos de manera muy diferente en los modelos grandes. Estos outliers suelen estar en el intervalo [-60, -6] o [6, 60]. La cuantización Int8 funciona bien para valores de magnitud ~5, pero más allá de eso, hay un penalización significativa en el rendimiento. Un buen umbral predeterminado es 6, pero podría ser necesario un umbral más bajo para modelos más inestables (modelos pequeños, fine-tuning). - llm_int8_skip_modules (
list[str], opcional) — Una lista explícita de los módulos que no queremos convertir a 8 bits. Esto es útil para modelos como Jukebox, que tiene varias cabezas en diferentes lugares y no necesariamente en la última posición. Por ejemplo, en los modelosCausalLM, la últimalm_headse suele mantener en sudtypeoriginal. - llm_int8_enable_fp32_cpu_offload (
bool, opcional, valor predeterminadoFalse) — Esta bandera se utiliza para casos de uso avanzados y para usuarios que conocen esta función. Si deseas dividir tu modelo en diferentes partes y ejecutar algunas en int8 en la GPU y otras en fp32 en la CPU, puedes usar esta bandera. Esto es útil para descargar modelos grandes, comogoogle/flan-t5-xxl. Ten en cuenta que las operaciones int8 no se ejecutarán en la CPU. - llm_int8_has_fp16_weight (
bool, opcional, valor predeterminadoFalse) — Esta bandera ejecuta LLM.int8() con pesos principales de 16 bits. Esto es útil para el ajuste fino, ya que los pesos no tienen que convertirse de ida y vuelta para la propagación inversa. - bnb_4bit_compute_dtype (
torch.dtypeo str, opcional, valor predeterminadotorch.float32) — Establece el tipo de cálculo, que puede ser diferente del tipo de entrada. Por ejemplo, las entradas pueden ser fp32, pero el cálculo puede configurarse en bf16 para obtener mejoras de velocidad. - bnb_4bit_quant_type (
str, opcional, valor predeterminado"fp4") — Esto establece el tipo de datos de cuantización en las capas bnb.nn.Linear4Bit. Las opciones son los tipos de datos FP4 y NF4, que se especifican confp4onf4. - bnb_4bit_use_double_quant (
bool, opcional, valor predeterminadoFalse) — Esta bandera se utiliza para la cuantización anidada, donde las constantes de cuantización de la primera cuantización se cuantizan nuevamente. - bnb_4bit_quant_storage (
torch.dtypeo str, opcional, valor predeterminadotorch.uint8) — Esto establece el tipo de almacenamiento para empaquetar los parámetros cuantizados de 4 bits. - kwargs (
dict[str, Any], opcional) — Parámetros adicionales a partir de los cuales inicializar el objeto de configuración.
Esta es una clase envoltorio sobre todos los atributos y funciones posibles con los que puedes trabajar un modelo que se ha
cargado usando bitsandbytes.
Esto reemplaza a load_in_8bit o load_in_4bit, por lo que ambas opciones son mutuamente excluyentes.
Actualmente solo admite la cuantización LLM.int8(), FP4 y NF4. Si se añaden más métodos a bitsandbytes,
se añadirán más argumentos a esta clase.
Devuelve True si el modelo es cuantizable, False en caso contrario.
Comprobador de seguridad que verifica que los argumentos sean correctos; también reemplaza algunos argumentos de tipo NoneType con sus valores predeterminados.
Este método devuelve el método de cuantización utilizado para el modelo. Si el modelo no es cuantizable, devuelve None.
to_diff_dict
< source >( ) → dict[str, Any]
Devuelve
dict[str, Any]
Diccionario de todos los atributos que componen esta instancia de configuración,
Elimina todos los atributos de config que corresponden a los atributos de la configuración predeterminada para mejorar la legibilidad y los serializa en un diccionario de Python.
GGUFQuantizationConfig
clase diffusers.GGUFQuantizationConfig
< source >( compute_dtype: 'torch.dtype' | None = None )
Esta es una clase de configuración para técnicas de cuantización GGUF.
NunchakuLiteQuantizationConfig
clase diffusers.NunchakuLiteQuantizationConfig
< source >( compute_dtype: 'torch.dtype' | str | None = Nonesvdq_w4a4: dict[str, Any] | None = Noneawq_w4a16: dict[str, Any] | None = None**kwargs )
Parámetros
- compute_dtype (
torch.dtype, por defectotorch.bfloat16) — dtype de tiempo de ejecución utilizado por los búferes de punto flotante en los módulos cuantizados. - svdq_w4a4 (
dict, opcional) — Configuración explícita de destino SVDQ W4A4 conprecision,group_size,rankytargets. - awq_w4a16 (
dict, opcional) — Configuración explícita de destino AWQ W4A16 conprecision,group_sizeytargets.
Configuración para cargar puntos de control de Nunchaku Lite.
El soporte de Nunchaku Lite en Diffusers carga puntos de control precuantizados. Para crear un punto de control compatible, use diffuse-compressor para elegir o adaptar una configuración objetivo para la arquitectura del modelo, cuantizar y exportar el transformer, y empaquetarlo como un pipeline de Diffusers con la compacta quantization_config almacenada en config.json.
El state dict exportado debe coincidir exactamente con la arquitectura del modelo Diffusers de destino. Los checkpoints cuantizados con proyecciones QKV fusionadas no se cargarán en una configuración de modelo que espere módulos de proyección Q, K y V separados.
Ejemplo de configuración compacta de 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
clase diffusers.QuantoConfig
< source >( weights_dtype: str = 'int8'modules_to_not_convert: list[str] | None = None**kwargs )
Esta es una clase envoltorio sobre todos los atributos y características posibles con los que puedes trabajar un modelo que ha sido
cargado usando quanto.
QuantoConfigestá obsoleto y se eliminará en la versión 1.0.0. Considere cambiar a uno de los otros backends de cuantización admitidos, como BitsAndBytesConfig o TorchAoConfig.
modules_to_not_convert (list, opcional, valor predeterminado None):
La lista de módulos que no se deben cuantizar, útil para cuantizar modelos que requieren explícitamente que algunos
módulos se mantengan en su precisión original (p. ej., el codificador de Whisper, el codificador de Llava, las capas de puerta de Mixtral).
Verificador de seguridad que los argumentos son correctos
SDNQConfig
clase diffusers.SDNQConfig
< source >( *args**kwargs )
Parámetros
- weights_dtype (
str, opcional, valor predeterminado"int8") — El dtype objetivo para los pesos después de la cuantización, p. ej."int8","uint4","float8_e4m3fn". Consultesdnq.common.accepted_weight_dtypespara todos los valores admitidos. - group_size (
int, opcional, valor predeterminado0) — Número de elementos de un tensor que comparten el mismo grupo de cuantización.0selecciona automáticamente en función deweights_dtype,-1deshabilita el agrupamiento y utiliza la cuantización por fila. - use_svd (
bool, opcional, valor predeterminadoFalse) — Si se aplica el algoritmo SVDQuant sobre la cuantización SDNQ. - use_quantized_matmul (
bool, opcional, valor predeterminadoFalse) — Si se debe usar matmul cuantizado INT8 / FP8 / FP16 en la pasada hacia adelante en lugar de BF16 / FP16. - modules_to_not_convert (
list, opcional, valor predeterminadoNone) — La lista de módulos que se omitirán durante la cuantización. - kwargs (
dict[str, Any], opcional) — Argumentos de palabra clave adicionales que se reenvían asdnq.SDNQConfig(p. ej.quantized_matmul_dtype,svd_rank,use_hadamard,quant_conv,quant_embedding,modules_dtype_dict).
Clase de configuración para SDNQ (SD.Next Quantization).
La biblioteca sdnq incluye su propia configuración y cuantizador compatibles con diffusers; esta clase es una fábrica delgada que
se delega en ellos para que los puntos de control con quant_method="sdnq" se carguen de forma nativa con diffusers. Todos los argumentos se reenvían
a sdnq.SDNQConfig. Requiere la biblioteca sdnq: pip install sdnq.
Referencia: https://github.com/Disty0/sdnq
TorchAoConfig
clase diffusers.TorchAoConfig
< source >( quant_type: 'AOBaseConfig'modules_to_not_convert: list[str] | None = None**kwargs )
Parámetros
- quant_type (
AOBaseConfig) — Una instancia de una subclase deAOBaseConfigque especifica el tipo de cuantización. Consulte la documentación de torchao para ver las clases de configuración disponibles (p. ej.Int4WeightOnlyConfig,Int8WeightOnlyConfig,Float8WeightOnlyConfig,Float8DynamicActivationFloat8WeightConfig, etc.). - modules_to_not_convert (
list[str], opcional, valor predeterminadoNone) — La lista de módulos que no se deben cuantizar, útil para cuantizar modelos que requieren explícitamente que algunos módulos se mantengan en su precisión original.
Esta es una clase de configuración para técnicas de cuantización/escasez de torchao.
Ejemplo:
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,
)Crear una configuración a partir de un diccionario.
Cree el método de cuantización apropiado en función de la configuración.
Convierte la configuración en un diccionario.
DiffusersQuantizer
clase diffusers.DiffusersQuantizer
< source >( quantization_config: QuantizationConfigMixin**kwargs )
Clase abstracta del cuantizador de HuggingFace. Por ahora, admite la cuantización de modelos de HF diffusers para inferencia y/o cuantización. Esta clase se utiliza únicamente para diffusers.models.modeling_utils.ModelMixin.from_pretrained y aún no se puede utilizar fácilmente fuera del ámbito de ese método.
Atributos
quantization_config (diffusers.quantizers.quantization_config.QuantizationConfigMixin):
La configuración de cuantización que define los parámetros de cuantización de tu modelo que deseas cuantizar.
modules_to_not_convert (list[str], opcional):
La lista de nombres de módulos que no se deben convertir al cuantizar el modelo.
required_packages (list[str], opcional):
La lista de paquetes de pip requeridos para instalar antes de usar el cuantizador.
requires_calibration (bool):
Si el método de cuantización requiere calibrar el modelo antes de usarlo.
ajustar el argumento max_memory de infer_auto_device_map() si se necesita memoria adicional para la cuantización
adjust_target_dtype
< source >( torch_dtype: torch.dtype )
Sobrescriba este método si desea ajustar la variable target_dtype utilizada en from_pretrained para calcular el device_map en caso de que el device_map sea un str. Por ejemplo, para bitsandbytes forzamos la configuración de target_dtype a torch.int8 y para 4 bits pasamos un enum personalizado accelerate.CustomDtype.int4.
check_if_quantized_param
< source >( model: ModelMixinparam_value: torch.Tensorparam_name: strstate_dict: dict**kwargs )
verifica si un componente de state_dict cargado forma parte de un parámetro cuantizado + algunas validaciones; solo está definido para métodos de cuantización que requieren crear nuevos parámetros para la cuantización.
verifica si el parámetro cuantizado tiene la forma esperada.
toma los componentes necesarios de state_dict y crea el parámetro cuantizado.
Descomprimir el modelo para recuperar el modelo original, con cierta pérdida de precisión / rendimiento. Tenga en cuenta que no todos los esquemas de cuantización admiten esto.
El factor que se utilizará en caching_allocator_warmup para obtener el número de bytes que se preasignarán para calentar cuda.
Un factor de 2 significa que se asignan todos los bytes del modelo vacío (ya que se asigna en fp16), un factor de 4 significa
que se asigna la mitad de la memoria de los pesos que residen en el modelo vacío, etc…
get_special_dtypes_update
< source >( modeltorch_dtype: torch.dtype )
devuelve los dtypes de los módulos que no están cuantizados; se utiliza para el cálculo de device_map en caso de que se pase un str como device_map. El método utilizará modules_to_not_convert, que se modifica en _process_model_before_weight_loading. Los modelos de diffusers aún no tienen ningún atributo modules_to_not_convert, pero esto podría cambiar pronto en el futuro.
postprocess_model
< source >( model: ModelMixin**kwargs )
Post-procesa el modelo después de cargar los pesos. Asegúrate de sobrescribir el método abstracto _process_model_after_weight_loading.
preprocess_model
< source >( model: ModelMixin**kwargs )
Establecer atributos del modelo y/o convertir el modelo antes de cargar los pesos. En este punto, el modelo debe estar inicializado en el dispositivo meta, por lo que puedes manipular libremente el esqueleto del modelo para reemplazar módulos in situ. Asegúrate de sobrescribir el método abstracto _process_model_before_weight_loading.
update_device_map
< source >( device_map: dict[str, typing.Any] | None )
Sobrescriba este método si desea pasar un mapa de dispositivos para reemplazar el mapa de dispositivos existente. Por ejemplo, para
bitsandbytes, ya que accelerate es un requisito obligatorio, si no se pasa device_map, el device_map se establece en
`“auto”“
update_missing_keys
< source >( modelmissing_keys: listprefix: str )
Sobrescribe este método si deseas ajustar missing_keys.
update_torch_dtype
< source >( torch_dtype: torch.dtype )
Algunos métodos de cuantización requieren establecer explícitamente el dtype del modelo a un dtype objetivo. Debes sobrescribir este método si quieres asegurarte de que se preserve ese comportamiento
Este método se utiliza para verificar posibles conflictos con los argumentos que se pasan en from_pretrained. Debes definirlo para todos los cuantificadores futuros que se integren con diffusers. Si no se necesita una comprobación explícita, simplemente no devuelvas nada.