SSAMU GPU

NVIDIA H800 PCIe 80 GB · 训练后端实测 · 2026-08-31

SAMU 与 RG-LRU 的 H800 训练性能对比

我们先完善 RG-LRU 的 GPU 实现,再在相同测试条件下比较两种递归结构。SAMU 在已测主要训练形状中用时更短、实际分配显存更少,保存分块入口状态的临时数组也更小。

完整递归混合器:前向+反向快 24.6%–40.2%四个预先选定的主要训练形状
单个完整循环块:前向+反向快 5.8%–7.6%加入归一化、投影、卷积和多层感知机之后
单循环块 AdamW 更新快 3.8%–6.5%不是 12/24 层完整语言模型的优化器更新

01 · 实测概览

主要结果

延迟

主要递归混合器区域获胜

四个主要形状的前向+反向分别快 24.6%、27.6%、37.3%、40.2%。加入完整循环块的公共层后,收益缩小但仍为 5.8%–7.6%。

显存

实际分配显存与临时工作区更低

主要递归混合器形状的峰值实际分配显存低 22.0%–23.5%;保存分块等价变换和入口状态的临时工作区约为 RG-LRU 的一半。

扩展

长序列与宽状态区域更清楚

固定 D=1024 时,L=32768、65536、131072 的前向+反向用时分别缩短 37.0%、27.2%、25.7%;固定 L=32768 时,D=1024–2560 的用时缩短 37.3%–40.8%。

参数

动态控制不随状态宽度展开

SAMU 每个位置只有共享相位和共享保持率两个动态控制标量;RG-LRU 每个位置仍需为全部 D 个通道分别生成写入门和保持门。

02 · 符号与测量范围

图表中的 B、L、D 和前向+反向分别指什么

这些符号同时决定并行度、工作量和 GPU 路径。不同形状不能只按序列长度比较,也不能把递归混合器时间当成完整模型时间。

B

批量大小

一次同时处理的独立序列条数。B=4 表示四条序列并行,通常能提供更多 GPU 并行工作;B=1 更容易暴露长序列前缀传播的成本。

L

序列长度

每条序列包含的位置数。L=32768 表示每条序列有 32768 个递归时间步。页面中的 32K、65K、131K 分别是 32768、65536、131072。

D

实数状态宽度

用于公平匹配状态容量。RG-LRU 使用 \(D\) 个实数状态通道;SAMU 使用 \(M=D/2\) 个复数模态,每个复数模态由两个实数分量组成,因此双方都保留 \(D\) 个实数状态量。

K

每个分块的时间步数

K=32 表示一个 GPU 程序实例先在寄存器中顺序处理 32 个时间步,再把该分块压缩成一个仿射摘要。K 越大,分块数越少,但寄存器压力也越高。

前向

从输入计算全部输出

包含控制量或门值准备、递归状态更新和可见输出。页面计时排除首次编译,但包含该路径正常执行所需的 CUDA 内核。

反向

从输出梯度计算全部相关梯度

使用稠密输出梯度,计算输入梯度、初始状态梯度和全部参数梯度。它不是只传播状态梯度,也不是只测一个反向扫描内核。

前向+反向

训练核心算子的合计时间

把同一次完整前向和完整反向的 GPU 时间相加。它不包含 AdamW 参数更新;加入 AdamW 后的数字在单循环块优化器更新表中单独报告。

递归混合器

本页最主要的替换对象

包括 RG-LRU 的门或 SAMU 的控制器、状态转移、递归写入、输出,以及相应反向。它不包括循环块外层的归一化、深度卷积、公共投影和多层感知机。

完整循环块

更接近模型训练的算子范围

在递归混合器外加入公共归一化、输入投影、深度卷积、输出投影和门控多层感知机。当前只测一个 RecurrentBlock,不是多层语言模型。

中位数 [最小,最大]

表格中的计时写法

每一行保留两轮、每轮五次,共十个计时样本。中位数是主值,方括号给出十个样本的最小值和最大值,不挑单次最快结果。

BF16 / FP32

张量存储与累加精度

