After studying this material, you should be able to:
Before understanding the solution, you need to understand the problem.
Training large language models requires enormous compute resources, which means:
Key insight: The bigger the model, the more parameters it has, and the more computation every single input requires.
A standard dense model activates all parameters for every input token.
A Mixture-of-Experts (MoE) model works differently:
Input Token → Router → Selects a few "Experts" → Only those experts compute
| Term | Definition |
|---|---|
| Token | A small unit of text a language model processes |
| Expert | A specialized sub-network (component) within the model |
| Router | A mechanism that decides which experts handle each token |
| Active parameters | Parameters actually used for a given token |
| Total parameters | All parameters stored across the full model |
Pool grew from 8 → 128 experts Still only 4 experts selected per token Active parameters stayed fixed at ~3.2 billion Total capacity grew from 4.6B → 47B parameters Training throughput dropped by less than 5%
Why this matters: You get a much larger, more capable model without proportionally increasing computation per token.
MoE sounds perfect, but it introduces new challenges:
Even though only a few experts are used per token, the entire model must still be stored across GPU memory.
Routing tokens to the right experts across a GPU cluster creates coordination costs:
GPU 1 has Expert A
GPU 7 has Expert B
Token needs both → Data must travel between GPUs → Latency
Deciding which expert handles which token must happen fast and accurately, or the efficiency gains disappear.
Core tension: As MoEs grow larger, communication and coordination costs can erase the computational advantage of sparse activation.
OLMo-Core 3 uses three distribution strategies to split the model across hardware:
GPU 1: Experts 1–32
GPU 2: Experts 33–64
GPU 3: Experts 65–96
GPU 4: Experts 97–128
Each GPU stores only a portion of the expert pool, not all of them.
A language model has many layers (successive transformation stages).
Layer 1–10 → GPU Group A
Layer 11–20 → GPU Group B
Layer 21–30 → GPU Group C
Each GPU group handles a slice of the model's depth, reducing per-GPU memory requirements.
During training, the optimizer stores extra data to calculate weight updates (momentum, variance, etc.).
Combined effect: No single GPU needs to hold the entire model, its layers, AND its training state simultaneously.
Beyond distribution, OLMo-Core 3 adds three efficiency optimizations:
Routed data is placed directly into expert input buffers, minimizing data rearrangement overhead.
Without: Token → Rearrange → Buffer → Expert
With: Token → Buffer → Expert ✓ (fewer steps)
Routing metadata (which expert handles which token) stays on the GPU.
GEMM = General Matrix Multiplication (the core math operation in neural networks)
Each expert handles a small batch → many small matrix operations.
Without: Small op → Small op → Small op → Small op (inefficient)
With: [Group all small ops] → One efficient large operation ✓
Numbers in computers can be stored with varying levels of precision:
| Format | Bits Used | Precision | Memory/Speed |
|---|---|---|---|
| BF16 | 16 bits | Higher | More memory, slower |
| MXFP8 | 8 bits | Lower | Less memory, faster |
Using MXFP8 where it helped most:
Fewer bits → Less data to move ✓
BUT
Fewer bits → Must convert formats → Conversion costs time ✗
Key principle: MXFP8 only helps when the savings from moving less data outweigh the cost of converting between formats.
This is an important systems-level change worth understanding:
For each mini-batch:
Gather weights from all GPUs → Compute → Reshard weights → Repeat
Problem: Constant weight gathering = expensive repeated communication
Experts stay resident on their assigned GPUs
Data is routed TO the experts (not the other way around)
On 8 NVIDIA B300 GPUs with a 47B parameter MoE:
| Implementation | Tokens/second/GPU |
|---|---|
| Old (FSDP) | 19,400 |
| New (DDP-based) | 52,000 |
| Improvement | ~2.7× faster |
The article documents important negative results — things that seemed logical but failed:
A routing balance score improved while actual workload distribution got worse.
Lesson: Metrics can be gamed or misleading. Always verify what you're actually measuring.
Logic: Experts see fewer tokens → reduce their learning rate to compensate Reality: This did not improve results in their tests.
Lesson: Intuitive adjustments don't always transfer across model families.
Same matrix dimensions, different input values → different computation times.
Lesson: Benchmarks must match both shape AND input values to be valid comparisons.
Overlapping communication and computation (running them simultaneously on separate GPU streams) sometimes slowed things down.
Lesson: System interactions are complex. More parallelism at the micro level can create bottlenecks elsewhere.
| Configuration | Details |
|---|---|
| Benchmark model | 1.2 trillion total parameters |
| Active per token | 58.36 billion parameters |
| Hardware | 512 NVIDIA B300 GPUs |
| Peak throughput | 858 TFLOP/s/GPU |
| Experimental scale | 2.38 trillion parameters (short test) |
PROBLEM: Large models are expensive to train
↓
SOLUTION: MoE — only activate part of the model per token
↓
NEW PROBLEM: Routing and communication create overhead at scale
↓
OLMO-CORE 3 RESPONSE:
├── Expert Parallelism → Distribute expert storage
├── Pipeline Parallelism → Distribute layer storage
├── Distributed Optimizer → Distribute training state
├── Rowwise EP → Minimize data rearrangement
├── GPU-Resident Routing → Eliminate CPU wait time
├── Grouped GEMM → Batch small computations
└── MXFP8 → Reduce data movement cost
↓
RESULT: Trillion-parameter MoE training with manageable efficiency loss