O Gargalo Silencioso do Treinamento de LLMs: Por Que o Armazenamento Importa?

Foto por jeanvdmeulen via Pixabay
Quando discutimos o treinamento de Grandes Modelos de Linguagem (LLMs), a atenção quase sempre se volta para as GPUs. Falamos sobre clusters de NVIDIA H100, consumo de energia e contagem de parâmetros. No entanto, há um gargalo silencioso que pode arruinar a eficiência de qualquer supercomputador de IA: o subsistema de armazenamento. Sem uma infraestrutura de I/O (Entrada/Saída) extremamente rápida, as GPUs mais caras do mundo passam preciosos milissegundos ociosas, esperando que os dados sejam carregados na memória.
Recentemente, a notícia de que a Noruega adquiriu 2 petabytes (PB) de armazenamento flash da Huawei para apoiar seus esforços de treinamento de LLMs acendeu um debate técnico e geopolítico fascinante. Para nós, desenvolvedores e arquitetos de sistemas que frequentamos o Hacker News, esse caso é um prato cheio para analisar a engenharia de dados em escala de petabytes, as demandas de I/O de modelos massivos e como otimizar pipelines de dados de IA.
O Ciclo de Vida dos Dados no Deep Learning
Para entender por que a Noruega precisou de 2 PB de armazenamento flash de altíssima performance, precisamos olhar para o ciclo de vida dos dados durante o treinamento de um LLM. O processo não se resume a ler um arquivo de texto sequencialmente. Ele envolve:
- Tokenização e Pré-processamento: Bilhões de documentos de texto bruto são limpos, tokenizados e convertidos em tensores binários. Esse dataset processado precisa ser acessado de forma aleatória e rápida por múltiplos nós de computação.
- Data Loading em Larga Escala: Durante o treinamento, os workers de PyTorch ou TensorFlow realizam leituras paralelas massivas. Se o armazenamento apresentar latência, o tempo de computação por época (epoch) aumenta drasticamente.
- Checkpointing de Modelos: Talvez o aspecto mais crítico. Modelos com centenas de bilhões de parâmetros precisam salvar seu estado (pesos, estados do otimizador Adam, gradientes) periodicamente para evitar a perda de progresso em caso de falha de hardware.
O Desafio do Checkpointing em Larga Escala
Imagine um modelo de 175 bilhões de parâmetros. Cada parâmetro em precisão FP16 ocupa 2 bytes. O otimizador Adam adiciona mais 12 bytes por parâmetro. Salvar um único checkpoint desse modelo exige gravar cerca de 2.4 terabytes de dados na memória de armazenamento o mais rápido possível. Se o cluster de armazenamento demorar 10 minutos para gravar esse checkpoint, as GPUs ficam bloqueadas ou o pipeline sofre uma degradação severa de performance. Com armazenamento flash NVMe de alta velocidade, esse tempo é reduzido para segundos, maximizando o tempo de atividade útil das GPUs.
A Infraestrutura Norueguesa: 2 Petabytes de Flash Huawei
A escolha da Noruega por soluções de armazenamento flash da Huawei (provavelmente da linha OceanStor Dorado) destaca a busca por densidade, throughput e eficiência energética. O armazenamento flash baseado em NVMe-over-Fabrics (NVMe-oF) permite que os nós de computação acessem os SSDs remotos com latências quase idênticas às de SSDs locais instalados diretamente no barramento PCIe.
Por que Flash? A Necessidade de Baixa Latência e Alto Throughput
Diferente de sistemas de arquivos distribuídos tradicionais baseados em discos rígidos (HDDs) mecânicos, que são excelentes para arquivamento frio, o treinamento de LLMs exige IOPS (Operações de Entrada/Saída por Segundo) extremamente altos e latência na casa dos microssegundos. Quando lidamos com paralelismo de dados e paralelismo de tensores, a sincronização entre os nós exige que os dados de treinamento sejam distribuídos de forma homogênea e ultra-rápida.
A tecnologia flash moderna utiliza células NAND 3D de alta densidade combinadas com controladores inteligentes que realizam compressão e deduplicação de dados em tempo real sem penalidade de performance. Isso significa que os 2 PB físicos adquiridos pela Noruega podem, na prática, armazenar um volume muito maior de dados brutos de treinamento.
Análise Comparativa de Arquiteturas de Armazenamento para IA

