Long-Context Pretraining: Position Encoding, Efficiency, and Stability
Note: This is a review article (no first-hand experimental data), based on public literature and engineering practice.
Experiment Objective
"Pushing context from 4K to 128K" is not just enlarging max_seq_len — attention goes from O(n) to O(n²), position encoding extrapolation fails, and long-sequence training becomes unstable; the three problems are intertwined. Goal: dissect the engineering of long-context pretraining — position encoding and length extrapolation for long sequences (RoPE/ALiBi) → attention efficiency (FlashAttention/sparse attention/sequence parallelism) → training stability and data mix (long/short mixing, continued-training strategy). After reading you can answer: when moving from short to long context, what to change first, how to control cost, and how to keep stability.
Code Walkthrough
Part 1: Position encoding and length extrapolation (RoPE scaling)
# Core of RoPE "length extrapolation": interpolate/scale the rotation angles
# Linear Scaling: map positions beyond training length back into training range
def rope_linear_scale(pos, dim, base=10000, scale=8.0):
theta = pos / scale # divide by the scale factor
freqs = 1.0 / (base ** (torch.arange(0, dim, 2) / dim))
return torch.outer(theta, freqs) # position → rotation angle
# Better NTK/YaRN: per-dimension interpolation ("keep high freq, scale low freq")
# Engineering: RoPE base scaling + training covers the target length (8K → 128K two-stage)Key points:
- Three extrapolation postures: direct extrapolation (beyond training length, quality collapses), linear scaling (uniform squeeze, short-distance degradation), NTK/YaRN (high freqs unchanged, low freqs scaled — best in practice). "Position-encoding extrapolation" is the first engineering decision of long context.
- Two-stage training is mainstream: short context (8K) to convergence, then long context (128K) continued training — extrapolation + continuation together cost far less than from-scratch long-context training.
baseis a ready knob: raising RoPE's base (10000) stretches low frequencies (a manual NTK idea) — extrapolation without model changes.
Part 2: Attention efficiency — FlashAttention and sequence parallelism
# Attention is the O(n²) wall: 128K context = 16384² attention matrix per layer
# Tool 1: FlashAttention (kernel-level, no big matrix)
# Tool 2: Sequence Parallelism — shard the sequence dimension across cards
# Tool 3: sparse/block attention (local window + global tokens, Longformer-style)Key points:
- FlashAttention is "must-install," not optional: it drops attention's O(n²) memory to O(n) (blocked compute + recompute); 128K context is basically impossible without it — a model case of ch08/09's Triton thinking.
- Sequence parallelism is the scaling tool: when one card cannot hold the whole sequence's activations, shard the sequence dimension (with attention blocking) — the parallel answer to "memory doesn't fit," orthogonal to ch10's data/tensor parallelism.
- Sparse attention is a precision tradeoff: local window + global tokens bound each token's attention to the window — efficient but with expressiveness limits; fits "long-document retrieval" tasks, not general training first choice.
Principles
Long-context cost ledger
| Component | Short (4K) | Long (128K) |
|---|---|---|
| attention compute | ~4K² per layer | ~16M per layer (32×) |
| KV Cache (inference) | small | memory hog (ch12 KV ledger) |
| activation memory | manageable | needs recompute/sequence parallel |
| data cost | ordinary corpus | long-document corpus, scarce |
Core insight: long-context cost explodes in "attention squared" and "scarce long-document data," both need engineering — efficiency via FlashAttention/parallelism, data via "long-document sampling + long/short mixing."
Training stability and data mix
Mixed ratio (empirical):
short (<4K) 60% — stability and generalization
medium (4K-32K) 30% — bridge
long (>32K) 10% — long-context capabilityStability points: feeding only long samples makes loss fluctuate violently (large in-batch length variance, noisy gradients) — long/short mixing + length-bucketed sampling (similar lengths within a batch) is the key to stable training; loss-spike governance follows ch10's stability article. Long-context continuation also lowers LR (the short→long stage typically drops LR another 5-10×).
Results
(Estimated, not measured)
| Combination | Relative cost | Extrapolation/long-seq quality |
|---|---|---|
| direct extrapolation (no encoding fix) | low | poor (degrades sharply beyond training length) |
| RoPE base scaling | low | medium (short-distance degrades slightly) |
| NTK/YaRN + two-stage continuation | medium | good |
| from-scratch 128K + FlashAttention + seq parallel | high | best but most expensive |
Engineering Takeaways
- Do "two-stage + extrapolation" before from-scratch: short→long continuation is the cost-optimal path; use NTK/YaRN-class methods for extrapolation; from-scratch long context is the last choice.
- FlashAttention is a prerequisite: 128K context is not landable without it; confirm framework support first (linking ch10's framework article).
- Data mix decides stability: long/short mixing + length-bucketed sampling, long share starting at 10% and tuned up — never all-long documents at once.
- Continuation drops LR; watch loss spikes: short→long drops LR 5-10×, combined with ch10's spike detection and checkpoint restart, long-context training runs stably.
Next article preview: long context broke the sequence dimension; next, scheduling and resource orchestration — "GPU Job Orchestration on Kubernetes: Kueue/Volcano Queues and Quotas."