Prhub

#29382 [CPU] use faster exp in silu_and_mul

原始 PR 作者 mingfeima 合并时间 2026-06-29 09:38 文件变更 1 提交数 2 评论 2 代码增减 +1 / -1

执行摘要

CPU siLU-and-mul 使用更快 exp_u20 近似

加快 CPU 上 silu_and_mul 激活函数的计算速度,该操作在 LLM 推理中频繁出现(如 gated MLP)。PyTorch 的 Vectorized 提供了 exp_u20 近似,比 sleef u10 的 exp 更快,且精度足以满足推理需求。

值得合并,变更风险低且收益明确。建议后续将类似近似应用于其他激活函数(如 gelu_tanh_and_mul)的向量化路径,以获得更多加速。

讨论亮点

无 review 讨论。

实现拆解

  1. 定位变更入口:文件 sgl-kernel/csrc/cpu/activation.cpp 中的 silu_and_mul_cpu 函数。
  2. 替换向量化路径:在 lambda 的向量化版本中,将 x.neg().exp() 改为 x.neg().exp_u20(),标量路径的 std::exp(-x) 保持不变。
  3. 保持接口不变:函数签名、模板参数、张量布局均未修改,确保调用方无需适配。
文件 模块 状态 重要度
sgl-kernel/csrc/cpu/activation.cpp CPU 内核 modified 4.72

关键符号

silu_and_mul_cpu

关键源码片段

sgl-kernel/csrc/cpu/activation.cpp core-logic

核心变更文件,替换 silu_and_mul 向量化路径中的 exp 为 exp_u20

// 文件 : sgl-kernel/csrc/cpu/activation.cpp
// 改动 : 将向量化版本中的 .exp() 替换为 .exp_u20(),
// exp_u20 是 PyTorch 提供的更快近似,精度约 20 ULP,
// 标量回退路径仍使用 std::exp 以保证数值稳定性。
at::Tensor silu_and_mul_cpu(at::Tensor& input) {
  auto sizes = input.sizes().vec();
  int64_t last_dim = input.ndimension() - 1;
  int64_t d = sizes[last_dim] / 2;
  sizes[last_dim] = d;
  int64_t num_tokens = input.numel() / input.size(-1);
  at::Tensor out = at::empty(sizes, input.options());  AT_DISPATCH_REDUCED_FLOATING_TYPES(input.scalar_type(), "silu_and_mul", [&] {
    using Vec = at::vec::Vectorized<float>;
    act_and_mul_kernel_impl(
        out.data_ptr<scalar_t>(),
        input.data_ptr<scalar_t>(),
        num_tokens,
        d,
        // 标量回退:使用标准 exp,确保精度
        [](float x) { return x / (1.f + std::exp(-x)); },
        // 向量化路径:使用 exp_u20 近似,加速推理
        [](Vec x) { return x / (Vec(1.f) + x.neg().exp_u20()); });
  });
  return out;
}

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

精度风险:exp_u20 的 ULP 误差约为 20,相对于 IEEE-754 的 0.5 ULP 标准有所放宽,在数值敏感场景(如极端低概率采样)可能导致输出差异。但 silu_and_mul 作为激活函数通常在 softmax 前,且 Q/K 值范围有限,实际风险低。回归风险:仅修改一行向量化代码,且测试通过,回归可能性低。

用户:CPU 推理用户可获得约 6%-29% 的 silu_and_mul 加速,对整体延迟有正面影响。系统:无部署变更,兼容现有模型和配置文件。团队:变更极小,需在 CPU 基准测试中确认加速是否稳定。

精度近似 仅 CPU 路径

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论