BF16 是 16 位脑浮点格式,用于输入和输出以降低带宽与存储开销;FP32 是 32 位单精度格式,用于递归状态、关键归约和控制器导数累加,以控制长链误差。

AdamW

参数更新步骤

一种带解耦权重衰减的优化器。本页的单循环块 AdamW 更新包含该循环块的前向、反向和一次参数更新。

延迟

完成一次被测工作的 GPU 时间

单位为毫秒。比较百分比按 \((t_{\mathrm{RG}}-t_{\mathrm{SAMU}})/t_{\mathrm{RG}}\) 计算;正数表示 SAMU 用时更少,表格同时保留双方绝对时间。

实际分配 / 保留显存

两种不同的显存口径

实际分配显存是活动张量真正占用的峰值;保留显存还包括 CUDA 缓存分配器暂存、可供后续复用的显存。两者必须分开报告。

临时工作区 / 内核启动

中间数组与程序调用次数

临时工作区只统计每个分块的等价变换和入口状态等中间量;内核启动数是一次前向和反向触发的 CUDA 程序次数。启动更少通常有利,但不能单独决定总延迟。

共享特殊函数结果

每个位置只计算一次 \(E_t=e^{c_t}\)、\(C_t=\cos d_t\)、\(S_t=\sin d_t\),该位置的全部复数模态随后复用这三个值。不同位置仍使用各自的控制量,不同样本也保留各自的状态。

以 64 个分块为一组

把相邻 64 个分块的等价变换放进一个执行组,按后文的 \(L_c\)、\(U_g\)、\(O_g\)、\(Q_c\) 公式求出每个分块的入口状态。被组合的是执行时的等价变换,不是控制量、模态或模型参数。

为什么不逐分块传递入口状态

长序列含有很多分块,逐个传递会限制并行度。按 \(Q_c=L_c\circ O_g\) 分开计算组内组合与更早分组组合,只需与分块数成正比的组合次数,并允许不同执行组同时工作。

03 · H800 正式实测

先看绝对时间,再看相对百分比

输入和输出为 BF16,递归状态常驻 FP32;首次编译排除;第一轮先测 RG-LRU 再测 SAMU,第二轮交换先后顺序;每轮各取五个计时样本。图表显示十个样本的中位数与最小—最大区间。

图 1a

完整递归混合器:前向+反向

10 个样本
a 测量范围包含门或控制器准备、递归计算、稠密输出梯度、输入梯度和全部参数梯度。点为中位数,横线为最小值至最大值。
图 1b

D=1024 时的长序列延迟

L=32768–131072
b \(L=65536\) 和 \(L=131072\) 的前向分块入口依次传播,反向则每 64 个分块为一组并行求入口梯度;不采用未通过正确性门槛的前向并行数字。
图 1c

L=32768 时的宽度扩展

前向+反向优势
c D=1024–2560 时速度优势保持在约 37%–41%,支持宽状态优势区域,但不表示百分比随宽度严格单调增加。

完整递归混合器明细

正在读取递归混合器原始数据……

固定 D=1024 的长度扩展

正在读取长度扩展数据……

固定 L=32768 的宽度扩展

正在读取宽度扩展数据……

单个完整循环块:前向+反向

包含归一化、两路输入投影、逐通道卷积、递归混合器、连接与输出、第二次归一化、门控多层感知机,以及输入和参数反向。

正在读取循环块数据……

同一个循环块的一次 AdamW 更新

包含循环块前向、输入与参数反向、融合 AdamW 参数更新;优化器状态在计时前完成初始化。

正在读取优化器数据……

04 · RG-LRU 在 GPU 上如何运行

RG-LRU 的 GPU 实现

RG-LRU 的方程和重置语义按固定版本的 RecurrentGemma 核对;H800 上运行的 Triton/CUDA 内核由本项目实现。

\[ g^x_t=\operatorname{sigmoid}(\ell^x_t),\qquad g^a_t=\operatorname{sigmoid}(\ell^a_t) \]
\[ a_t=\exp\!\left[-8g^a_t\operatorname{softplus}(\alpha)\right],\qquad b_t=x_t g^x_t\sqrt{\max(1-a_t^2,0)} \]
\[ h_t=a_t h_{t-1}+b_t \]
\[ T_t(h)=a_t h+b_t,\qquad (a_2,b_2)\circ(a_1,b_1) =(a_2a_1,\;a_2b_1+b_2) \]
\[ S_c=T_e\circ\cdots\circ T_s,\qquad Q_c=L_c\circ O_g \]

