Long Context 的三条路:RoPE 外推 / YaRN / Ring Attention
Long Context 的三条路:RoPE 外推 / YaRN / Ring Attention
前情说明:技术深度 D1。《大模型原理面试冲刺》系列第 4 篇。第 1 篇讲 attention 时留了个尾巴——O(n²) 复杂度是长上下文的核心痛点。这篇专门展开。 128K/1M context 现在是大模型标配,面试常问"你怎么做长上下文外推"、"RoPE 为什么支持外推"、"YaRN 干了啥"。这一篇给你三种方案的完整对比。
长上下文到底难在哪
先分清两件事:
难点 1:位置编码不支持外推
模型训练时最大长度是 4K,你要让它推理 128K,位置 4001 到 128000 是模型从来没见过的位置。位置编码在这些位置的表现完全无法保证——模型可能直接输出乱码。这是模型能力层面的问题。
难点 2:Attention 的 O(n²) 复杂度
即使位置编码搞定了,attention 的显存和计算都是 O(n²)。128K 序列,attention 矩阵单头就是 16G float 元素,64GB HBM。这是工程可行性层面的问题。
长上下文的三条主流路子分别攻不同的点:
| 方案 | 攻击的是哪个难点 | 何时用 |
|---|---|---|
| RoPE 外推 (PI, NTK-aware) | 位置编码 | 短训练、推理时扩展 |
| YaRN | 位置编码(更优雅) | 需要 finetune 一小段就能到 128K |
| Ring Attention / FlashAttention | O(n²) 显存 | 训练/推理需要真跑 128K+ |
这三条路互补,不冲突——生产系统里通常同时用(YaRN 扩位置编码 + FlashAttention/Ring 处理显存)。
一、RoPE:为什么它天然支持外推的雏形
在讲外推之前先把 RoPE 本身讲清楚。
1.1 传统位置编码的问题
Transformer 原论文用的是正弦位置编码(sinusoidal PE)——一个固定的、和位置有关的向量,加到 token embedding 上。简单粗暴,但有两个问题:
- 加性 PE 会污染 token 语义——位置信息和词语义混在一起
- 不天然支持相对位置——你想知道两个 token 相差 5 个位置,模型得从两个绝对位置编码里"减"出来
Rotary Position Embedding(RoPE)(RoFormer, 2021)的 insight:位置信息应该以旋转的方式作用在 Q 和 K 上,而不是加到 embedding 上。
1.2 RoPE 的数学核心
给 d 维向量分成 d/2 个 2D 子空间,对第 m 个位置的 Q(或 K),在第 i 个 2D 子空间应用旋转矩阵:
R_θ_i(m) = [ cos(m·θ_i) -sin(m·θ_i) ]
[ sin(m·θ_i) cos(m·θ_i) ]
其中 θ_i = 10000^(-2i/d) # 不同频率
Q 和 K 分别乘上各自位置的旋转矩阵,然后正常做 dot product。数学上可以证明:
<R_m · q, R_n · k> = <q, R_{n-m} · k>
内积只依赖 m - n 的相对位置——这正是我们想要的相对位置编码,且不需要减法。
1.3 RoPE 为什么"看起来"支持外推
RoPE 的角度是位置 m 的线性函数:θ_i(m) = m · 10000^(-2i/d)。理论上 m 可以取任意值——你从 4K 外推到 128K,只是旋转角度变大了,公式还成立。
但实际会崩。因为:
- 高频 θ_i(i 小的维度)的旋转周期很短,比如 θ_0 = 1,位置 6.28 就转了一整圈
- 训练时 m ∈ [0, 4096],模型只见过某个"角度分布"
- 推理时 m ∈ [0, 128000],高频维度旋转了很多圈,落在训练时从未见过的角度组合上
- 模型对这些"陌生"的旋转组合表现完全不可控
所以朴素外推(直接把 max_len 从 4K 改成 128K 用)会显著掉点。这才有了后面的 PI、NTK、YaRN 等方案。
二、RoPE 外推方案:从 PI 到 YaRN
2.1 Position Interpolation (PI, 2023)
Meta 的 Position Interpolation 提出最朴素的思路:把新位置"压缩"回训练时见过的范围。
如果训练 max_len=4K,推理想到 32K,就把位置 m 除以 8,让 m 落回 [0, 4K]:
θ_i(m) = (m / s) · 10000^(-2i/d) # s = 32K/4K = 8
优点:改一行代码,微调 1000 步就能收敛到长上下文。 缺点:所有维度都均匀压缩,破坏高频细节——高频维度本来负责"细粒度位置差异"(区分 token m 和 m+1),压缩后模糊了。文本连续性会掉,尤其相邻 token 关系。
2.2 NTK-aware Scaling (2023)
社区(reddit user bloc97)发现 PI 的问题后提出 NTK-aware:只压缩低频维度,高频维度保持不变。
具体做法:把 base(10000)改成 base × s^(d/(d-2))。这样:
- 高频维度(i 小):θ 几乎不变,保留细节
- 低频维度(i 大):θ 显著缩小,实现"外推"
优点:不用 finetune,直接推理就能到 2-4 倍上下文,效果比 PI 好。 缺点:更长的外推(8x+)还是会崩;数学上是启发式的,没有理论保证。
2.3 YaRN (2023):目前最好的方案
YaRN 综合了 PI 和 NTK 的思路,做了三个改进:
改进 1:分段(NTK-by-parts)
把 d/2 个维度按频率分成三段:
- 高频段(几乎不压缩):保留细节
- 低频段(完全压缩,用 PI):外推
- 中频段(平滑过渡):避免边界跳变
这个"三段式压缩"比 NTK-aware 的连续压缩更贴合实际。
改进 2:Attention temperature scaling
外推之后 attention logits 的分布会变(因为你在更多位置上做 softmax)。YaRN 在 softmax 前对 logits 做一个温度缩放:
attn = softmax(QK^T / (√d_k · t))
其中 t = 0.1 · ln(s) + 1 # s = 缩放倍数
这一个 hack 让模型不需要 finetune 也能表现好。
改进 3:短 finetune 收尾
前两个技巧让 zero-shot 已经不错。再用长上下文数据 finetune 几百到几千步,效果几乎追平原生长上下文训练。
YaRN 的地位:Qwen、Llama、Mistral 的 128K 版本几乎都用 YaRN 或其变种。它是目前的事实标准。
2.4 三种方案对比
| 方案 | 是否需要 finetune | 最大扩展倍数 | 效果 |
|---|---|---|---|
| PI | 需要(1000+ 步) | 4-8x | 中 |
| NTK-aware | 不需要 | 2-4x | 中高 |
| YaRN | 不需要(可选短 finetune) | 8-32x | 高 |
面试标准答法:从 PI 到 NTK 到 YaRN 是一条递进的路——PI 的问题是均匀压缩破坏高频,NTK 解决了高频保留但外推有限,YaRN 用分段 + attention temperature + 可选 finetune 综合最优。
三、Ring Attention:把 O(n²) 显存拆开
位置编码搞定了,还有 O(n²) 显存的问题。FlashAttention 是单卡内的显存优化(IO-aware),Ring Attention 是跨卡的分布式扩展。
3.1 直觉:为什么可以拆
Attention 的核心是:
O = softmax(QK^T) V
关键 insight:softmax 是可以增量计算的(online softmax)。你不需要一次性看到所有 QK^T 值就能算 softmax,只要维护 running max 和 running sum。
FlashAttention 就用这个 trick 让 attention 在 SRAM 里 tile 计算不落 HBM。Ring Attention 把这个思路推到跨卡:
- 序列切成 N 份,分给 N 张卡
- 每张卡持有 Q、K、V 的一部分
- K/V 沿卡的环形拓扑循环传递——每转一圈,每张卡都见过所有的 K/V
- 每张卡本地维护 online softmax 的 running state
- 转完一圈,本地聚合就是最终 attention 输出
3.2 通信 / 计算重叠
Ring Attention 最漂亮的地方:通信和计算完全可以 overlap。
传输 K/V 的下一个 chunk 时,同时用当前 chunk 做本地 attention。只要通信时间 < 计算时间,你就能完全隐藏通信开销——理论上 N 张卡跑 N 倍长的序列,效率不掉。
3.3 Ring Attention 的现状
- Google Gemini 1M 上下文大概率用了 Ring Attention 或类似方案
- 开源实现:BlockAttention / LongLoRA
- 主流训练框架(DeepSpeed、Megatron、TransformerEngine)都有集成
面试锚点:Ring Attention 让长上下文训练可扩展——4K 上限的模型加卡就能训 128K/1M。位置编码用 YaRN 解决"模型知不知道这么远",Ring Attention 解决"显存装不装得下",两条路互补。
四、其他相关技术:值得知道但不用深挖
面试补刀问题可能涉及以下方案,快速扫一遍:
4.1 Sliding Window Attention(Mistral 用)
只让每个 token attend 前 W 个 token(比如 W=4096),复杂度从 O(n²) 降到 O(n·W)。牺牲全局信息换效率。Mistral-7B 用了 W=4096 的滑窗,靠层数堆叠间接扩展感受野。
4.2 Linear Attention 系列(Mamba、RWKV)
用线性递归替代 attention,复杂度 O(n)。代表:Mamba (state space model)、RWKV。目前小模型上表现不错,大模型上还没完全打过 Transformer。是"后 Transformer"研究的主要方向之一。
4.3 Retrieval / RAG
不是真"长上下文",而是分块 + 检索——把长文档切块索引,query 时只把相关块塞进 context。工业界的现实解——因为哪怕你能塞 1M context,成本和延迟都受不了。
4.4 Prefix Cache / Radix Attention
不是位置编码或架构改动,是推理侧的 cache 复用——多个请求共享 prompt 前缀时,KV cache 只算一次。SGLang 的 RadixAttention 是代表。长上下文场景下这个优化收益极大(因为长 prompt 常重复)。
五、面试高频问题
Q1: RoPE 为什么支持外推?为什么外推又会崩?
A: RoPE 用旋转矩阵编码位置,公式是位置的线性函数,理论上支持任意位置。但高频维度的旋转周期很短(θ_0=1 时位置 6.28 就转一整圈),推理时更长的位置落在训练时没见过的"角度组合"上,模型表现不可控。所以朴素外推会掉点,需要 PI/NTK/YaRN 这样的方案。
Q2: PI 和 NTK-aware 的区别?
A: PI 是所有维度均匀压缩(除以缩放因子 s),简单但破坏高频细节。NTK-aware 是只压缩低频维度,高频保持不变(改 base 参数),保留细节但外推倍数受限。NTK 是启发式的改进,YaRN 是它俩的综合升级。
Q3: YaRN 相比 NTK 好在哪?
A: 三点:(1) 频率分段——高频不动、低频用 PI 压、中频平滑过渡;(2) attention temperature scaling——外推后 softmax 分布变化用温度补偿;(3) 短 finetune 收尾几乎能追平原生长上下文训练。YaRN 是目前 Qwen/Llama/Mistral 128K 版本的事实标准。
Q4: 长上下文的核心难点是什么?
A: 两个正交的难点:位置编码支不支持外推(模型侧,用 YaRN 解决)+ O(n²) 显存能不能装下(工程侧,用 FlashAttention/Ring Attention 解决)。两者互补,生产系统里通常同时用。
Q5: Ring Attention 的核心 insight?
A: Softmax 可以增量计算(online softmax),所以 attention 可以切成 chunk 分布式计算。序列切成 N 份分给 N 张卡,K/V 沿环形拓扑循环传递,每张卡维护 running max/sum,转一圈就得到完整 attention。通信和计算可以完全 overlap,理论上 N 张卡跑 N 倍长序列效率不掉。
Q6: Sliding Window Attention 有什么问题?
A: 每个 token 只 attend 前 W 个,全局信息只能靠层数堆叠间接传递(第 L 层的感受野是 L·W)。牺牲全局能力换效率,对长距离依赖的任务(比如全文摘要)会掉点。Mistral-7B 用了 W=4096 是个 sweet spot,但 128K 上下文靠单纯滑窗会有问题。
Q7(进阶): 128K 上下文,工业界现在的完整方案是什么?
A: 通常是四件事的组合:(1) YaRN 扩位置编码从 4K 到 128K;(2) FlashAttention v3 优化单卡 attention IO;(3) Ring Attention 或 Sequence Parallelism 训练时分布式扩展;(4) Radix/Prefix Cache 推理时 cache 复用。同时数据侧要用长上下文数据 finetune 让模型"学会用"长上下文,光有能力容量不够。
Q8(进阶): 如果 Linear Attention(Mamba/RWKV)能替代 Transformer 吗?
A: 目前不能完全替代。优势:复杂度 O(n),长上下文成本低;推理时状态压缩到固定大小,特别适合流式。劣势:在大规模模型上 quality 还是打不过 Transformer;in-context learning 能力弱;工程生态不成熟。目前是补充方案——2026 年已经有很多混合架构(Mamba-Transformer hybrid),但主流仍是 Transformer + YaRN + FlashAttention 组合。
一句话记住这一篇
长上下文有两个正交难点:位置编码能不能外推(模型能力),显存能不能装下(工程可行)。YaRN 用分段压缩 + attention 温度校准 + 短 finetune 解决前者;Ring Attention 用 online softmax + 环形通信解决后者。两条路互补,加上 RAG/Prefix Cache 就是工业界 128K/1M 上下文的完整栈。
系列下一篇:《LLM Eval:为什么 benchmark 都不太靠谱》——MMLU 污染、Chatbot Arena 偏见、面试可以聊的评估陷阱。

Written by
Zoe
AI Infra Engineer · LLM Serving · GPU/RDMA · 造工具的偏执狂