Transformers documentation

Mapeo de fusión (función experimental)

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Mapeo de fusión (función experimental)

El mapeo de fusión ofrece una opción para reemplazar submódulos del modelo en el momento de la carga, preservando el formato original del punto de control.

Se basa en:

  • Monkey patching para intercambiar las clases de los módulos antes de la instanciación del modelo.
  • Carga dinámica de pesos para mapear los pesos entre los diseños de tiempo de ejecución originales y fusionados.

El mapeo de fusión es una función de carga experimental. Modifica la estructura del módulo en tiempo de ejecución y puede afectar el comportamiento del modelo. Úsalo solo cuando desees explícitamente un diseño de tiempo de ejecución fusionado.

Inicio rápido

La fusión se habilita a través de from_pretrained() con fusion_config:

from transformers import AutoModelForImageTextToText


model = AutoModelForImageTextToText.from_pretrained(
    "Qwen/Qwen2-VL-2B-Instruct",
    fusion_config={"patch_embeddings": True},
)

Por defecto, no se aplica ninguna fusión. Si fusion_config se almacena en la configuración del modelo, from_pretrained() lo reutilizará automáticamente.

Cómo funciona

El registro de fusión ocurre antes de que se instancie el modelo:

  1. from_pretrained() utiliza el argumento explícito fusion_config o recurre a config.fusion_config.
  2. El registro de fusiones valida los nombres de fusión solicitados.
  3. Cada fusión habilitada inicializa meta la clase de modelo objetivo, filtra opcionalmente los módulos candidatos por nombre y utiliza is_fusable(...) para descubrir las clases de módulos compatibles.
  4. Las clases de reemplazo fusionadas se registran a través de register_patch_mapping().
  5. Se generan reglas de ~WeightTransform a partir de la configuración para que la carga del checkpoint pueda mapear los pesos al diseño de tiempo de ejecución fusionado.
  6. Por defecto, save_pretrained() utiliza la ruta de conversión inversa para restaurar el diseño original del punto de control. Pasa save_original_format=False para mantener el diseño de tiempo de ejecución convertido.

Esto permite que una fusión utilice una estructura de módulo de tiempo de ejecución diferente, mientras sigue cargando desde el formato de punto de control original y, de forma predeterminada, guardando de nuevo en él.

Nota: Con el mecanismo de monkey-patching actual, el registro de fusión es a nivel de clase: una clase de módulo compatible se mapea a una clase de reemplazo fusionado.

Familias de fusión actuales

Actualmente, fusion_config admite una familia de fusiones:

  • patch_embeddings Actívalo con:

    fusion_config = {"patch_embeddings": True}

    Efecto: Reemplaza las proyecciones de incrustación de parches compatibles de nn.Conv3d con proyecciones equivalentes aplanadas de nn.Linear en tiempo de ejecución.

Extender el mapeo de fusión

Para añadir una nueva familia de fusiones:

  1. Añade un predicado is_fusable. Este decide si un módulo descubierto es compatible con la fusión.
  2. Opcionalmente, añade target_modules_patterns. Esto hace que el paso de descubrimiento sea más explícito al prefiltrar los nombres de módulos candidatos antes de is_fusable(...).
  3. Agregue una fábrica make_fused_class. Esto devuelve la clase de reemplazo en tiempo de ejecución para una clase de módulo compatible.
  4. Agregue una fábrica make_transforms si el diseño fusionado requiere la conversión de puntos de control. Esto devuelve las reglas ~WeightTransform que mapean los pesos entre los diseños original y fusionado para una configuración dada.
  5. Registre el nuevo ModuleFusionSpec en fusion_mapping.py.

Una vez registrada, la nueva fusión queda disponible a través de fusion_config.

API interna

clase transformers.fusion_mapping.ModuleFusionSpec

< >

( )

Receta base para una familia de fusión.

Una especificación de fusión decide qué módulos son elegibles para una fusión, cómo construir la clase de reemplazo en tiempo de ejecución y qué transformaciones de pesos son necesarias para mapear los puntos de control entre los diseños originales y fusionados.

get_empty_log

< >

( model_name: str )

Devuelve el mensaje de registro emitido cuando no se encuentran módulos compatibles.

is_fusable

< >

( module: Module )

Devuelve si module es compatible con esta familia de fusiones.

make_fused_class

< >

( original_cls: type )

Construya la clase de reemplazo en tiempo de ejecución para una clase de módulo compatible.

make_transforms

< >

( config: PretrainedConfig )

Construya las transformaciones de pesos necesarias para cargar y guardar el diseño de tiempo de ejecución fusionado.

clase transformers.fusion_mapping.PatchEmbeddingsFusionSpec

< >

( )

Fusiona las incrustaciones de parches de Conv3d compatibles en proyecciones lineales aplanadas.

transformers.fusion_mapping._register_module_fusion

< >

( config: PretrainedConfigfusion_name: strspec: ModuleFusionSpec )

Registre una familia de fusión para cls.

Esta función actualiza los dos registros globales utilizados por la carga fusionada:

  • el registro de monkey-patching, de modo que las clases de módulos compatibles se reemplazan antes de la inicialización
  • el mapeo de conversión de puntos de control, para que los módulos de tiempo de ejecución fusionados sigan cargándose desde el diseño original del punto de control

Notas:

  • las transformaciones de puntos de control en conflicto fallan rápidamente

transformers.fusion_mapping.register_fusion_patches

< >

( configfusion_config: collections.abc.Mapping[str, bool | collections.abc.Mapping[str, typing.Any]] | None = None )

Registrar las fusiones de tiempo de ejecución solicitadas para cls.

Esta función:

  • valida fusion_config contra _FUSION_REGISTRY
  • resuelve las familias de fusión habilitadas en el orden del usuario
  • registra parches de mono y transformaciones de puntos de control antes de la instanciación del modelo
Update on GitHub