Transformers documentation
Mapeo de fusión (función experimental)
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:
- from_pretrained() utiliza el argumento explícito
fusion_configo recurre aconfig.fusion_config. - El registro de fusiones valida los nombres de fusión solicitados.
- 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. - Las clases de reemplazo fusionadas se registran a través de register_patch_mapping().
- Se generan reglas de
~WeightTransforma partir de la configuración para que la carga del checkpoint pueda mapear los pesos al diseño de tiempo de ejecución fusionado. - 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=Falsepara 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_embeddingsActívalo con:fusion_config = {"patch_embeddings": True}Efecto: Reemplaza las proyecciones de incrustación de parches compatibles de
nn.Conv3dcon proyecciones equivalentes aplanadas denn.Linearen tiempo de ejecución.
Extender el mapeo de fusión
Para añadir una nueva familia de fusiones:
- Añade un predicado
is_fusable. Este decide si un módulo descubierto es compatible con la fusión. - 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 deis_fusable(...). - 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. - Agregue una fábrica
make_transformssi el diseño fusionado requiere la conversión de puntos de control. Esto devuelve las reglas~WeightTransformque mapean los pesos entre los diseños original y fusionado para una configuración dada. - Registre el nuevo
ModuleFusionSpecenfusion_mapping.py.
Una vez registrada, la nueva fusión queda disponible a través de fusion_config.
API interna
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.
Devuelve el mensaje de registro emitido cuando no se encuentran módulos compatibles.
Devuelve si module es compatible con esta familia de fusiones.
Construya la clase de reemplazo en tiempo de ejecución para una clase de módulo compatible.
Construya las transformaciones de pesos necesarias para cargar y guardar el diseño de tiempo de ejecución fusionado.
Fusiona las incrustaciones de parches de Conv3d compatibles en proyecciones lineales aplanadas.
transformers.fusion_mapping._register_module_fusion
< source >( 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
< source >( 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_configcontra_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