O site PyImageSearch publica um tutorial dedicado à construção da arquitetura do DeepSeek-V3 com PyTorch, uma biblioteca de deep learning. Quinto episódio de uma série de seis, este tutorial, da autoria de Puneet Mangla, junta os blocos apresentados nas lições anteriores para formar um modelo de linguagem completo, que transforma tokens, as unidades de texto processadas pelo modelo, em logits, as pontuações atribuídas a cada token possível.
- O PyImageSearch publica um tutorial que constrói a arquitetura do DeepSeek-V3 em PyTorch.
- O modelo combina MLA e MoE em blocos pre-norm com conexões residuais.
- A partilha de pesos poupa cerca de 12,9 milhões de parâmetros.
- O treino consome cerca de 800 MB em FP32, e a implementação não usa cache chave-valor.
As lições anteriores cobriram a configuração do modelo, as Rotary Position Embeddings (RoPE), que codificam a posição dos tokens, a Multihead Latent Attention (MLA), um mecanismo de atenção, e a Mixture of Experts (MoE), ou mistura de especialistas, que distribui o cálculo entre várias sub-redes especializadas. A Multi-Token Prediction (MTP), por fim, permite prever vários tokens de uma só vez. Segundo o tutorial, melhora a eficiência do treino e pode acelerar a inferência graças ao decodificação especulativa.
Cada bloco do transformador combina a MLA e a MoE segundo um esquema denominado « pre-norm », no qual a normalização ocorre antes de cada subcamada. Conexões residuais fazem transitar os sinais diretamente de uma camada para a seguinte, o que, esclarece o autor, ajuda a resolver o problema do desaparecimento dos gradientes em redes profundas. O modelo completo encadeia depois os embeddings dos tokens e das posições, uma camada de dropout, os blocos, uma normalização final, uma cabeça de previsão do vocabulário e, opcionalmente, cabeças de MTP.
Partilha de pesos e previsão de vários tokens
O tutorial apresenta também a partilha de pesos entre a matriz de embedding dos tokens e a cabeça de previsão. Para um vocabulário de 50 259 tokens e uma dimensão de embedding de 256, esta técnica permite economizar cerca de 12,9 milhões de parâmetros. Segundo o autor, melhora frequentemente o desempenho, pois os espaços de entrada e de saída mantêm-se alinhados.
Durante o treino, as saídas das cabeças de MTP são calculadas para vários horizontes futuros, depois as suas perdas são combinadas com a perda principal e com uma perda auxiliar da MoE, destinada a equilibrar a carga entre os especialistas. No código apresentado, a perda média da MTP é ponderada por 0,3 em relação à perda principal. As cabeças de MTP não são utilizadas durante a inferência, ou seja, a geração de texto.
Tamanho do modelo e pegada de memória
Segundo o autor, o modelo tem cerca de 30 a 35 milhões de parâmetros distribuídos por seis camadas, ou seja, 2 a 3 milhões por camada, aos quais se somam 2 a 3 milhões de parâmetros por cabeça de MTP. Na precisão FP32, de 32 bits, apenas os parâmetros representam 120 a 140 megabytes. O treino, com os gradientes e os estados do otimizador AdamW, necessita de cerca de 500 a 600 MB, aos quais se somam as ativações. Para um lote de 4 exemplos de 1024 tokens, estas pesam 200 a 300 MB, ou seja, perto de 800 MB no total, uma quantidade que o tutorial considera compatível com os processadores gráficos (GPU) atuais.
Em inferência, a precisão FP16 reduz a memória para cerca de metade. A implementação não recorre a uma cache chave-valor e, portanto, recalcula o contexto em cada passo de geração. A próxima lição da série abordará o treino deste modelo com dados reais.
