O Gargalo Que Ninguém Quer Falar: HBM, Não FLOPs
Olha só, todo time que escala LLM bate na mesma parede. Suas GPUs não estão limitadas por compute — estão limitadas por memória. Pesos do modelo, gradientes, estados do otimizador, buffers de comunicação e ativações intermediárias brigam pelo mesmo pool de HBM. No momento em que você tenta aumentar sequence length ou batch size: OOM.
É aqui que entra o host offloading. Em vez de recomputar ativações no backward pass (rematerialization), você faz streaming delas para memória pinned do host no forward pass e traz de volta quando precisar. A troca muda de "compute extra" para "bandwidth extra".
Em clusters commodity, essa troca é ruim — PCIe é lento demais. Mas no NVIDIA Grace Blackwell, vira superpoder. A CPU Grace e a GPU Blackwell estão ligadas por NVLink-C2C a 900 GB/s bidirecional, e a plataforma Vera Rubin dobra isso para 1.8 TB/s. De repente, memória do host é uma área de staging legítima, não uma penalidade.
Se você curte acompanhar como outras infraestruturas estão repensando hierarquias de memória sob carga real, essa análise da migração dos headless browsers da Cloudflare é um case paralelo excelente. 🚀

Os Resultados: DeepSeek-V3 671B e Llama 3.1 405B
Todos os benchmarks rodaram em NVIDIA GB200 NVL72 com 128 GPUs, usando MaxText (JAX + XLA) como framework.
DeepSeek-V3 671B (MoE + MLA)
A política faz offload de projeções MLA query/key-value e intermediários de up-projection do MoE — ativações grandes o suficiente para decidir se uma config de batch cabe ou não.
| Config | Micro Batch | Global Batch | TFLOPs/s/device | GPU Peak (GiB) | Host Mem (GiB) |
|---|---|---|---|---|---|
| Host offload + LHS + pipelined | 8 | 1024 | 908.2 | 165.2 | 145.1 |
| Sem offload + rematerialization | 8 | 1024 | 578.3 | 151.3 | 0.0 |
| Host offload, sem LHS, sem pipeline | 8 | 1024 | 541.6 | 145.6 | 145.1 |
| Sem offload, save on device | 2 | 256 | 425.3 | 113.3 | 0.0 |
| Sem offload, save on device | 8 | 1024 | – | OOM | 0.0 |
Isso é 57% mais rápido que rematerialization e 67.7% mais rápido que offloading ingênuo sem LHS ou pipelining. E olha a linha 5: sem offloading, micro batch 8 / global batch 1024 simplesmente não cabe. O offloading torna viável.
Llama 3.1 405B (Denso)
| Config | LHS | Pipelined | TFLOPs/s/device | GPU Peak (GiB) | Host Mem (GiB) |
|---|---|---|---|---|---|
| Sem offload | ON | OFF | 2,669 | 149.6 | 0 |
| QKV offload | ON | OFF | 2,746 | 149.9 | 70.9 |
| QKV offload | OFF | OFF | 2,569 | 139.7 | 70.9 |
| QKV offload | ON | ON | 2,718 | 151.0 | 70.9 |
Um ganho de 2.9% sobre o baseline — menor que o DeepSeek, mas revelador. Aqui o LHS sozinho já esconde quase toda a latência, então pipelining não adiciona nada. Para modelos densos, offloading é otimização de performance. Para modelos MoE com footprint gigante de ativações, é destravar capacidade.
As Flags do XLA Que Fazem Isso Funcionar
# Habilita o latency hiding scheduler
--xla_gpu_enable_latency_hiding_scheduler=true
# Habilita pipelined host offloading (crítico para workloads MoE)
--xla_gpu_enable_pipelined_host_offloading=true
# Aumenta o trabalho async em voo para o LHS sobrepor copies com coletivas NCCL
--xla_gpu_experimental_parallel_async_compute_limit=8
A terceira flag é subestimada. Ela dá espaço pro scheduler sobrepor copies device-to-host com comunicação coletiva. Sem ela, você deixa throughput na mesa.

Limitações e Cuidados
Host offloading não é bala de prata. Onde ele falha:
- Tensores pequenos: se o offload não reduz pressão de HBM de forma significativa, o custo de transferência domina.
- Workloads com pouco overlap: se não tem compute ou comunicação independente suficiente para esconder latência, você perde performance. O Llama 3.1 405B mostra isso — LHS já bastava.
- Gargalo não é memória: se seu workload é limitado por coletivas NCCL ou overhead de kernel launch, offloading não ajuda.
- Estimativas estáticas mentem: memória em runtime inclui scratch do NCCL, workspace de attention do cuDNN e buffers do framework. Sempre profile com runs reais.
Mais uma coisa: o run com offload usou mais memória de GPU (165.2 vs 145.6 GiB) porque mantém copy buffers e ativações prefetchadas residentes. Você troca capacidade de HBM por throughput. É uma escolha deliberada, não almoço grátis. 🍽️
Como Começar
- Comece com um run JAX pequeno e representativo — não um toy, não produção.
- Escolha ativações grandes de forward paths caros (projeções QKV, up-projections MoE).
- Habilite offloading via
jax.rematcommemory_kind="pinned_host". - Meça três coisas: memória GPU em runtime, memória do host, e step time end-to-end.
- Profile com Nsight Systems para confirmar que copies D2H e H2D realmente sobrepõem com compute e NCCL.
Para quem também pensa em como plataformas cloud tomam decisões de escala, vale dar uma olhada na integração do Google Cloud Workbench com VS Code — é outra camada da mesma pergunta: "onde o trabalho realmente roda?".

A Conclusão
Host offloading ressignifica uma troca clássica. Em vez de pagar com compute (rematerialization), você paga com bandwidth (streaming). Em interconnects da classe NVLink-C2C, essa bandwidth é barata o suficiente para ganhar.
O resultado do DeepSeek-V3 é a manchete: 908 TFLOPs/s/device com micro batch 8 / global batch 1024, uma configuração que literalmente dá OOM sem offloading. Isso não é um ganho de 5% em tuning — é um novo regime operacional.
Mas não saia copiando cegamente. Profile primeiro. Offloading é uma decisão de posicionamento de memória que precisa ser validada com medições, não suposições. Se suas ativações são pequenas ou seu workload já tem bom overlap, você não ganha nada. Se HBM é a parede entre você e o próximo batch size, essa pode ser a alavanca que você procurava.
Próximos passos:
- Leia o tutorial de host offloading do JAX (
jax.remat, checkpoint policies,memory_kind="pinned_host"). - Experimente os containers do NVIDIA JAX-Toolbox como ponto de partida mantido.
- Profile seu workload atual com Nsight Systems para ver se a latência de transferência está exposta.
Fonte: NVIDIA Developer Blog — Reducing HBM Bottlenecks in JAX-Based LLM Training with Host Offloading