Transformers documentation
Mapeamento de fusão (recurso experimental)
Mapeamento de fusão (recurso experimental)
O mapeamento de fusão oferece uma opção para substituir submódulos do modelo no momento do carregamento, preservando o formato original do checkpoint.
Ele se baseia em:
- Monkey patching para substituir as classes de módulos antes da instanciação do modelo.
- Carregamento dinâmico de pesos para mapear os pesos entre os layouts de runtime originais e fundidos.
O mapeamento de fusão é um recurso experimental de carregamento. Ele altera a estrutura de módulos em tempo de execução e pode afetar o comportamento do modelo. Use-o apenas quando você desejar explicitamente um layout de tempo de execução fundido.
Início rápido
A fusão é habilitada por meio de from_pretrained() com fusion_config:
from transformers import AutoModelForImageTextToText
model = AutoModelForImageTextToText.from_pretrained(
"Qwen/Qwen2-VL-2B-Instruct",
fusion_config={"patch_embeddings": True},
)Por padrão, nenhuma fusão é aplicada.
Se fusion_config estiver armazenado na configuração do modelo, from_pretrained() o reutilizará automaticamente.
Como funciona
O registro de fusão ocorre antes da instanciação do modelo:
- from_pretrained() usa o argumento explícito
fusion_configou recorre aconfig.fusion_config. - O registro de fusão valida os nomes de fusão solicitados.
- Cada fusão habilitada inicializa meta a classe de modelo de destino, filtra opcionalmente os módulos candidatos por nome e usa
is_fusable(...)para descobrir as classes de módulos compatíveis. - As classes de substituição fundidas são registradas por meio de register_patch_mapping().
- As regras
~WeightTransformcorrespondentes são geradas a partir da configuração para que o carregamento do checkpoint possa mapear os pesos para o layout de runtime fundido. - Por padrão, save_pretrained() usa o caminho de conversão reversa para restaurar o layout original do checkpoint. Passe
save_original_format=Falsepara manter o layout de runtime convertido.
Isso permite que uma fusão utilize uma estrutura de módulo de runtime diferente, carregando ainda assim do formato de checkpoint original e, por padrão, salvando de volta para ele.
Nota: Com o mecanismo atual de monkey-patching, o registro de fusão é de nível de classe: uma classe de módulo compatível mapeia para uma classe de substituição fundida.
Famílias de fusão atuais
Atualmente, fusion_config suporta uma família de fusão:
patch_embeddingsAtive com:fusion_config = {"patch_embeddings": True}Efeito: Substitui as projeções de incorporação de patches compatíveis com
nn.Conv3dpor projeçõesnn.Linearequivalentes e achatadas em tempo de execução.
Estendendo o mapeamento de fusão
Para adicionar uma nova família de fusão:
- Adicione um predicado
is_fusable. Ele decide se um módulo descoberto é compatível com a fusão. - Adicione opcionalmente
target_modules_patterns. Isso torna a etapa de descoberta mais explícita, pré-filtrando os nomes de módulos candidatos antes deis_fusable(...). - Adicione uma fábrica
make_fused_class. Ela retorna a classe de substituição em tempo de execução para uma classe de módulo compatível. - Adicione uma fábrica
make_transformsse o layout fundido precisar de conversão de checkpoint. Isso retorna as regras~WeightTransformque mapeiam os pesos entre os layouts original e fundido para uma configuração dada. - Registre o novo
ModuleFusionSpecemfusion_mapping.py.
Uma vez registrada, a nova fusão fica disponível por meio de fusion_config.
API interna
Receita base para uma família de fusão.
A especificação de fusão determina quais módulos são elegíveis para fusão, como construir a classe de substituição em tempo de execução e quais transformações de pesos são necessárias para mapear checkpoints entre os layouts original e fundido.
Retorna a mensagem de log emitida quando nenhum módulo compatível é encontrado.
Retorna se module é compatível com esta família de fusão.
Crie a classe de substituição em tempo de execução para uma classe de módulo compatível.
Construa as transformações de pesos necessárias para carregar e salvar o layout de runtime fundido.
Fusos compatíveis de incorporações de patches Conv3d em projeções Linear achatadas.
transformers.fusion_mapping._register_module_fusion
< source >( config: PretrainedConfigfusion_name: strspec: ModuleFusionSpec )
Registre uma família de fusão para cls.
Esta função atualiza os dois registros globais usados pelo carregamento fundido:
- o registro de monkey-patching, para que as classes de módulos compatíveis sejam substituídas antes da inicialização
- o mapeamento de conversão de checkpoint, para que os módulos de runtime fundidos ainda sejam carregados do layout original do checkpoint
Observações:
- transformações de checkpoint conflitantes falham rapidamente
transformers.fusion_mapping.register_fusion_patches
< source >( configfusion_config: collections.abc.Mapping[str, bool | collections.abc.Mapping[str, typing.Any]] | None = None )
Registre as fusões de tempo de execução solicitadas para cls.
Esta função:
- valida
fusion_configem relação a_FUSION_REGISTRY - resolve as famílias de fusão habilitadas na ordem do usuário
- registra monkey patches e transformações de checkpoint antes da instanciação do modelo