Foto por StephanieAlbert via Pixabay
Para arquitetar sistemas eficientes, precisamos comparar as opções disponíveis no mercado. A tabela abaixo detalha as diferenças cruciais entre as abordagens de armazenamento para cargas de trabalho de Inteligência Artificial:
| Métrica / Característica | Armazenamento Flash Distribuído (ex: Huawei Dorado, WekaIO) | Sistemas de Arquivos Paralelos (Lustre / GPFS com HDD+SSD) | Object Storage Cloud (S3 / GCS) |
|---|---|---|---|
| Latência de Leitura | Ultra-baixa (< 100 microssegundos) | Média-baixa (milissegundos) | Alta (dezenas de milissegundos) |
| Throughput de Escrita (Checkpointing) | Extremamente Alto (Centenas de GB/s) | Alto (Escalável com nós de metadados) | Moderado (Limitado por API/Rede) |
| Suporte a GPUDirect Storage (GDS) | Nativo / Excelente | Requer camadas de software complexas | Inexistente ou via gateways lentos |
| Custo por Terabyte | Alto | Moderado | Baixo |
| Complexidade de Gerenciamento | Baixa a Média (Sistemas integrados) | Altíssima (Requer equipe dedicada) | Mínima (Gerenciado pelo provedor) |
Otimizando o Pipeline de I/O: Engenharia Reversa do Carregamento de Dados
Como desenvolvedores, não podemos apenas confiar no hardware; precisamos escrever código que aproveite essa largura de banda massiva. Um erro comum ao treinar modelos no PyTorch é usar um DataLoader mal configurado que se torna o gargalo do sistema, deixando a GPU ociosa (GPU starvation).
Abaixo, apresentamos um exemplo prático de como implementar um benchmark de leitura de dados simulando o carregamento de tensores de um sistema de arquivos flash de alta performance. O código utiliza mapeamento de memória (mmap) e múltiplos workers para garantir que o throughput do armazenamento seja totalmente aproveitado.
import torch
from torch.utils.data import Dataset, DataLoader
import numpy as np
import time
import os
class LargeScaleDataset(Dataset):
def __init__(self, filepath, num_samples, sample_shape):
self.filepath = filepath
self.num_samples = num_samples
self.sample_shape = sample_shape
self.sample_size = np.prod(sample_shape) * 4 # 4 bytes para float32
# Abrindo o arquivo usando memory mapping para evitar carregar tudo na RAM
if not os.path.exists(filepath):
print(f"Criando arquivo dummy de {num_samples * self.sample_size / (1024**3):.2f} GB...")
fp = np.memmap(filepath, dtype='float32', mode='w+', shape=(num_samples, *sample_shape))
fp[:] = np.random.randn(num_samples, *sample_shape).astype('float32')
fp.flush()
del fp
self.data = np.memmap(filepath, dtype='float32', mode='r', shape=(num_samples, *sample_shape))
def __len__(self):
return self.num_samples
def __getitem__(self, idx):
# Retorna o tensor diretamente do mapeamento de memória
return torch.from_numpy(self.data[idx])
# Configurações do teste de estresse de I/O
FILE_PATH = "/mnt/flash_storage/large_dataset.bin"
NUM_SAMPLES = 100000
SAMPLE_SHAPE = (1024, 128) # Representando embeddings ou tokens processados
BATCH_SIZE = 512
NUM_WORKERS = 8 # Ajuste baseado no número de cores de CPU disponíveis
if __name__ == "__main__":
# Certifique-se de que o diretório existe antes de rodar
os.makedirs(os.path.dirname(FILE_PATH), exist_ok=True)
dataset = LargeScaleDataset(FILE_PATH, NUM_SAMPLES, SAMPLE_SHAPE)
dataloader = DataLoader(
dataset,
batch_size=BATCH_SIZE,
shuffle=True,
num_workers=NUM_WORKERS,
pin_memory=True # Transfere dados para a memória da GPU de forma assíncrona
)
print("Iniciando benchmark de leitura...")
start_time = time.time()
total_bytes = 0
for i, batch in enumerate(dataloader):
# Simulando o envio para a GPU e uma operação rápida
if torch.cuda.is_available():
batch = batch.cuda(non_blocking=True)
total_bytes += batch.nelement() * batch.element_size()
if i % 50 == 0 and i > 0:
elapsed = time.time() - start_time
throughput = total_bytes / (1024**2) / elapsed # MB/s
print(f"Batch {i}/{len(dataloader)} | Throughput: {throughput:.2f} MB/s")
total_time = time.time() - start_time
final_throughput = total_bytes / (1024**3) / total_time # GB/s
print(f"Benchmark concluído em {total_time:.2f} segundos.")
print(f"Throughput médio final: {final_throughput:.2f} GB/s")
Este script demonstra como técnicas simples, como o uso de np.memmap para evitar a sobrecarga de leitura de arquivos individuais e a ativação de pin_memory=True no PyTorch, permitem que o pipeline de dados acompanhe a velocidade de um storage flash de alta performance, como o implementado na Noruega.
Soberania de Dados, Open-Source e o Futuro da IA na Europa
A decisão da Noruega de investir pesadamente em infraestrutura própria para o treinamento de LLMs reflete uma tendência global crucial: a busca pela soberania digital. Depender exclusivamente de APIs de terceiros (como OpenAI ou Anthropic) expõe governos e empresas europeias a riscos regulatórios, de privacidade e de segurança de dados.
Ao construir clusters locais equipados com petabytes de armazenamento rápido, a Noruega capacita seus pesquisadores a treinar modelos de linguagem abertos (open-source) focados em suas próprias variantes linguísticas (Bokmål e Nynorsk) e em dados governamentais sensíveis que jamais poderiam ser enviados para servidores estrangeiros.
Para desenvolvedores focados em criar soluções inovadoras, essa descentralização da infraestrutura de IA abre um leque gigantesco de oportunidades. Se você deseja explorar como automatizar o provisionamento dessas infraestruturas ou criar microsserviços que gerenciam pipelines de dados complexos, não deixe de conferir nossa seção dedicada a Automações e Micro-SaaS, onde discutimos arquiteturas modernas de software e monetização de ferramentas técnicas.
A Polêmica Geopolítica do Hardware
Não podemos ignorar o elefante na sala: a escolha da Huawei. Em meio a sanções dos EUA e pressões políticas para que países europeus evitem fornecedores chineses em suas redes de telecomunicações (como 5G), a aquisição de hardware de armazenamento para pesquisa científica mostra que, no nível técnico, as decisões muitas vezes priorizam a relação custo-benefício, densidade tecnológica e disponibilidade de entrega.
Enquanto as restrições de exportação de GPUs da NVIDIA para certas regiões continuam a moldar o mercado de hardware, o setor de armazenamento de alta performance permanece altamente competitivo, com players asiáticos oferecendo soluções extremamente robustas que desafiam o domínio das gigantes ocidentais.
Conclusão e Referências
O caso dos 2 petabytes de armazenamento flash da Noruega para treinamento de LLMs é um lembrete claro de que a revolução da inteligência artificial não é feita apenas de algoritmos sofisticados, mas também de engenharia de sistemas pesada. Otimizar a latência, garantir taxas de transferência massivas para checkpointing e evitar o desperdício de ciclos de GPU são os verdadeiros desafios dos engenheiros de plataforma modernos.
À medida que os modelos continuam a crescer, a simbiose entre software open-source de treinamento (como DeepSpeed e Megatron-LM) e hardware de armazenamento ultra-rápido se tornará ainda mais estreita. Compreender essas dinâmicas é o que diferencia um desenvolvedor comum de um arquiteto de sistemas preparado para a era da IA em escala de petabytes.
As informações originais sobre a infraestrutura norueguesa e os detalhes técnicos do projeto foram detalhadas no Artigo de Origem.