\(\ell^x\)、\(\ell^a\) 是两张分块对角投影产生的写入门和保持门原始值;\(\alpha\) 是每个状态通道的静态保持参数。分块 \(c=[s,e]\) 的等价变换是 \(S_c\)。若第 \(g\) 组覆盖分块 \(g_0\) 到 \(g_1\),则 \(L_c=S_{c-1}\circ\cdots\circ S_{g_0}\),\(U_g=S_{g_1}\circ\cdots\circ S_{g_0}\),\(O_g=U_{g-1}\circ\cdots\circ U_0\),最终 \(Q_c=L_c\circ O_g\) 给出分块 \(c\) 之前的完整变换;空组合取恒等变换。遇到打包序列的新段起点时,\(a_t\) 置零,写入归一化系数置一,因此旧段状态不会泄漏到新段。

前向

经过充分优化的 RG-LRU 前向

1

产生逐通道门值

两张规范分块对角投影为每个位置、每个状态通道产生写入门和保持门原始值,形状均为 \([B,L,D]\)。

2

融合逐点准备

Triton 内核内部完成 S 型门函数、软正值函数、指数保持系数、平方根写入归一化和重置处理,不额外物化多张逐点中间张量。

3

把连续 16 步合成 \(S_c\)

程序实例对分块 \(c=[s,e]\) 严格按 \(T_e\circ\cdots\circ T_s\) 组合,因此 \(S_c\) 与逐位置执行 16 次递推完全等价。

4

按 \(Q_c=L_c\circ O_g\) 求分块入口

每 32 个分块为一组,分别计算上文定义的 \(L_c\)、\(U_g\)、\(O_g\) 和 \(Q_c\)。组合次数随分块数线性增长。

5

从 \(Q_c(h_0)\) 逐步恢复输出

用正确入口状态重新执行分块中的 16 个位置;最后一个不完整分块、非零初始状态和分块内多次重置都保持规范语义。

6

输出给公共循环块

递归输出继续经过双方相同的连接投影、残差、归一化和门控多层感知机,因此完整循环块表能反映公共计算对优势的稀释。

反向

RG-LRU 反向沿逆时间使用同一个仿射组合公式

1

把连续 16 步伴随递推合成一个变换

从输出梯度构造逆时间的实数仿射变换,并把重置位置编码为 \(a_t=0\)。

2

沿逆时间按同一组合公式求入口梯度

仍按 \((a_2,b_2)\circ(a_1,b_1)\) 组合,只把时间次序反转,从而并行得到每个反向分块的入口梯度。

3

从入口梯度逐步恢复各项导数

重新计算门值、保持系数和平方根写入因子,得到输入、两组门原始值和状态的梯度。

4

求和得到静态参数梯度

每个批次和分块先产生 \(\alpha\) 的局部梯度,随后沿批次和分块维求和到 \([D]\)。

5

保持完整规范语义

同时返回非零初始状态梯度,处理最后一个不完整分块,并对平方根导数使用与规范参考一致的数值截断。

RG-LRU 的 GPU 适配清单

