
把 K、V 分块绕环传递,只完成了数据移动。每块分数各自 softmax 后直接求平均,并不等于完整注意力。为了让分块结果对应同一个归一化分母,需要同时合并最大值、指数和与加权和。
Ring Attention 论文讨论分块注意力与通信重叠。这里先处理容易被通信示意图掩盖的数学条件。10 月 23 日的 GLM-5.3 并行分析也区分了查询与 KV 的分片,以及合并部分结果的成本。不同注意力结构不能只换一个并行名称。
合并时为什么要重新缩放
对两个块,分别记最大值 m、指数和 l、指数加权值和 o。合并最大值取较大者 M,再把各块的 l 与 o 乘上 exp(m-M) 后相加。最终输出为合并 o 除以合并 l。这样避免直接计算很大的指数。

展示单查询的数学合并,不是完整 Ring Attention 通信、反向传播或掩码实现。
import math
def stats(scores, values):
m = max(scores)
w = [math.exp(s-m) for s in scores]
return m, sum(w), sum(a*b for a,b in zip(w,values))
a = stats([1.,2.],[10.,20.])
b = stats([3.,4.],[30.,40.])
m = max(a[0],b[0])
l = sum(x[1]*math.exp(x[0]-m) for x in (a,b))
o = sum(x[2]*math.exp(x[0]-m) for x in (a,b))
full = stats([1.,2.,3.,4.],[10.,20.,30.,40.])
assert math.isclose(o/l, full[2]/full[1], rel_tol=1e-12)
print(f"merged={o/l:.6f}")
运行输出:
merged=34.926527
代码比较了两块合并与一次性 softmax 的标量结果。它没有 batch、head、矩阵乘法或通信,故意用极小输入让归一化关系可见。断言通过只能支持这个数学例子。
真正的分布式实现还缺什么
因果掩码要与全局 token 位置一致,不能对每个本地块从零计数。反向传播需要正确处理梯度与通信生命周期;异步发送的缓冲在完成前不可复用。环的邻接关系还应与实际互连拓扑核对。
容量估算则要给出层数、KV 头数、维度、精度与长度。不能仅凭“64K”断言某张卡必然放不下。本文未运行 GPU、分布式训练或 Ring Attention 内核;下一步应先做单机小张量与参考实现的前反向比较,再进行多节点性能测试。
本文剖析Ring Attention中分块注意力结果归一化合并的关键数学步骤,指出仅对各块独立softmax后取平均会导致错误,必须同步合并局部最大值、指数和与加权和以实现等价全局Softmax。强调在线Softmax的重缩放机制对数值稳定性和正确性的必要性,并指出分布式实现还需解决因果掩码全局位置对齐、反向传播梯度通信协同及环拓扑适配等问题。

3918

被折叠的 条评论
为什么被折叠?



