ShadowPEFT no PEFT: o mapa de decisão de exportação de adaptadores
ShadowPEFT usa a interface de treinamento familiar do PEFT, mas não pode ser mesclado aos pesos de base. Este guia de implantação separa a inferência anexada da exportação separada de modelo de linguagem, explica copy=True e define o que medir antes de colocar qualquer um dos artefatos em produção.
Mesma API get_peft_model, contrato de implantação diferente
O treinamento ainda começa com get_peft_model. Essa familiaridade ajuda, mas também pode ocultar a pergunta de implantação mais importante: o que exatamente você vai entregar?
Com ShadowPEFT, a resposta não é um modelo de base mesclado. A inferência anexada mantém o modelo de base no fluxo. A inferência separada de modelo de linguagem usa um cálculo diferente. Ambas podem ser escolhas legítimas, mas precisam de empacotamento diferente, testes diferentes e evidências de aceitação diferentes.
O que a integração de 15 de setembro muda
O anúncio de integração de 15 de setembro de 2026 dos autores informa que o ShadowPEFT foi mesclado ao ramo principal do PEFT. O artigo de abril oferece contexto útil, mas não é um novo artigo de setembro. Na data do anúncio, experimentar a integração significa instalar o PEFT a partir do código-fonte; a documentação principal separa esse caminho do pacote estável. A data do anúncio não é evidência independente da data exata da mesclagem.
Fixe as revisões do PEFT e do Transformers que você testou. Fixe também as revisões do modelo de base e do modelo shadow. Uma instalação do ramo principal sem versões fixadas não é um plano de lançamento reprodutível.
O anúncio explica o método e relata experimentos. A referência da API documenta as operações. Este artigo conecta essas partes a uma decisão de implantação: qual artefato existe, quais dependências precisam estar presentes e que evidência prova que o artefato está pronto para entrega. É um guia de planejamento, não uma reprodução da Optijara dos resultados dos autores.
Por que uma trajetória shadow não pode ser mesclada aos pesos de base
A documentação do ShadowPEFT descreve uma pequena backbone que produz um estado shadow inicial. Ao longo de blocos decodificadores contíguos, a discrepância h-s passa por uma correção de baixo rank para a entrada da base. Atualizações com portas então avançam o estado shadow usando as saídas dos blocos. Apenas uma trajetória de adaptador pode estar ativa por vez.
Esse é um comportamento dependente da entrada. Não é um delta fixo que possa ser incorporado aos pesos de base. Como resultado, merge, merge_adapter e merge_and_unload geram erros. Métodos familiares de salvar e carregar do PEFT não removem essa restrição.
Mantenha três inventários separados: o adaptador salvo, a configuração de inferência anexada base mais shadow e o checkpoint completo do modelo de linguagem separado. Eles não são três nomes de arquivo para a mesma coisa. São produtos diferentes.
O mapa de decisão de exportação de adaptadores: escolha o artefato antes do treinamento
Quatro rotas de implantação e suas evidências de aceitação
O mapa de decisão de exportação de adaptadores da Optijara é um auxílio de planejamento original para este artigo, não um padrão de fornecedor. Comece pela rota de que você precisa em produção, depois escolha etapas de treinamento, exportação e validação que possam realmente produzi-la.
| Rota | Artefato entregue | Dependência da base | Operação compatível | Evidência de aceitação |
|---|---|---|---|---|
| Mesclagem LoRA, quando compatível | Checkpoint de base com atualizações mescladas | Pesos de base permanecem no artefato mesclado | Mesclagem compatível com a configuração | Recarregar e comparar saídas da tarefa mesclada |
| Shadow anexado | Adaptador, configuração e base correspondente | Necessária durante a inferência | Carregamento do adaptador e geração anexada | Testes de qualidade, cache e tempo de execução de base mais shadow |
| LM Transformers Shadow separado | Backbone, projeção, embeddings, cabeça, tokenizador, configuração | Nenhuma base residente exigida por uma exportação completa | unload_shadow(copy=True) | Recarregamento independente e avaliação de tarefa separada |
| Denoiser Diffusers Shadow autônomo | Nenhuma exportação autônoma compatível | Rota de difusão anexada permanece separada | O descarregamento gera NotImplementedError | Não aceite isto como uma rota de exportação compatível |
A rota separada merece inspeção cuidadosa. Um pequeno arquivo de adaptador não é o mesmo que um checkpoint com uma tabela de embeddings, projeção, backbone, cabeça de saída, tokenizador e configuração. Registre quais componentes a configuração escolhida compartilha, treina e salva. Esse inventário também é útil ao revisar detalhes do artefato em vez de nomes de arquivo, embora este artigo não reivindique suporte de conversão GGUF para ShadowPEFT.
Para Diffusers, a documentação separa o backend da arquitetura Flux2 registrada de um alternativa MLP residual por token para arquiteturas compatíveis. Nenhum dos caminhos oferece suporte ao descarregamento autônomo. Essa limitação se aplica a modelos Diffusers de forma ampla, não apenas a arquiteturas sem um backend registrado.
Treinamento, inferência anexada e exportação separada são ramificações diferentes
As ramificações abaixo mostram decisões de ShadowPEFT e as verificações associadas a elas. A ramificação Diffusers é explicitamente sem suporte. Elas não descrevem um roteador de borda-nuvem implementado.
Este resumo compacto é JSON descritivo. Não é uma configuração PEFT e não realiza verificações de compatibilidade.
{
"framework": "Adapter Export Decision Map",
"shadow_merge_supported": false,
"attached_requires_base": true,
"detached_lm_requires_separate_evaluation": true,
"independent_export_copy": true,
"diffusers_standalone_supported": false
}Exporte um modelo de linguagem separado sem perder o contrato do artefato
Treine o caminho autônomo deliberadamente
O cálculo Transformers separado documentado é head(projection(backbone(x))). Ele não é o estado shadow final entre camadas sL, porque sL depende de interações com o decodificador de base. Portanto, resultados anexados fortes não provam qualidade de tarefa separada.
Trate a qualidade do preditor como uma pergunta de aceitação separada. Uma exportação pode ser tecnicamente válida e ainda ser o preditor errado para a tarefa. Um salvamento bem-sucedido não resolve essa pergunta.
A perda da tarefa auxiliar supervisiona o estado shadow inicial s0, o caminho disponível sem essas interações com a base. A configuração documenta auxiliary_loss_weight=0.05 como padrão, com a perda adicionada quando rótulos são fornecidos. Verifique se a execução de treinamento fornece rótulos e lida com a cabeça da tarefa como pretendido. Definir um valor na configuração não é o mesmo que verificar o caminho da perda.
Para modelagem de linguagem causal, a cabeça de saída da base é reutilizada. Inclua modules_to_save=['lm_head'] quando essa cabeça precisar ser treinada e salva pelo PEFT. Não transforme o treinamento da cabeça em um reflexo. Registre o tamanho do vocabulário da cabeça e sua relação com o tokenizador e a tabela de embeddings.
Use unload_shadow(copy=True) para exportação independente
O trecho a seguir segue a interface de exportação documentada. Ele é ilustrativo e não foi executado aqui. peft_model significa um modelo PEFT Transformers compatível e já treinado, não um pipeline Diffusers arbitrário.
# Apenas ilustrativo: não executado para este artigo.
detached_model = peft_model.base_model.unload_shadow(copy=True)
detached_model.save_pretrained("standalone-shadow")Por padrão, copy=False compartilha módulos com o modelo PEFT. Se o shadow usa embeddings de entrada congelados da base por meio de uma referência fora de sua árvore de submódulos registrada, salvar esse objeto separado pode omitir a tabela de embeddings. A documentação recomenda copy=True ao salvar ou enviar um modelo independente porque isso anexa uma cópia privada dos embeddings. A compensação é memória extra durante a exportação.
Esse sinalizador resolve uma dependência de serialização. Ele não prova que o tokenizador foi salvo, que o carregador é compatível ou que a qualidade separada atende ao requisito da tarefa. Use a interface de carregamento da implementação fixada. Não infira a classe de recarregamento a partir de um nome conveniente.
Lista de verificação de recarregamento a frio, explicitamente não executado aqui
Use esta lista de verificação prospectivo antes de chamar uma exportação de implantável. A Optijara não treinou, exportou, recarregou nem avaliou o modelo para este artigo. Documentação e inspeção de código-fonte não substituem evidência local de teste de serialização.
| Verificação | Ação | Evidência a reter |
|---|---|---|
| Revisões | Fixe revisões de PEFT, Transformers, base e shadow | Manifesto de ambiente e modelo |
| Tratamento da cabeça | Confirme rótulos, perda auxiliar e escolha de cabeça salva | Configuração de treinamento e verificações de perda |
| Artefato completo | Salve com copy=True; inventarie pesos necessários | Entradas de embeddings, projeção, backbone e cabeça |
| Tokenizador e configuração | Preserve arquivos correspondentes e configurações de tokens especiais | Comparação de vocabulário e configuração |
| Carregamento independente | Inicie um processo limpo usando o carregador documentado | Log de carregamento sem objetos de base residentes |
| Verificações de saída | Compare saídas separadas controladas antes de salvar e depois de recarregar | Entradas de teste, configurações, saídas e tolerâncias |
| Aceitação da tarefa | Pontue um conjunto reservado separadamente da inferência anexada | Relatório de avaliação separada |
Mantenha o artefato anexado enquanto testa a exportação. Um carregamento limpo não deve substituir automaticamente o candidato de implantação anexada. Ele apenas aprova a verificação de serialização. Rejeite artefatos incompletos antes de interpretar diferenças de qualidade, especialmente quando configurações de tokenizador ou pesos ausentes podem explicar o comportamento.
Meça inferência anexada e separada como produtos distintos
Quatro linhas de base na mesma carga de trabalho reservada
Planeje uma comparação entre somente base, LoRA, Shadow anexado e Shadow separado. Use as mesmas tarefas reservadas, prompts, regras de pontuação e configurações de geração quando fizer sentido. Registre diferenças de tokenizador, tamanhos de modelo e orçamentos de treinamento. Uma arquitetura separada menor não é idêntica à base, e a avaliação não deve fingir que é.
Defina limites de aceitação antes de olhar os resultados. Uma tarefa hipotética de rotulagem de documentos pode se importar mais com a correção dos rótulos e com uma saída estruturada estável. Um assistente interativo também precisa de verificações de latência. Estas são escolhas de avaliação propostas, não resultados relatados do ShadowPEFT.
| Medição | Procedimento | Decisão apoiada |
|---|---|---|
| Qualidade da tarefa | Aplique a mesma rubrica de pontuação reservada a cada rota | Se o artefato específico atende às necessidades da tarefa |
| Carregamento a frio | Reinicie e carregue apenas as dependências declaradas | Se o empacotamento é utilizável de forma independente |
| Pegada | Registre armazenamento de checkpoint e tokenizador separadamente | Planejamento de armazenamento e distribuição |
| Memória de serviço | Meça RAM/VRAM de pico sob contexto e concorrência declarados | Ajuste ao hardware |
| Comportamento do cache | Inspecione memória nos comprimentos de sequência escolhidos | Planejamento de capacidade para geração |
| Latência e vazão | Registre partida a frio, tempo até o primeiro token e saída sustentada | Adequação à interação-alvo |
| Custo | Inclua tempo de execução medido mais esforço de engenharia e avaliação | Se a adoção é economicamente justificada |
Tamanho do adaptador não é memória de serviço
A geração anexada usa caches KV pareados de base e shadow. A referência da API descreve ShadowCache como intencionalmente não compilável; a conversão para tupla legada não é compatível. Não prometa suporte a torch.compile ou compatibilidade com mecanismo de inferência apenas porque generate() parece familiar. A implementação do modelo define separadamente o caminho de exportação autônoma e sua restrição de Diffusers.
Meça o crescimento do cache na carga de trabalho que você pretende servir. Separe bytes do adaptador, bytes da exportação, picos de carregamento e memória de serviço em estado estável. Siga a mesma disciplina usada para testar o artefato exato no ambiente de execução e no dispositivo de destino. Um download menor não estabelece um tempo de execução anexado menor.
Leia o benchmark dos autores sem um atalho de custo
O benchmark de integração dos autores relata os seguintes resultados de treinamento MetaMathQA e avaliação GSM8K para Llama 3.2 3B em uma NVIDIA A100 80GB. A tabela deles rotula a coluna de armazenamento como "Checkpoint"; estes são artefatos de experimento relatados, não exportações autônomas verificadas.
| Método | Acurácia no teste GSM8K | Memória de pico | Checkpoint | Tempo de treinamento |
|---|---|---|---|---|
| LoRA | 46.9% | 22.3 GB | 36.7 MB | 15 min |
| ShadowPEFT | 48.1% | 28.2 GB | 26.0 MB | 17 min |
Nesse experimento, ShadowPEFT tem pontuação maior e checkpoint menor, com memória de pico maior e treinamento mais longo. Inspecione a configuração Shadow e a configuração LoRA vinculadas. O anúncio chama as configurações de padrões, mas o arquivo Shadow especifica auxiliary_loss_weight=0.01 e shadow_alpha=0.5, em vez dos padrões da API de 0.05 e 0.1. Use os arquivos vinculados para entender o experimento; não presuma uma busca de hiperparâmetros igual. Um resultado relatado sem incerteza não estabelece superioridade ampla. Ele também não diz nada, por si só, sobre memória de serviço separada, latência ou acurácia de inferência separada.
O que evitar na implantação do ShadowPEFT
Tratar todo adaptador PEFT como mesclável
A seguir estão erros de implementação previstos, não incidentes de trabalho de cliente da Optijara. Um script de implantação que chama merge_and_unload para todo tipo de adaptador precisa de uma ramificação específica ao método. Substituir essa chamada pelo descarregamento shadow também altera o preditor que está sendo entregue, portanto o relatório de aceitação antigo não pode simplesmente ser transferido.
Possíveis modos de falha incluem tratar tamanho de checkpoint como memória de pico, atribuir pontuações de benchmark anexado a um modelo separado e validar serialização em um processo no qual a base original continua disponível. Módulos compartilhados podem fazer um experimento em memória parecer completo enquanto deixam uma exportação independente sem teste.
Confundir treinamento auxiliar de imagem com um denoiser destacável
Um caminho de treinamento auxiliar de denoising não cria um produto Diffusers autônomo compatível. O suporte ao backend Flux2 diz respeito a como o cálculo shadow é construído. Ele não remove o NotImplementedError no descarregamento autônomo.
Os autores também relatam uma comparação de geração de imagem usando um pequeno conjunto de dados DreamBooth de um único gato. Esse experimento específico de modelo não prova generalização para todos os sujeitos, qualidade universal de imagem ou qualidade de denoiser autônomo. Mantenha essas alegações fora de uma proposta de implantação.
Para equipes que transitam entre ferramentas de imagem, controles familiares não provam paridade de execução. A mesma lógica se aplica aqui. Nomes de API compartilhados são ergonomia útil, não evidência de que dois métodos exportam modelos equivalentes.
Ressalvas antes de adotar a integração do ramo principal
Compatibilidade, custo de implementação e limites de avaliação
O comportamento do ramo principal depende da revisão. Registre a arquitetura, o carregador, as versões de dependências e as restrições de tempo de execução cobertas por seus testes. A descrição de suporte da documentação é onde o trabalho começa. Não é certificação para todo mecanismo de serviço.
Inclua no orçamento verificação de exportação, avaliação, armazenamento e manutenção além do treinamento. Hardware, preços de provedores, comprimento de contexto, concorrência e escolha de modelo afetam o resultado medido. Um adaptador menor não pode sustentar sozinho uma alegação de economia. Mantenha a incerteza visível nas comparações e execute novamente as verificações relevantes após mudanças de dependência.
Verificações de privacidade e licença continuam específicas ao artefato
Revise os termos do modelo de base, checkpoint shadow, conjunto de dados, tokenizador e head da tarefa antes da distribuição. O checkpoint shadow Qwen projetado é uma configuração concreta a inspecionar, não uma permissão geral para toda implantação derivada. A separação não concede direitos de redistribuição nem remove preocupações de privacidade dos dados de treinamento.
Escolha uma rota compatível, mantenha seu inventário de dependências e avalie o artefato que realmente chegará ao ambiente-alvo. Deixe a exportação autônoma Diffusers sem suporte fora do plano de lançamento até que a implementação ofereça suporte explicitamente.
Pontos principais
- 1ShadowPEFT compartilha o ponto de entrada do PEFT, mas não pode mesclar sua trajetória dependente da entrada aos pesos de base.
- 2A inferência anexada retém cálculo de base e shadow, incluindo caches KV pareados.
- 3A exportação separada de modelo de linguagem deve usar copy=True para salvamento independente, com verificações completas do artefato e avaliação de qualidade separada.
- 4O descarregamento autônomo não é compatível com nenhum modelo Diffusers na integração documentada.
- 5Compare qualidade real, pegada do checkpoint, memória de serviço, latência e custo em vez de apenas o tamanho do adaptador.
Conclusão
Escolha a rota de exportação antes do treinamento, depois prove que o artefato carrega de forma limpa e atende ao requisito da tarefa. ShadowPEFT anexado e um modelo de linguagem separado precisam de evidências de aceitação separadas. Nenhum deles herda prontidão de implantação de uma API familiar ou de um benchmark original. Entre em contato com a Optijara para discutir o escopo de uma avaliação de ajuste fino e de um plano de implantação.
Perguntas frequentes
O ShadowPEFT pode ser mesclado aos pesos do modelo de base como LoRA?
Não. ShadowPEFT usa uma trajetória dependente da entrada, não um delta estático de pesos. Sua implementação rejeita merge, merge_adapter e merge_and_unload. O suporte de mesclagem em configurações LoRA compatíveis não se transfere para o ShadowPEFT.
Como diferem a inferência ShadowPEFT anexada e separada?
A inferência anexada retém o modelo de base, o cálculo shadow e caches KV pareados. A inferência Transformers separada calcula head(projection(backbone(x))) sem as interações por camada do decodificador de base. Avalie qualidade e memória separadas de forma independente; pontuações anexadas não estabelecem desempenho separado.
Por que usar unload_shadow(copy=True) para exportação independente de modelo de linguagem?
copy=True copia módulos compartilhados e inclui embeddings congelados da base que o salvamento com copy=False pode omitir. Use-o para salvamento independente, depois verifique tokenizador, configuração, head, pesos e recarregamento em processo limpo. O sinalizador sozinho não prova prontidão de implantação.
O ShadowPEFT pode exportar um denoiser Diffusers autônomo?
Não. O descarregamento autônomo gera NotImplementedError para todos os modelos Diffusers na integração documentada. Um backend Flux2 registrado ou uma perda auxiliar de denoising não habilita a exportação autônoma.
Um adaptador ShadowPEFT menor significa menor memória ou custo de implantação?
Não. Armazenamento do adaptador, tamanho completo do checkpoint e memória de serviço são medições diferentes. O experimento GSM8K citado pelos autores relata um checkpoint ShadowPEFT menor junto com memória de pico maior e treinamento mais longo do que LoRA. Ele não mede custo de serviço separado. Compare somente base, LoRA, Shadow anexado e Shadow separado em qualidade reservada, carregamento independente, armazenamento, RAM/VRAM de serviço, comportamento de cache, latência, vazão e custo sob condições registradas.
Fontes
- https://huggingface.co/blog/shadow-llm/shadowpeft-peft
- https://huggingface.co/docs/peft/main/en/package_reference/shadow#shadowpeft
- https://github.com/huggingface/peft/blob/main/src/peft/tuners/shadow/model.py
- https://github.com/huggingface/peft/blob/main/src/peft/tuners/shadow/config.py
- https://huggingface.co/shadow-llm/Qwen3-0.6B-H8B
- https://huggingface.co/papers/2604.19254
- https://github.com/huggingface/peft/blob/main/method_comparison/MetaMathQA/experiments/shadow/llama-3.2-3B-mirror/adapter_config.json
- https://github.com/huggingface/peft/blob/main/method_comparison/MetaMathQA/experiments/lora/llama-3.2-3B-rank32/adapter_config.json
Escrito por
Hamza DiazHamza Diaz é o fundador da Optijara, onde cria agentes de IA práticos, sistemas de automação e fluxos de trabalho do Copilot para empresas de serviços. Ele escreve sobre operações de IA, estratégia de agentes e implementação no mundo real para equipes que querem sistemas úteis em vez de exagero.