适配解决的问题当前实现
门准备与递推融合避免 S 型门函数、指数、平方根写入因子和递归写入之间产生多张中间张量及额外内核门投影完成后,由同一可微 Triton 后端直接消费两个门原始值、输入和静态参数 \(\alpha\)
把连续 16 步合成支持重置的等价变换普通无重置扫描不能处理打包序列、分块内多次重置或非零初始状态重置位置编码为零保持系数;支持任意重置、最后不完整分块、初始状态与初始状态梯度
按 \(Q_c=L_c\circ O_g\) 并行求入口状态逐分块串行传播并行度低,多轮全局扫描又会增加组合次数和内核启动每 32 个分块为一组,分别计算 \(L_c\)、\(U_g\)、\(O_g\) 和 \(Q_c\)
每个程序处理的时间步数和通道数按形状选择一次处理更多时间步会减少分块数,但增加寄存器压力;通道数太小或太大都会降低占用最终主路径每个程序处理 16 步;短形状每次处理 128 个通道,中等及 \(D=1024\) 长形状为 256 个,\(D=2048\) 长形状为 128 个
反向重算与局部梯度归约保存全部逐点保持系数和写入因子会增加训练显存反向重放时重算门值和逐点项,分块先形成 \(\alpha\) 的局部梯度,再归约到 \([D]\)
规范参考与开源实现分开使用RecurrentGemma 和 Fattori 实现支持的重置、初始状态与门结构不同RecurrentGemma 用于核对方程和重置语义;Fattori 只比较双方共同支持的零初始状态、无重置路径

RG-LRU 的 GPU 优点

状态和仿射系数都是实数,单步只需实数乘加;门计算与分块组合经过融合后,短序列和窄状态的固定开销较低。

RG-LRU 的结构性成本

两个动态门都随位置和 \(D\) 个通道变化,门准备、保存和反向天然具有 \([B,L,D]\) 规模。SAMU 只有两个随位置变化的共享控制量,这是长序列和宽状态时逐渐显现优势的根源。

与 Fattori 开源实现的受限对比

正在读取公开实现复现数据……

测量条件:固定提交的 hawk-pytorch 不支持当前 RG-LRU 路径中的任意重置、重置位置写入归一化和非零初始状态,因此这里只比较零初始状态、无重置的完整前向与反向。

05 · SAMU 在 GPU 上如何运行

数学保持不变,执行过程按共享控制重排

下面先完整写出正式 SAMU 的控制公式,再说明 GPU 如何执行这些公式。方向向量、幅度、\(1/\sqrt{M}\) 缩放和有界径向函数均未改变;两个幅度初始化为零,因此初始时精确退化到 RTU。

\[ \widetilde{x}_t=\begin{bmatrix}x^{\mathrm{sel}}_t\\1\end{bmatrix},\qquad \widehat{w}_{\phi}=\frac{w_{\phi}}{\lVert w_{\phi}\rVert_2},\qquad \widehat{w}_{r}=\frac{w_{r}}{\lVert w_{r}\rVert_2} \]
\[ p_t=\tanh\!\left(\widetilde{x}_t^{\mathsf T}\widehat{w}_{\phi}\right),\qquad r_t=\tanh\!\left(\widetilde{x}_t^{\mathsf T}\widehat{w}_{r}\right),\qquad q(r_t)=\frac{r_t}{1+r_t^2} \]
\[ d_t=\frac{\tanh(a_{\phi})}{\sqrt{M}}\,p_t,\qquad c_t=\frac{\tanh(a_r)}{\sqrt{M}}\,q(r_t),\qquad a_{\phi}=a_r=0\quad\text{(初始化)} \]
\[ E_t=e^{c_t},\qquad C_t=\cos d_t,\qquad S_t=\sin d_t \]
\[ \lambda_{t,m}=e^{-\nu_m E_t} \Big[(\cos\theta_m C_t-\sin\theta_m S_t) +i(\sin\theta_m C_t+\cos\theta_m S_t)\Big] \]
\[ z_{t,m}=\lambda_{t,m}z_{t-1,m}+b_{t,m},\qquad T_t(h)=\lambda_t h+b_t \]
\[ (\lambda_2,b_2)\circ(\lambda_1,b_1) =(\lambda_2\lambda_1,\;\lambda_2 b_1+b_2) \]
控制量怎样得到

先把选择输入 \(x_t^{\mathrm{sel}}\) 末尾补一个常数 1,再分别与两个单位长度方向 \(\widehat w_\phi,\widehat w_r\) 做内积。双曲正切得到 \(p_t,r_t\),随后严格按上式得到共享相位改变量 \(d_t\) 和共享保持改变量 \(c_t\)。GPU 实现只合并这些内积和逐点函数,不改变控制器公式。

时间步怎样合并

