Contextos ultralongos de 1M a 10M de tokens são limitados pela física de rede e memória dos clusters. O crescimento do KV Cache esgota a VRAM de GPUs isoladas. O paralelismo tensorial colapsa sob o tráfego de primitivas coletivas.
A solução definitiva reside no Sequence Parallelism e no RingAttention. Essas técnicas distribuem a sequência entre GPUs em anel lógico. Elas sobrepõem o cálculo matricial à transmissão de rede, atingindo custo de comunicação nulo.
O método foi formulado por Liu, Zaharia e Abbeel (UC Berkeley). Ele viabilizou o treinamento do Large World Model (LWM) para 1M+ tokens.
A técnica também fundamenta arquiteturas como o DeepSpeed Ulysses e o Unified Sequence Parallelism (USP).

Por que o Tensor Parallelism colapsa em sequências longas
O Tensor Parallelism (TP) divide os tensores de pesos e exige duas operações All-Reduce por camada a cada token. Esse tráfego cresce linearmente com a sequência N, saturando rapidamente os barramentos de interconexão.
No Llama-3-70B em BF16, o tráfego gerado por All-Reduce atinge 4,58 TB por forward pass para 1M tokens. Em 10M tokens, esse volume alcança 45,87 TB.
A tabela abaixo compara o tráfego gerado pelo Tensor Parallelism contra o Sequence Parallelism em um cluster com P = 8 GPUs:
Tamanho da Sequência (N) | KV Cache Total (Llama-3-70B) | Tráfego All-Reduce TP (8 GPUs) | Tráfego P2P RingAttention (8 GPUs) |
|---|---|---|---|
| 128k tokens | 41,94 GB | 587,20 GB | 41,94 GB |
| 512k tokens | 167,77 GB | 2,29 TB | 167,77 GB |
| 1M tokens | 327,68 GB | 4,58 TB | 327,68 GB |
| 4M tokens | 1,31 TB | 18,35 TB | 1,31 TB |
| 10M tokens | 3,28 TB | 45,87 TB | 3,28 TB |
O Tensor Parallelism também sofre uma restrição estrutural rígida. Seu grau de paralelismo é limitado pelo número de cabeças de atenção (n_heads ou n_kv_heads). Em modelos com Grouped-Query Attention (GQA-8), o TP não pode exceder 8 GPUs sem redundâncias.
O estouro físico de memória HBM pelo KV Cache
O Key-Value Cache armazena projeções de atenção passadas e cresce com o comprimento da sequência e o batch size. Nenhuma GPU individual dispõe de memória HBM3 suficiente para janelas multimilionárias de tokens.
A fórmula de memória para o KV Cache em um modelo com precisão de b_bytes por elemento é dada por:
Memória_KV = 2 × L × n_kv_heads × d_head × N × b_bytes
Para o Llama-3-70B (L = 80, n_kv_heads = 8, d_head = 128, b_bytes = 2 em BF16), cada token exige 327,68 KB de memória:
- Em 1 milhão de tokens, o KV Cache exige 327,68 GB de HBM.
- Em 10 milhões de tokens, o KV Cache exige 3,28 TB de memória dedicada.
Mesmo um nó HGX H100 com 8 GPUs de 80 GB (640 GB de HBM3 combinada) esgota sua capacidade antes de atingir 2M tokens. O fatiamento da sequência no eixo temporal (Sequence Parallelism) torna-se a única alternativa viável de escalabilidade física.
+-----------------------------------------------------------------------------------+
| PARTICIONAMENTO TEMPORAL DE SEQUÊNCIA |
| |
| Sequência Total: N tokens (ex: 1.048.576 tokens / 1M) |
| |
| [ Bloco 0 (131k) ] [ Bloco 1 (131k) ] [ Bloco 2 (131k) ] [ Bloco 3 (131k) ] |
| │ │ │ │ |
| ▼ ▼ ▼ ▼ |
| GPU 0 (HBM) GPU 1 (HBM) GPU 2 (HBM) GPU 3 (HBM) |
| Q0, K0, V0 Q1, K1, V1 Q2, K2, V2 Q3, K3, V3 |
| Cache: 40,96 GB Cache: 40,96 GB Cache: 40,96 GB Cache: 40,96 GB |
+-----------------------------------------------------------------------------------+
Como o RingAttention opera em anel lógico
O RingAttention particiona a sequência de N tokens igualmente entre P GPUs, atribuindo blocos de tamanho B = N / P. Cada GPU processa a atenção via FlashAttention enquanto transmite blocos para o nó vizinho.
A GPU i mantém seu bloco de Query Q_i fixo em sua SRAM e HBM local durante todas as iterações. Em cada etapa step = 0, ..., P - 1, ela executa três ações simultâneas:
- Cálculo Local de Atenção: Computa a atenção parcial entre o bloco fixo
Q_ie o bloco de chaves e valores atual(K_j, V_j). - Atualização Online de Softmax: Atualiza as estatísticas online de máximo local
m_ie soma exponenciall_i, acumulando a saídaO_ina SRAM. - Comunicação Assíncrona P2P: Transmite o bloco atual
(K_j, V_j)para a GPU(i + 1) mod PviancclSendenquanto recebe o próximo bloco da GPU(i - 1 + P) mod PviancclRecv.
Ao término de P etapas, cada bloco de Query Q_i interagiu com todos os blocos K e V da sequência completa. A computação é finalizada com consumo de memória por dispositivo estritamente reduzido para O(N / P).
# Algoritmo Conceitual de Execução RingAttention (Prefill)
import torch
import torch.distributed as dist
def ring_attention_forward(q_local, k_local, v_local, ring_group):
p = dist.get_world_size(ring_group)
rank = dist.get_rank(ring_group)
# Vizinhos no anel lógico
send_to = (rank + 1) % p
recv_from = (rank - 1 + p) % p
# Buffers locais e de comunicação assíncrona
curr_k, curr_v = k_local, v_local
next_k = torch.empty_like(curr_k)
next_v = torch.empty_like(curr_v)
out = None
lse = None # Log-sum-exp para softmax online
for step in range(p):
# Dispara comunicação assíncrona para a próxima etapa
reqs = []
if step < p - 1:
reqs.append(dist.isend(curr_k, dst=send_to, group=ring_group))
reqs.append(dist.isend(curr_v, dst=send_to, group=ring_group))
reqs.append(dist.irecv(next_k, src=recv_from, group=ring_group))
reqs.append(dist.irecv(next_v, src=recv_from, group=ring_group))
# Computação de FlashAttention em bloco sobrepondo a rede
out, lse = blockwise_flash_attn(q_local, curr_k, curr_v, out, lse)
# Sincroniza comunicação antes do próximo passo
for req in reqs:
req.wait()
curr_k, next_k = next_k, curr_k
curr_v, next_v = next_v, curr_v
return out
A prova matemática do Roofline: comunicação com custo zero
O custo de comunicação do RingAttention é reduzido a zero quando o tempo de execução do kernel matricial nos Tensor Cores for maior ou igual ao tempo de transmissão dos tensores pela rede.
O tempo de cálculo de um bloco de tamanho B nos Tensor Cores é dado por:
T_calc = (4 × B^2 × d_model) ÷ F_eff
Onde F_eff representa a taxa efetiva de processamento em FLOPS da GPU.
O tempo de transferência de rede do bloco de chaves e valores (K, V) entre duas GPUs adjacentes é dado por:
T_comm = (2 × (n_kv_heads ÷ n_heads) × B × d_model × b_bytes) ÷ W_net
Onde W_net é a largura de banda de rede bidirecional por GPU e G = n_heads / n_kv_heads é a razão de Grouped-Query Attention.

