Phase 10 - Lesson 20

Walkthrough da Arquitetura do DeepSeek-V3

A Fase 10 · Lição 14 nomeou os seis ajustes (knobs) de arquitetura que todo modelo aberto faz. O DeepSeek-V3 (dezembro de 2024, 671B de parâmetros no total, 37B ativos) faz todos os seis e adiciona mais quatro: Multi-Head Latent Attention, balanceamento de carga livre de perda auxiliar (auxiliary-loss-free load balancing), Multi-Token Prediction e treinamento DualPipe. Esta lição lê a arquitetura do DeepSeek-V3 de cima a baixo e deduz cada contagem de parâmetros a partir da configuração publicada. Ao final, você poderá explicar por que a proporção 671B/37B é a aposta certa e por que a combinação de MLA + MoE supera qualquer uma delas isoladamente na fronteira.

Tipo: Learn Idiomas: Python (stdlib, calculador de parâmetros) Pré-requisitos: Fase 10 · 14 (walkthroughs de modelos abertos), Fase 10 · 17 (NSA), Fase 10 · 18 (MTP), Fase 10 · 19 (DualPipe) Tempo: ~75 minutos

Objetivos de Aprendizado

  • Ler a configuração do DeepSeek-V3 de cima a baixo e explicar cada campo em termos dos seis ajustes do GPT-2 mais as quatro adições específicas do DeepSeek.
  • Deduzir a contagem total de parâmetros (671B), contagem de parâmetros ativos (37B) e os componentes que contribuem para cada uma.
  • Calcular a pegada de cache KV da MLA em um contexto de 128k e comparar com o que um modelo denso com os mesmos parâmetros ativos usando GQA pagaria.
  • Apresentar as quatro inovações específicas do DeepSeek (MLA, MTP, roteamento livre de perda auxiliar, DualPipe) e nomear qual parte da pilha de arquitetura/treinamento cada uma visa.

O Problema

O DeepSeek-V3 é o primeiro modelo aberto de fronteira cuja arquitetura é significativamente diferente da família Llama. O Llama 3 405B é o "GPT-2 com seis ajustes feitos". O DeepSeek-V3 é o GPT-2 com todos os seis ajustes mais quatro adicionais. Ler a configuração do Llama 3 é um aquecimento para ler a configuração do DeepSeek, mas a estrutura profunda — o formato do bloco de atenção, a lógica de roteamento, o objetivo em tempo de treinamento — é diferente o suficiente para que você precise de um walkthrough separado.

O retorno de aprender isso: o lançamento de pesos abertos do DeepSeek-V3 mudou o significado de "capacidade de fronteira" em modelos abertos. A arquitetura é o modelo que muitas rodadas de treinamento de 2026 estão copiando. Entendê-la é fundamental para qualquer função que envolva o treinamento ou inferência de LLMs de fronteira.

O Conceito

O núcleo invariante, novamente

O DeepSeek-V3 ainda é autorregressivo. Ele ainda empilha blocos decodificadores. Cada bloco ainda tem atenção mais MLP mais duas RMSNorms. Ele ainda usa SwiGLU no MLP. Ele ainda usa RoPE. Pré-norma. Embeddings com pesos compartilhados (weight-tied embeddings). A mesma base de todo Llama ou Mistral.

A mudança: MLA em vez de GQA

A partir da Fase 10 · 14, você sabe que a GQA encolhe o cache KV ao compartilhar K e V entre grupos de cabeças Q. A Multi-Head Latent Attention (MLA) vai além: K e V are compressed em uma representação latente compartilhada de baixo posto (o kv_lora_rank), e então descomprimidos por cabeça dinamicamente. O cache KV armazena apenas a representação latente — normalmente 512 floats por token por camada, em vez de 8 x 128 = 1024 floats.

Em um contexto de 128k, o DeepSeek-V3 com MLA (uma latente compartilhada c^{KV} por token por camada; K e V são ambos derivados desta latente por meio de projeções lineares de subida que podem ser absorvidas na multiplicação de matrizes subsequente):