相邻两步严格使用 \(T_2\circ T_1\),也就是先执行 \(T_1\),再执行 \(T_2\)。乘法次序不能交换。对一个包含 \(K\) 个位置的分块 \(c=[s,e]\),程序按 \(T_e\circ\cdots\circ T_s\) 得到该分块的一个等价变换。

长序列怎样得到每个分块的入口状态

记第 \(c\) 个分块的等价变换为 \(S_c\),第 \(g\) 组从 \(g_0\) 到 \(g_1\)。先算组内早于分块 \(c\) 的组合 \(L_c=S_{c-1}\circ\cdots\circ S_{g_0}\) 和整组组合 \(U_g=S_{g_1}\circ\cdots\circ S_{g_0}\),再算更早各组的组合 \(O_g=U_{g-1}\circ\cdots\circ U_0\),最后用 \(Q_c=L_c\circ O_g\) 得到分块入口前的完整变换。以 64 个分块为一组只是并行计算这些公式。

前向

SAMU 如何从输入得到全部递归输出

1

逐项计算正式控制公式

先计算 \(\widetilde{x}_t^{\mathsf T}\widehat w_\phi\) 和 \(\widetilde{x}_t^{\mathsf T}\widehat w_r\),再按上式得到 \(p_t,r_t,d_t,c_t\)。投影内积和导数累加使用 FP32。

2

每个位置只算一次特殊函数

计算 \(E_t\)、\(C_t\)、\(S_t\)。同一位置的全部 \(M\) 个复数模态复用它们,不为每个模态重复计算指数、正弦和余弦。

3

在寄存器中生成模态转移

把共享控制与静态频谱 \(\nu_m\)、\(\theta_m\) 合成 \(\lambda_{t,m}\)。不把两个形状为 \([B,L,M]\) 的实部、虚部转移张量写入显存。

4

把连续 32 步合成一个等价变换

每个程序实例严格按 \(T_e\circ\cdots\circ T_s\) 顺序处理 32 个位置,得到一个与逐步执行完全相同的复数仿射变换。

5

按 \(Q_c=L_c\circ O_g\) 求分块入口

中长序列每 64 个分块为一组,分别计算上文定义的 \(L_c\)、\(O_g\) 和 \(Q_c\),从而并行得到各分块的正确入口状态。

6

局部重放并生成输出

从分块入口状态重新处理 32 个位置;写入归一化和可见输出融合在重放内,减少中间张量和额外读写。

\[ \overline{z}_{t-1,m}\;{+}{=}\; \overline{\lambda_{t,m}}\,\overline{z}_{t,m},\qquad \overline{b}_{t,m}=\overline{z}_{t,m} \]
\[ \overline{c}_t=\sum_{m=1}^{M}\overline{c}_{t,m},\qquad \overline{d}_t=\sum_{m=1}^{M}\overline{d}_{t,m} \]
\[ \overline{p}_t=\overline{d}_t\frac{\tanh(a_\phi)}{\sqrt M},\qquad \overline{r}_t=\overline{c}_t\frac{\tanh(a_r)}{\sqrt M} \frac{1-r_t^2}{(1+r_t^2)^2} \]
反向

反向不是照搬前向,而是使用共轭转移

1

按 \(\overline\lambda_{t,m}\) 逆序合并 32 步

状态梯度严格按上式通过共轭转移传播;每个程序实例从后向前把连续 32 步合成一个等价变换。

2

沿逆时间求每个分块的入口梯度

仍使用 \((\lambda_2,b_2)\circ(\lambda_1,b_1)\) 的组合规则和 \(Q_c=L_c\circ O_g\),但分块按逆时间排列,左右次序不能交换。

3

从入口梯度逐步恢复模态导数

在程序实例内部重新生成 \(\lambda_{t,m}\),计算状态、写入、\(\nu_m\)、\(\theta_m\) 的梯度,不保存完整模态转移历史。

4

按模态求和得到 \(\overline c_t,\overline d_t\)

每个模态分片只写出两个局部和;第二次求和用 FP32 把 \([B,L,N_{\mathrm{tiles}},2]\) 变为 \([B,L,2]\),不产生 \([B,L,M]\) 控制梯度张量。

5

按控制公式的链式法则继续反向

