01先定义你想比较什么
评测应回答部署选择,而不只是给策略排个名次。
- 任务与奖励
- 选择代表实际业务的任务,写明评分规则与正确性阈值。代码任务上的奖励不能直接解释为其他领域的准确率。
- 质量与成本
- 一起阅读平均奖励、每次请求成本和每个正确答案成本。正确样本数为零时,每个正确答案成本未定义,不能写成零。
- 真实替代方案
- best_single 在训练划分中选择一个模型,再固定用于测试;这是路由策略需要比较的部署基线。
02防止比较在起点就失真
数据划分与模型选择必须在看测试结果之前确定。
- 01
共享同一测试集
所有策略使用同一划分。矩阵有官方划分时优先采用来源划分;否则按任务标识与种子进行确定性哈希划分。拒绝重复任务标识。
- 02
区分策略与上界
oracle 和 cheapest_correct 读取测试行的已知结果,只能作为边界。报告中的 cheapest 也读取该行实际成本,不能作为可部署策略宣称。
- 03
保存实验身份
保存矩阵、模型池指纹、checkpoint_id、训练参数和评测日志。报告中的划分描述需要与 eval.split.source 或 eval.split.hash 日志核对。
- 成对差异
- 先在每个相同任务上比较策略与参考模型,再汇总差异;不要比较来自不同任务集合的平均分。
- 区间跨零
- 差异的置信区间包含零时,报告为无法区分;不能只摘取正的均值作为提升结论。同时保留符号检验结果。
- 成本前沿
- 查看成本扫描中哪些点被其他点同时在质量和成本上超越。选取业务可接受的策略,再单独测试线上延迟。
同池结果不代表跨池结果+
CodeRouterBench 的正向结果只支持该任务与模型池上的比较。RouterEval 跨池实验未验证普遍迁移优势;更换模型池后需要重新评测。
离线回放不等于线上服务测试+
矩阵回放不会产生新的供应商输出,也不测排队、网络或生成延迟;不能从离线质量表推导服务容量。
评测设置
- 数据集
- CodeRouterBench,共 4,781 行;采用数据源的 probing / id_test 划分,其中 1,425 行用于留出评测。哈希比例和种子不参与这次划分。
- 正确性阈值
- 0.5,同一个阈值用于所有 router,包括 oracle。
- 置信区间
- 2,000 次配对 bootstrap,种子 0,95% 区间。配对的意思是同一行上比较,而不是比较两个独立样本的均值。
- 模型池
- 8 个模型全部合格;checkpoint
sft-f23aa90cd7c68f27e9b702a0,池指纹 3520b40db3b55b1e。 - 延迟
- Qwen/Qwen3-0.6B on cpu,float32,8 个候选,25 次迭代 + 5 次预热。没有 GPU。
- 成本
- 按各家公开价目表对实际 token 计数结账,不是估的;oracle 与 cheapest 用同一张价表。
NOTE / 01GEMM / KERNELS
从算子到服务:cuBLAS 与 cuDNN
先识别限制执行的资源,再选择算子实现。
模型的一次前向传播会被拆成矩阵乘、归一化、激活、数据重排与通信。优化的对象不是一个笼统的“GPU 利用率”,而是给定形状、精度和内存布局下的执行路径。本笔记连接库级选择、Roofline 分析与服务级验证。
FIG. 01GEMM / KERNELS
分块矩阵乘与结果累加示意图,未表示实测比例或具体引擎布局。01GEMM 的形状是问题的一部分
线性投影可以表示为 Y = XW。批内参与计算的 token 数会改变矩阵的行维度,因而 prefill 与 decode 不应只用同一组大矩阵测试代替。cuBLAS 提供 BLAS 运算;cuBLASLt 进一步暴露矩阵布局、计算类型、算法候选和 workspace 等选择。评估候选算法时,需要把调优开销与重复执行的收益分开记录。 [1]
02融合改变数据移动,不只改变调用次数
cuDNN 的图接口可以表达运算及其依赖,由执行计划选择受支持的实现;SDPA 属于可融合的典型路径。减少中间张量写回可能降低显存流量,但一个融合算子能否使用,还取决于精度、mask、张量形状、布局和具体版本。不能把“使用 cuDNN”当作整个推理框架自动融合的证据。 [2]
03用 Roofline 提出可检验的瓶颈假设
算术强度用 FLOPs 除以移动的字节数描述。低强度路径可能先受内存带宽限制,大矩阵路径可能接近计算限制;启动开销、同步和通信则可能落在这个简化模型之外。因此,先测单算子,再看时间线上的空隙,最后验证完整请求。峰值 FLOPs 不是服务吞吐的预测值。 [3]
模型与记号
P ≤ min(P_peak, BW × I) I = FLOPs / bytes
P 是可达运算速率,BW 是对应内存层级的带宽,I 是该层级的算术强度。它是性能上界模型;没有包含排队、通信和调度。
如何设计实验
- 固定输入契约
记录 M/N/K、批量、精度、转置、stride、对齐和 workspace。选择来自真实模型的形状,而不只挑选整齐的大矩阵。
- 分别测量执行与正确性
使用设备侧计时并明确同步边界,预热后记录分布;与参考实现比较误差,同时检查异常值和边界形状。
- 回到完整服务
保持模型与流量相同,检查端到端延迟、吞吐、峰值显存和错误率。若单算子收益没有传递到服务,检查调度与数据搬运。
NOTE / 02ATTENTION / MEMORY
FlashAttention 与 PagedAttention:不同层的内存问题
一个优化读写路径,一个组织持久状态。
Attention 的数学表达、算子的显存访问以及 KV cache 的分配是三个不同层次。FlashAttention 关注计算时的数据移动;PagedAttention 让随序列增长的 KV 状态按块寻址。理解二者的边界,比把它们当作互相替代的开关更重要。
FIG. 01ATTENTION / MEMORY
逻辑 token 块
A₀A₁A₂A₃
A₁B₀A₀A₃B₁A₂
物理 KV 块
物理 KV 块示意图,未表示实测比例或具体引擎布局。01FlashAttention:避免物化完整中间矩阵
标准 attention 可以写成 softmax(QKᵀ / √d + M)V。直接实现可能把很大的注意力中间量写回 HBM。FlashAttention 采用分块与在线 softmax,将局部计算留在更快的片上存储中,减少 HBM 读写;它在数学上计算精确 attention,而不是通过稀疏近似删除注意力连接。浮点计算仍需检查数值容差。 [1]
02PagedAttention:逻辑连续,物理分块
生成过程中的序列长度会变化。为每条序列预留一整段最大长度空间会浪费容量;PagedAttention 用块表将逻辑 token 块映射到物理 KV 块,attention kernel 按映射访问。共享状态还需要引用管理和写时复制等机制。分页降低分配与复制浪费,并不消除 KV 数据本身。 [2]
03兼容组合需要落到后端实现
Flash-style 分块与 paged KV 寻址可以在实现中结合;cuDNN 的 SDPA 文档也列出了 paged attention 的支持条件。但具体后端是否支持某种 head dimension、精度、mask 或 GQA 布局,需要逐项核对。算法名称相同,不等于每条运行路径与每个版本都相同。 [3]
模型与记号
O = softmax(QKᵀ / √d + M)V
Q、K、V 是查询、键和值;d 是每个查询/键头的维度,M 表示 mask 或加性偏置。分页改变存储寻址;分块改变执行顺序与数据移动。
如何设计实验
- 分开两个消融维度
比较 attention 后端时保持缓存分配策略不变;比较分页策略时保持模型、输入分布与内核条件一致。
- 观察容量与吞吐的联系
记录实际分配块、尾块占用、可容纳请求与抢占;再测相同延迟约束下的有效吞吐,避免只报告空闲显存。
- 保留正确性与边界测试
覆盖不同序列长度、非整块尾部、共享前缀与长输出。保留基准输出对照及峰值显存。
机制图为原创示意;公式用于解释或容量建模。论文与官方文档中的结果不等同于 4Router 实测。