kv_cache = num_layers * kv_lora_rank * max_seq_len * bytes_per_element
         = 61 * 512 * 131072 * 2
         = 7.6 GB

Uma linha de base hipotética de GQA (formato do Llama 3 70B, 8 cabeças KV, dimensão da cabeça 128) pagaria:

kv_cache = 2 * 61 * 8 * 128 * 131072 * 2
         = 30.5 GB

A MLA é 4 vezes menor do que um cache GQA no estilo Llama-3-70B em um contexto de 128k.

O tradeoff: a MLA adiciona uma etapa de descompressão por computação de atenção (por cabeça). A computação extra é pequena em comparação com a largura de banda economizada. Uma vitória líquida para inferência com contextos longos.

O roteamento: balanceamento de carga livre de perda auxiliar

Os roteadores MoE decidem quais k principais especialistas processam cada token. Um roteador ingênuo concentra muito trabalho em poucos especialistas, deixando outros ociosos. A correção padrão: adicionar um termo de perda auxiliar que penaliza o desequilíbrio de carga. Isso funciona, mas degrada ligeiramente o desempenho na tarefa principal.

O DeepSeek-V3 introduz um esquema livre de perda auxiliar. Termos de viés por especialista são adicionados aos logits do roteador, ajustados durante o treinamento por uma regra simples: se o especialista e estiver sobrecarregado, diminua bias_e; se estiver subcarregado, aumente-o. Sem termo de perda extra. O treinamento permanece limpo. A carga dos especialistas permanece equilibrada.

Efeito na perda principal: nenhum mensurável. Efeito na arquitetura MoE: mais limpo, sem hiperparâmetros de perda auxiliar para ajustar.

O MTP: treinamento mais denso + rascunho gratuito

A partir da Fase 10 · 18, você sabe que o DeepSeek-V3 adiciona D=1 módulo MTP que prevê o token duas posições à frente. Na inferência, o módulo treinado é reaproveitado como um rascunho de decodificação especulativa com mais de 80% de aceitação. No treinamento, cada estado oculto é supervisionado em D+1 = 2 alvos, fornecendo um sinal mais denso.

Parâmetros: 14B além dos 671B principais. Sobrecarga: 2.1%.

O treinamento: DualPipe

A partir da Fase 10 · 19, você sabe que o DualPipe é um pipeline bidirecional que sobrepõe blocos de ida (forward) e volta (backward) com comunicações all-to-all entre nós. Na escala de 2.048 GPUs H800 do DeepSeek-V3, ele recupera aproximadamente 245 mil horas-GPU que o 1F1B teria perdido em bolhas de pipeline.

A configuração, campo por campo

Aqui está a configuração do DeepSeek-V3 (simplificada):

hidden_size: 7168
intermediate_size: 18432   (dense MLP hidden size, used on first few layers)
moe_intermediate_size: 2048 (expert MLP hidden size)
num_hidden_layers: 61
first_k_dense_layers: 3    (first 3 layers use dense MLP)
num_attention_heads: 128
num_key_value_heads: 128   (formally equal to num_heads under MLA, but
                           the real compression is in kv_lora_rank)
kv_lora_rank: 512          (MLA latent dimension)
num_experts: 256            (MoE expert count per block)
num_experts_per_tok: 8      (top-8 routing)
shared_experts: 1           (always-on shared expert per block)
max_position_embeddings: 163840
rope_theta: 10000.0
vocab_size: 129280
mtp_module: 1               (1 MTP module at depth 1)

Analise-a:

  • hidden_size=7168: dimensão do embedding.
  • num_hidden_layers=61: profundidade total de blocos.
  • first_k_dense_layers=3: os primeiros 3 blocos usam um MLP denso de tamanho 18432. Os 58 restantes usam MoE.
  • num_attention_heads=128: 128 cabeças de consulta (query).
  • kv_lora_rank=512: K e V são comprimidos para esta dimensão latente e descomprimidos por cabeça.
  • num_experts=256, num_experts_per_tok=8: cada bloco MoE tem 256 especialistas, roteia para os 8 principais.
  • shared_experts=1: além dos 256 especialistas roteados, 1 especialista sempre ativo contribui para cada token. Pense nisso como uma "base densa" que garante que cada token receba processamento estável.
  • moe_intermediate_size=2048: tamanho oculto do MLP de cada especialista. Menor que o MLP denso porque existem 256 deles.