利用前向保存的 \(p_t,r_t\),按上式计算两个方向向量、两个有符号幅度和输入的梯度;方向归一化的导数也保持不变。

省特殊函数

动态控制的成本按位置计算

RG-LRU 的保持门随位置和通道变化;SAMU 的相位与保持控制每个位置各一个,再与静态模态频谱组合。

省显存流量

转移系数即时生成

不写出 \([B,L,M]\) 的复数转移实部和虚部,减少显存往返;代价是重新执行分块内部时间步时需要再次计算。

省入口状态工作区

每个程序处理 32 步,让分块数减半

相对 RG-LRU 每个程序处理 16 步,SAMU 每个程序处理 32 步,因此需要保存的分块等价变换和入口状态更少。

省控制器梯度中间量

每个位置最终只有两个动态梯度

跨模态仍要做计算,但临时结果压缩为两个共享标量的分片归约,而不是完整 \([B,L,M]\) 张量。

图 2

RG-LRU 的 GPU 骨架如何转化为 SAMU 专用优化

设计对应关系
RG-LRU 优化骨架与 SAMU 专用优化的对应关系 左列给出 RG-LRU 已验证的执行公式,中列给出 SAMU 对应的数学性质,右列说明由此采取的 GPU 执行动作。 从 RG-LRU 验证并保留的骨架SAMU 的数学结构由此产生的 GPU 适配 RG-LRU 每步都是 hₜ=aₜhₜ₋₁+bₜ相邻时间步按 T₂∘T₁ 精确合并 转移变为复数,但仍满足结合律组合顺序不可交换 每个程序处理 32 步,每 64 个分块为一组并行求出各分块的正确入口状态 从分块入口重新执行内部时间步反向需要时再次计算逐点项 动态部分只有每个位置两个标量其余为静态模态频谱 每位置只算一次 exp(c)、cos(d)、sin(d)各模态随用随算 λ,不写完整转移张量 RG-LRU 反向仍是实数仿射递推先求入口梯度,再逐步恢复全部导数 复数状态梯度通过共轭转移传播所有模态汇总到两个控制梯度 用 λ 的共轭传播状态梯度,再按模态求和每个位置只保留 c 与 d 的两个梯度
图 2 左列是 RG-LRU 已验证的执行规律,中列说明 SAMU 在相同仿射组合公式上增加了什么结构,右列给出实际 GPU 动作。SAMU 仍按 \(T_2\circ T_1\) 合并相邻时间步,但单步系数变为复数;它利用每个位置只有 \(c_t,d_t\) 两个动态量的性质,复用特殊函数结果、随用随算 \(\lambda_{t,m}\),并在反向按模态求和得到两个控制梯度。图中的箭头表示推导关系,不表示把 RG-LRU 参数转换成 SAMU 参数。
复杂度边界

SAMU 的整体反向没有变成 \(O(BL)\)。状态梯度、\(\nu\) 梯度、\(\theta\) 梯度和写入梯度仍然按模态计算;被压缩的是动态控制器梯度的中间表示。

控制器缓存约定

保存精确导数需要的 \(p\) 和 \(r\),不能从零幅度反推

选中的实现会在前向保存每个位置的相位坐标 \(p\) 和径向链条所需的原始量 \(r\),连同递归输入交给融合控制器反向。方向归一化、方向梯度投影和幅度局部和都使用 FP32 累加。\(E_t,C_t,S_t\) 足以重放状态转移,但不足以单独恢复完整控制器导数。

精确分块闭式 · 可选路径

用 \(G_c,D_c\) 保存分块转移可以省显存,但不是默认低延迟路径

\[ G_c=\sum_{t\in c}e^{c_t},\qquad D_c=\sum_{t\in c}d_t, \]\[ P_{c,m}=e^{-\nu_m G_c}\,e^{i(K_c\theta_m+D_c)} \]

闭式使用最后一个不完整分块的真实 \(K_c\)。每个分块只保存两个统计量 \(G_c,D_c\),其整体形状为 \([B,C,2]\),即可在反向中重建原本形状为 \([B,C,M]\) 的复数乘法转移 \(P\)。但它与按 \(Q_c=L_c\circ O_g\) 并行求入口状态的实现组合后没有通过最终 BF16 输出误差门槛,因此默认路径仍直接保存 \(P\)。

