Character.ai: treino de Transformers em escala ágil e efetivo
Character.ai detalha técnicas práticas para acelerar e baratear o treinamento de Transformers em grande escala, combinando compressão de gradientes, quantização, regularização e caching inteligente
Danilo Gato
Autor
Introdução
Treinamento de Transformers em larga escala é caro, sensível a gargalos de comunicação e instável quando a precisão numérica é mal gerida. A Character.ai publicou técnicas internas que aceleram e tornam mais eficiente esse treinamento, incluindo Squinch, uma compressão de gradientes em 6 bits, regularização de atenção, quantização consciente e melhorias no pipeline de atenção e cache.
O valor do tema está nos números e nas escolhas de engenharia. A própria Character.ai afirma servir cerca de 20 mil consultas de inferência por segundo, com reduções de custo de serviço superiores a 30 vezes desde 2022, resultado de otimizações de arquitetura, KV cache e quantização. Embora esses dados sejam de inferência, refletem o mesmo princípio central, reduzir I/O, memória e comunicação.
Este artigo destrincha as ideias principais, aponta por que funcionam, onde encaixá-las no seu pipeline e como traduzi-las em ganhos concretos em clusters com GPU ou TPU.
1. O que a Character.ai revelou e por que importa
O post técnico de pré-treinamento da Character.ai consolida cinco frentes: compressão de gradientes Squinch, regularização de atenção via Attention Z-Reg, quantização com Dynamic Clamping, um API de atenção com visibility mask e notas sobre receitas de escalonamento, como mu-P e warmup de batch. O pano de fundo é simples, manter qualidade enquanto reduz tráfego entre nós, melhora a estabilidade numérica em bf16 e evita o colapso de ativações após quantização.
A estratégia dialoga com a linha de eficiência de produção mostrada nos textos de inferência. Lá aparecem MQA, compartilhamento de KV entre camadas, caching persistente entre turnos de diálogo e treinamento nativo em int8 para eliminar mismatch entre treino e serviço. A combinação dá contexto para as decisões de pré-treinamento, priorizando custo e throughput sob limites reais de rede.
Reflexão prática, quem cuida de I/O, banda e memória leva vantagem. Ao otimizar comunicação, cache e precisão, reduz-se o custo marginal por token, o que permite rodar mais ablações e encontrar curvas de escala melhores, inclusive quando a empresa decide treinar menos e construir mais em cima de modelos abertos.
2. Squinch, compressão de gradientes em 6 bits sem perder acurácia
Squinch é uma compressão de gradientes em 6 bits, concebida para manter a mesma acurácia de gradientes em bf16 e, ao mesmo tempo, derrubar o custo de comunicação entre nós. A ideia é quantizar por blocos, codificando 8 valores de gradiente em 48 bits, preservando sinal e magnitude. Em clusters com banda aquém do ideal, isso faz diferença direta no tempo de passo por reduzir all-reduce e tráfego inter nó.
Por que funciona, gradientes costumam ser distribuições com caudas e variância que permitem compressão com escala por bloco. Ao preservar uma estimativa de amplitude por bloco, o erro de quantização cai, e técnicas de regularização estáveis evitam amplificar ruído. Em prática, Squinch é útil quando a largura de banda é o gargalo dominante, algo comum em clusters multi nó com rede inferior à de ponta.
Aplicação prática, teste Squinch ou um análogo de 6 a 8 bits integrado ao otimizador, com descompressão on the fly no all-reduce. Faça verificação de regressão em tarefas sensíveis a ruído de gradiente e compare com fp8 ou bf16 sem compressão. O ganho tende a aparecer quando a razão comunicação sobre computação é alta.
3. Attention Z-Reg, estabilidade numérica focada nos logits
A Character.ai descreve uma regularização que força o somatório log-sum-exp dos logits de atenção, o Z, a ficar próximo de zero. Em bf16, passos numéricos crescem com a magnitude. Ao puxar a faixa de valores para uma região de maior resolução, a otimização estabiliza. O detalhe importante, não é um termo de perda convencional, o gradiente correspondente é injetado no backward da atenção.
O conceito se inspira em ideias como o router z-loss de modelos MoE, introduzido para estabilizar logits do roteador no Switch Transformer ao penalizar log-sum-exp elevado. Transportar essa intuição para os logits de atenção faz sentido quando se observam explosões de magnitude no pré-softmax.
Aplicação prática, habilite um termo Z-Reg escalonado por número de cabeças e camadas, como aparece no post, e monitore métricas de instabilidade, spikes de perda e saturação da softmax. Se a sua pilha já usa bf16 e longos contextos, os ganhos tendem a ser visíveis nos primeiros dias de treino.
4. Dynamic Clamping e quantização estável, evitando o colapso para zero
Quantização traz risco de colapso de ativações pequenas para zero, especialmente com ativações ReLU ao quadrado e limites constantes. O Dynamic Clamping ajusta o limite de clamp com base no rms do peso de entrada da projeção, além de propagar esse limite para a quantização do quadrado, o que mantém densidade de informação mesmo quando o rms cai. Resultado prático, treinos em int8 ou fp8 ficam mais estáveis e preservam qualidade.