Para que ocorra 100% de sobreposição (overlap perfeito), impõe-se a condição:
T_calc ≥ T_comm
Substituindo as expressões e isolando o tamanho mínimo do bloco local B:
B ≥ (1 ÷ G) × ((b_bytes × F_eff) ÷ (2 × W_net))
Avaliando essa inequação em uma GPU NVIDIA H100 SXM5 (F_eff = 500 TFLOPS em BF16, b_bytes = 2, G = 4 no Llama-3):
- Em barramento NVLink 4 (W_net = 900 GB/s):
B_min = (1/4) × ((2 × 500×10^12) ÷ (2 × 900×10^9)) ≈ 139 tokens. - Em rede InfiniBand NDR (W_net = 50 GB/s = 400 Gbps):
B_min = (1/4) × ((2 × 500×10^12) ÷ (2 × 50×10^9)) = 2.500 tokens.
Em superclusters com sequências de 1M a 10M tokens e P = 64 a 512 GPUs, o bloco B = N / P varia entre 15.625 e 131.072 tokens.
Como B >> B_min, a transferência de dados ocorre em segundo plano. Isso assegura eficiência de paralelismo linear acima de 98%.
Balanceamento de carga causal: Striped vs ZigZag RingAttention
Em modelos autoregressivos, o mascaramento causal impede que tokens atendam a posições futuras. Particionamentos em blocos contíguos deixam nós ociosos na maior parte das iterações, desperdiçando até 50% dos ciclos de hardware.
Para eliminar essa assimetria computacional, duas variantes algorítmicas foram desenvolvidas:
1. Striped RingAttention (Particionamento Round-Robin)
O Striped RingAttention particiona os tokens da sequência em padrão alternado (round-robin), atribuindo o token de índice t à GPU t mod P. Cada dispositivo recebe tokens uniformemente distribuídos por toda a extensão do documento.
Essa estratégia faz com que todas as GPUs processem exatamente 50% de blocos causais válidos em cada etapa do anel, eliminando a ociosidade.
2. ZigZag RingAttention (Agendamento Reflexivo)
O ZigZag RingAttention preserva a contiguidade local dos blocos, mas reorganiza a ordem de cálculo das chaves em zigue-zague.
Essa técnica reduz as transmissões P2P necessárias pela metade em relação ao anel padrão. Ela mantém os Tensor Cores ocupados durante todo o tempo.
+-----------------------------------------------------------------------------------+
| COMPARATIVO DE BALANCEAMENTO CAUSAL NO SEQUENCE PARALLELISM |
| |
| 1. Bloco Contíguo Padrão: |
| GPU 0: [=== ] -> 12,5% Utilização (Gargalo de ociosidade) |
| GPU 3: [=======================] -> 100% Utilização |
| |
| 2. Striped RingAttention (Round-Robin): |
| GPU 0: [=========== ] -> 50% Carga constante em todas as GPUs |
| GPU 1: [=========== ] -> 50% Carga constante em todas as GPUs |
| GPU 2: [=========== ] -> 50% Carga constante em todas as GPUs |
| GPU 3: [=========== ] -> 50% Carga constante em todas as GPUs |
+-----------------------------------------------------------------------------------+
Comparativo de arquiteturas: RingAttention vs Ulysses vs USP
Diferentes abordagens de Sequence Parallelism foram criadas para otimizar hierarquias de rede específicas. A escolha da técnica correta depende diretamente da topologia física do cluster.
A tabela a seguir sumariza as características operacionais das principais arquiteturas:
| Dimensão Técnica | Megatron-LM SP | DeepSpeed Ulysses | RingAttention | Unified Sequence Parallelism (USP) |
|---|---|---|---|---|
| Primitiva de Rede | All-Gather + Reduce-Scatter | All-to-All Coletivo | P2P Assíncrono (send/recv) | Híbrido: All-to-All + P2P |
| Topologia Alvo | Intra-nó (NVLink) | Intra-nó / Inter-nó rápido | Escala massiva Inter-nó | Superclusters Híbridos |
| Volume de Comunicação | 4 × N × d_model | 2 × N × d_model | 2 × N × d_model × (KV / Q) | Minimização dinâmica |
| Overlap de Comunicação | Parcial | Não nativo | 100% Oculto sob GEMM | 100% Oculto sob GEMM |
| Limite de Escalabilidade | Limitado por n_heads | Limitado por n_heads | Escala até 10M+ tokens | Escala até 10M+ tokens |
| Complexidade de Código | Moderada | Baixa | Moderada | Alta |
O DeepSpeed Ulysses utiliza primitivas coletivas All-to-All para transpor a dimensão de sequência para a dimensão de cabeças de atenção. Ele apresenta menor latência absoluta em redes de alta largura de banda intra-nó, mas é estritamente limitado pelo número total de cabeças n_heads.
O Unified Sequence Parallelism (USP) combina as duas abordagens. Ele executa DeepSpeed Ulysses dentro do mesmo nó HGX via NVLink a 900 GB/s e RingAttention entre nós distintos via InfiniBand NDR a 400 Gbps.