实际效果

这些适配最终改变了什么

反向主路径

在长序列 \(D=2048\) 的剖析形状上,连续的共轭反向、输出融合和每程序 32 步的入口梯度并行计算,把反向 CUDA 事件合计从 6.265 毫秒降到 3.777 毫秒,下降 39.7%。其中求反向分块入口为 0.250 毫秒、逐步恢复导数为 0.602 毫秒、形成每块等价变换为 0.166 毫秒、共享控制梯度求和为 0.022 毫秒。

完整递归混合器

四个主要形状的前向+反向延迟降低 24.6%–40.2%,峰值实际分配显存降低 22.0%–23.5%。这包含控制器、状态递推、可见输出和全部相关梯度,不是单个扫描内核的结果。

公共循环块加入后

归一化、公共投影、逐通道卷积和多层感知机不会因 SAMU 改变,因此递归混合器优势被稀释到 5.8%–7.6%;加入 AdamW 后进一步变为 3.8%–6.5%。

仍未消除的成本

SAMU 每次前向+反向有 70–74 次 CUDA 内核启动,RG-LRU 为 50–51 次。复数重放和控制器小内核仍有固定成本,因此当前实现继续根据批量大小、序列长度和状态宽度选择路径。

最终按形状调度

形状区域SAMU经过充分优化的 RG-LRU
B≥4,L≤2048每位置复用 \(e^{c_t},\cos d_t,\sin d_t\),每程序处理 32 步,分块入口依次传播每程序处理 16 步;每 32 个分块为一组计算 \(Q_c\)
B=1,L=8192,D≥2048每程序处理 32 步;每 64 个分块为一组计算 \(Q_c\)每程序处理 16 步;每 32 个分块为一组计算 \(Q_c\)
B=1,16384≤L<65536每程序处理 32 步;每 64 个分块为一组计算 \(Q_c\)每程序处理 16 步;每 32 个分块为一组计算 \(Q_c\)
B=1,L≥65536前向入口依次传播;反向每 64 个分块为一组计算 \(Q_c\);每程序处理 32 步每程序处理 16 步;每 32 个分块为一组计算 \(Q_c\)
含重置、打包序列或未支持形状回退到精确规范路径精确且支持重置的规范路径

表中的每 64 个分块为一组只说明怎样并行计算 \(Q_c=L_c\circ O_g\)。它没有把两个控制量分组,没有把模态分组,也没有改变 SAMU 的模型方程。

06 · 显存、参数和内核启动

SAMU 的收益不只有延迟

实际分配显存、CUDA 缓存分配器保留显存、求分块入口状态的临时工作区和参数量分别报告。保留显存受分配器缓存影响,不能与实际分配显存混写。

递归混合器峰值实际分配显存低 22.0%–23.5%
D=2048 递归混合器参数量6,148 对 530,432
长序列 D=2048 分块入口临时工作区24.375 对 49.500 MiB
前向+反向 CUDA 内核启动数70–74 对 50–51SAMU 更快,但启动次数更多

保存分块等价变换和入口状态的理论临时工作区

形状SAMURG-LRU
B=4,L=2048,D=20486.000 MiB12.375 MiB
B=1,L=8192,D=25607.617 MiB15.469 MiB
B=1,L=32768,D=102412.188 MiB24.750 MiB
B=1,L=32768,D=204824.375 MiB49.500 MiB

这里只统计每个分块的等价变换和入口状态数组,不含输出、模型激活或 CUDA 分配器保留量。

递归混合器参数量

实数状态宽度 DSAMURG-LRU
10243,076134,144
20486,148530,432
25607,684826,880

这里只比较被替换的递归混合器参数;完整循环块仍包含双方共有的大矩阵和多层感知机。

07 · 代码与原始证据

每个数字都能回到原始数据

主结果使用 PyTorch 2.1.2 + CUDA 11.8;Fattori 复现使用 PyTorch 2.4.1 + CUDA 12.4。

正在读取 H800 环境记录……