Contabilidade de parâmetros

O cálculo completo reside em code/main.py. O resumo:

  • Embedding: vocab * hidden = 129280 * 7168 = ~0.93B.
  • Primeiros 3 blocos densos: atenção com MLA (144M por bloco) + MLP denso (260M por bloco) + normas. Cerca de 1.2B no total.
  • 58 blocos MoE: atenção com MLA (~144M) + 256 especialistas cada (30M cada) + 1 especialista compartilhado (30M) + norma. Total de ~7.95B por bloco, incluindo todos os especialistas. 461B no total para os 58 blocos MoE.
  • Módulo MTP: 14B.

Total geral: ~476B para a arquitetura principal + 14B de MTP + distintamente, o número publicado de 671B leva em conta parâmetros estruturais adicionais (tensores de viés, componentes específicos de especialistas, dimensionamento de especialistas compartilhados, etc.). O número que reproduzimos na calculadora está dentro de 3-5% do publicado — a diferença vem da contabilidade detalhada documentada no apêndice da Seção 2 do relatório do DeepSeek.

Parâmetros ativos por passagem para frente (forward):

  • Atenção: 144M por camada * 61 = 8.8B (todas as camadas são executadas).
  • MLP ativo: as primeiras 3 camadas são densas (3 * 260M = 780M), 58 camadas MoE estão ativas com 8 especialistas roteados + 1 compartilhado + sobrecarga de roteamento. MLP ativo por camada: ~260M. Total: 3 * 260M + 58 * 260M = ~15.9B.
  • Embedding + normas: 1.2B.
  • Total ativo: aproximadamente 26B no núcleo + 14B MTP (treinado, mas nem sempre executado na inferência) ≈ 37B.

A proporção 671B / 37B

Proporção de esparsidade de 18x (os parâmetros ativos representam 5.5% do total). O DeepSeek-V3 é o modelo MoE de fronteira mais esparso que já distribuiu pesos abertos. O Mixtral 8x7B na proporção 13/47 (28%) é muito mais denso. O Llama 4 Maverick na proporção 17B/400B (4.25%) é comparável. A aposta do DeepSeek: em escala de fronteira, mais especialistas com menor taxa de ativação produzem melhor qualidade por FLOP ativo.

Onde o DeepSeek-V3 se situa

Modelo Total Ativos Proporção Atenção Ideias inovadoras
Llama 3 70B 70B 70B 100% GQA 64/8
Llama 4 Maverick 400B 17B 4.25% GQA
Mixtral 8x22B 141B 39B 27% GQA
DeepSeek V3 671B 37B 5.5% MLA 512 MLA + MTP + aux-free + DualPipe
Qwen 2.5 72B 72B 72B 100% GQA 64/8 extensão YaRN

A sequência: R1, V4

O DeepSeek-R1 (2025) é uma rodada de treinamento de raciocínio no esqueleto do V3. O R1 usa a mesma arquitetura. O que mudou foi a receita de pós-treinamento (RL em grande escala em tarefas verificáveis), não a arquitetura de pré-treinamento.

O DeepSeek-V4 (se for lançado) deverá manter MLA + MoE + MTP e adicionar DSA (DeepSeek Sparse Attention), o sucessor da NSA da Fase 10 · 17. A linhagem é estável: inovações no nível da arquitetura se acumulam; cada versão faz novos ajustes.

Use-o

O code/main.py é o calculador de parâmetros especializado para o formato do DeepSeek-V3. Execute-o, compare sua saída com os números do artigo científico e use-o em variantes hipotéticas (256 especialistas vs 512, top-8 vs top-16, classificação MLA 512 vs 1024).