Guia de engenharia: configurando RingAttention no PyTorch e vLLM
A implementação em produção do RingAttention exige o isolamento correto dos grupos de processo distribuídos no PyTorch (torch.distributed) e a configuração de streams CUDA dedicadas para evitar contenção nos kernels de computação.
1. Inicialização dos Process Groups no PyTorch
Para clusters que combinam Data Parallelism (DP), Tensor Parallelism (TP) e Sequence Parallelism (SP), as malhas de comunicação devem ser desacopladas:
import os
import torch
import torch.distributed as dist
def setup_distributed_mesh(tp_size=1, sp_size=8, dp_size=1):
dist.init_process_group(backend="nccl")
world_size = dist.get_world_size()
rank = dist.get_rank()
# Validação dimensional da malha
assert world_size == tp_size * sp_size * dp_size
# Criação dos grupos de Sequence Parallelism em anel
sp_groups = []
for dp in range(dp_size):
for tp in range(tp_size):
sp_ranks = [
dp * (tp_size * sp_size) + sp * tp_size + tp
for sp in range(sp_size)
]
group = dist.new_group(ranks=sp_ranks)
if rank in sp_ranks:
my_sp_group = group
return my_sp_group
2. Configurações essenciais para NCCL em clusters de alta velocidade
O comportamento do anel P2P depende das seguintes variáveis de ambiente no NCCL:
# Habilita canais P2P diretos sem passar pela memória do host
export NCCL_P2P_DISABLE=0
export NCCL_NET_GDR_LEVEL=5
# Otimiza o número de canais de comunicação paralelos para sobreposição
export NCCL_MIN_NCHANNELS=8
export NCCL_MAX_NCHANNELS=16
# Desativa o tree algorithm em favor do ring nativo para transferências sequenciais
export NCCL_ALGO=Ring
export NCCL_PROTO=Simple
3. Integração com motores de inferência (vLLM e SGLang)
Em ambientes de inferência, o RingAttention é utilizado prioritariamente na fase de Prefill distribuído para requisições com milhões de tokens de contexto.
Mecanismos de Chunked Prefill e PD-Disaggregation dividem o processamento inicial em pedaços de 8k ou 16k tokens, permitindo que nós dedicados de decodificação gerem respostas enquanto instâncias equipadas com RingAttention consomem o contexto extenso.
Impactos práticos e limitações operacionais
A adoção do RingAttention expande os horizontes da inteligência artificial generativa, mas impõe desafios operacionais que devem ser avaliados pelos times de engenharia:
- Jitter de Rede e Sensibilidade a Falhas: Em topologias de anel lógico estrito com mais de 512 GPUs, a oscilação em uma única porta óptica afeta o ciclo de rotação do anel inteiro.
- Latência de Decodificação Autoregressiva: O RingAttention é ideal para a fase de Prefill. Na fase de Decode com batch unitário, a computação é limitada por memória e o round-trip de rede volta a ser relevante.
- Combinação com Compressão Estrutural: Integrar o RingAttention com compressões de KV Cache — como Multi-Head Latent Attention (MLA) e RadixAttention — amplia o limite de contexto para dezenas de milhões de tokens.
Perguntas Frequentes (FAQ)
O que diferencia o RingAttention do Sequence Parallelism tradicional do Megatron-LM?
O Sequence Parallelism do Megatron divide ativações locais em LayerNorm e Dropout, mas reconstrói a sequência total com All-Gather antes da atenção. O RingAttention mantém a sequência dividida durante todo o cálculo de atenção.
O RingAttention introduz perda de precisão numérica ou degradação na qualidade do modelo?
Não. O RingAttention é uma equivalência matemática exata do algoritmo de atenção padrão do Transformer. Ele utiliza o reescalonamento online de softmax do FlashAttention, produzindo resultados idênticos ao cálculo em GPU única.
Qual a velocidade de rede mínima para atingir overlap perfeito de comunicação?
Em GPUs NVIDIA H100 com GQA-8 em BF16, redes InfiniBand NDR de 400 Gbps (50 GB/s) exigem blocos de pelo menos 2.500 tokens por nó. Em barramentos NVLink (900 GB/s), blocos a partir de 139 tokens garantem 100% de sobreposição.
É possível aplicar RingAttention durante o treinamento e na inferência?
Sim. No treinamento e no prefill da inferência, o RingAttention opera com máxima eficiência, pois os blocos volumosos de Query saturam os Tensor Cores. Na fase de decode, ele é combinado com desagregação PD.
Fontes Primárias Auditadas
- Liu, H., Zaharia, M., & Abbeel, P. (2023). RingAttention with Blockwise Transformers for Near-Infinite Context. arXiv preprint arXiv:2310.01889.
- Liu, H., Yan, W., Zaharia, M., & Abbeel, P. (2024). World Model on Million-Length Video And Language With RingAttention. arXiv preprint arXiv:2402.08268.
- Jacobs, S. A., et al. / Microsoft Research (2023). DeepSpeed Ulysses: System Optimizations for Enabling Training of Extreme Long Sequence Transformer Models. arXiv preprint arXiv:2309.14509.
- Korthikanti, V. A., et al. / NVIDIA (2022). Reducing Activation Recomputation in Large Transformer Models. arXiv preprint arXiv:2205.05198.
- ByteDance Research (2024). USP: A Unified Sequence Parallelism Approach for Long Context Large Language Models. arXiv preprint arXiv:2405.07719.
- Dao, T., et al. (2022). FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness. arXiv preprint arXiv:2205.14135.