Isso conversa com outra decisão da Character.ai, treinar nativamente em int8. Em vez de quantizar depois, treinar no mesmo regime do serviço evita mismatch e ganhos se acumulam nas duas pontas, custo de treino e custo de inferência. Em produção, a empresa relata ter reduzido KV cache, quantizado pesos e ativações e integrado kernels int8 customizados. Para quem escala modelos conversacionais, essa rota torna custos previsíveis e auditáveis.
Exemplo prático, comece com QAT de pesos e ativações e promova int8 end to end em fases, primeiro atenções, depois MLP. Se usar ReLU2, habilite Dynamic Clamping com limites dependentes de rms e valide em uma suite de tarefas de referência interna. Mantendo a estabilidade, avance para treinamento nativo em int8 para eliminar conversões.
5. Atenção eficiente, visibility mask e reutilização de KV
A equipe introduz uma API de atenção baseada em visibility mask, que codifica, por token, os limites de onde pode ou não atender. Em dados de chat, isso representa relações em árvore, permite empacotar múltiplos trechos não relacionados e ainda apoia atenção bidirecional quando necessário. O impacto é menos trabalho inútil, melhor uso de janelas locais e globais e menos desperdício de memória.
No lado de servir, a Character.ai descreve um sistema de caching inter-turno que alcança taxas de acerto de 95 por cento, mantendo KV em memória do host entre turnos e usando hash rolante de prefixos para reutilizar trechos parcialmente coincidentes. Somado a MQA e a compartilhamento de KV entre camadas, o throughput cresce sem sacrificar qualidade perceptível em conversas.
Há trabalho acadêmico na mesma direção, como o YOCO, que só cacheia uma vez e reutiliza KV global via cross-attention, bem como abordagens de pré computar KV de documentos e concatenar em busca e RAG. O recado é claro, KV é o gargalo de I/O e memória, qualquer esquema de reutilização gera minutos de economia por hora de GPU.
![Placa Google TPU v4 para clusters de treinamento]
6. Hardware, topologias e realismo de custos
Treinamento de Transformers em larga escala não vive só de técnica, depende do mix TPU e GPU e de topologias de interconexão. TPUs v4 oferecem até 1,1 exaflops bf16 ou int8 por pod com 4096 chips e malha 3D, com bisection e all-reduce imensos, algo que favorece receitas com menos banda por gradiente quando não se tem um pod completo. Em GPUs H100, há largura de banda de memória por GPU superior a 3 TB por segundo e NVLink, que beneficiam kernels de atenção com dequantização fundida e packing de cabeças. Essas capacidades explicam por que Squinch e quantização agressiva pagam o investimento em clusters mais modestos.
Parcerias de nuvem definem o teto de performance e custo por hora. Ao combinar TPUs e VMs A3 com H100, arquiteturas híbridas ficam mais viáveis, com a liberdade de optar entre TPU e GPU conforme a carga. Para quem opera com tráfego massivo, esse mix facilita equalizar custo marginal e latência fim a fim.
![GPUs NVIDIA H100 usadas em clusters de LLM]
7. Checklist de aplicação imediata
- Reduza comunicação com compressão de gradientes. Avalie Squinch 6 bits por bloco. Compare tempo por passo e perda final com bf16. Combine com técnicas de regularização para robustez.
- Estabilize logits de atenção com Z-Reg. Monitore spikes de perda, saturação da softmax e histograma de logits. Leve a intuição do router z-loss para a atenção.
- Evite colapso em QAT. Use Dynamic Clamping com limites dependentes de rms e promova int8 nativo quando os testes A B mostrarem equivalência.
- Ataque o gargalo de KV. Implante caching inter-turno, MQA e, quando possível, compartilhamento de KV entre camadas. Avalie técnicas como YOCO e pré computação de KV em pipelines com RAG.
- Revise topologia e workload. Em TPU v4, explore slices e toros torcidos para all-to-all. Em H100, ajuste kernels com dequantização fundida e packing de cabeças, como na integração com FA 3.
Conclusão
Eficiência em treinamento de Transformers em larga escala não é um truque isolado. É um pacote, compressão que respeita o sinal do gradiente, regularização que mantém a matemática no regime preciso, quantização que não mata sinal, atenção que não desperdiça I/O e cache que não recompõe o passado a cada passo. A Character.ai mostrou que pequenos ganhos somados viram ordens de grandeza quando o alvo é o token por dólar.
O ponto final é pragmático. Se o objetivo é treinar mais com menos, priorize gargalos que queimam banda e memória, alinhe precisão do treino com a do serviço e invista em reuso de trabalho, especialmente em atenção e KV. O resto é medir de forma honesta, ablar e padronizar o que provar valor no seu stack.