O que observar:

  • Contagem total de parâmetros vs os 671B publicados.
  • Contagem de parâmetros ativos vs os 37B publicados.
  • Cache KV em contexto de 128k — a comparação entre MLA e GQA.
  • Detalhamento por camada para ver para onde realmente vai o orçamento de parâmetros.

Envie-o

Esta lição produz outputs/skill-deepseek-v3-reader.md. Dado um modelo da família DeepSeek (V3, R1 ou qualquer variante futura), ela produz uma leitura de arquitetura componente por componente que nomeia cada campo da configuração, deduz as contagens de parâmetros por componente e identifica qual das quatro inovações específicas do DeepSeek o modelo utiliza.

Exercícios

  1. Execute o code/main.py. Compare a estimativa de parâmetros totais da calculadora com os 671B publicados e identifique de onde vem a diferença. A Seção 2 do artigo traz o detalhamento completo.

  2. Modifique a configuração para usar MLA rank 256 em vez de 512. Calcule o tamanho do cache KV resultante em um contexto de 128k. Qual é o percentual de redução obtido e a que custo para a expressividade por cabeça?

  3. Compare o roteamento do DeepSeek-V3 (256 especialistas, top-8) com uma variante hipotética de (512 especialistas, top-8). Os parâmetros totais aumentam; os parâmetros ativos permanecem os mesmos. O que a capacidade extra de especialistas compra em teoria e quanto custa na inferência?

  4. Leia a Seção 2.1 do relatório técnico do DeepSeek-V3 (arXiv:2412.19437) sobre MLA. Explique em três frases por que as matrizes de descompressão K e V podem ser "absorvidas" na multiplicação de matrizes (matmul) subsequente para fins de eficiência no tempo de inferência.

  5. O DeepSeek-V3 usa treinamento em FP8 para a maioria das operações. Calcule a economia de memória de FP8 vs BF16 para armazenar os pesos de 671B. Como isso se cruza com o orçamento de treinamento de 14.8T de tokens?

Termos-Chave

Termo O que dizem O que realmente significa
MLA "Multi-Head Latent Attention" Compactar K e V em uma latente compartilhada de baixo posto (kv_lora_rank, normalmente 512), descompactar por cabeça dinamicamente; o cache KV armazena apenas a latente
kv_lora_rank "Dimensão de compressão da MLA" O tamanho da latente compartilhada para K e V; o DeepSeek-V3 usa 512
Primeiras k camadas densas "As camadas iniciais permanecem densas" As primeiras camadas do modelo MoE ignoram o roteador MoE e executam um MLP denso para estabilidade
num_experts_per_tok "Roteamento top-k" Quantos especialistas roteados são acionados por token; o DeepSeek-V3 usa 8
Especialistas compartilhados "Especialistas sempre ativos" Especialistas que processam cada token independentemente do roteamento; o DeepSeek-V3 usa 1
Roteamento livre de perda auxiliar "Equilíbrio de carga ajustado por viés" Termos de viés por especialista ajustados durante o treinamento para manter a carga dos especialistas equilibrada sem adicionar um termo de perda
Módulo MTP "Cabeça de previsão extra" Bloco transformador que prevê t+2 a partir de h^(1) e E(t+1); treinamento mais denso, rascunho gratuito para decodificação especulativa
DualPipe "Pipeline bidirecional" Cronograma de treinamento que sobrepõe a computação forward/backward com comunicação all-to-all entre nós
Proporção de parâmetros ativos "Esparsidade" active_params / total_params; o DeepSeek-V3 atinge 5.5%
Treinamento em FP8 "Treinamento em 8 bits" Armazenamento de treinamento e muitas operações de computação em FP8; reduz a memória em cerca de metade em relação ao BF16 com um pequeno custo na qualidade

Leitura Adicional

0 lifetime access. Curriculum based on AI Engineering from Scratch by Rohit Ghumare (MIT, used under attribution).