Skip to content

【训练营】BF16 Kernel 优化 - #230

Open
shsaihdsaiudh wants to merge 2 commits into
InfiniTensor:masterfrom
shsaihdsaiudh:bf16-kernel-opt
Open

shsaihdsaiudh wants to merge 2 commits into
InfiniTensor:masterfrom
shsaihdsaiudh:bf16-kernel-opt

Conversation

@shsaihdsaiudh

Copy link
Copy Markdown

2026 夏季训练营项目阶段提交(选题一:BF16 核函数优化),ID: yangyeyuan。

本 PR 包含两个提交:a3a44b8(可配置 CUDA 架构等构建设置,优化代码的依赖)+ 663b9f2(BF16 训练核函数优化本体)。完整总结报告(含优化历程、ncu/nsys 分析):projects/bf16_kernel_opt/docs/report.zh-CN.md,PyTorch 对照基线与 profiler 原始数据在同目录 results/ 下。

优化内容概览

  1. BinaryBackward 广播路径重写elementwise.cu):删除病态的 TwoPassHist(工作区流量达真实数据 6–12 倍),改为形态分类 + 共享内存 FP32 直方图行广播 kernel + warp 归约列广播 kernel,128-bit 向量化。bf16 行广播提速 19.5–86×,反超 PyTorch 约 2×。
  2. runtime mempool 修复cuda_guard_impl.cc):pin cudaMemPoolAttrReleaseThreshold=UINT64_MAX,消除 profiler 同步后 WSL2 物理页重映射(单项 BF16 步时 -32%)。
  3. Cast 机制:Cast kernel 128-bit 向量化(2.3×);autocast 权重 cast 缓存(梯度累积下 Cast 246→173 次/步);GEMM 梯度直接输出 BF16(删除 FIXME 的 FP32 promote hack,消掉反向回 cast)。
  4. 融合 NewGELU(新增 gelu.cu + autograd::NewGELU):消灭被 FP32 化的 7-pass GELU 链,与 PyTorch gelu(tanh) 舍入点对齐,bf16 前向与旧链逐位一致。
  5. EmbeddingBackwardembedding.cu):1 block → block-per-token + float4 原子加,4.6 ms → 0.41 ms/步(11×)。

端到端结果(GPT2 124M,batch 4×seq 64,30 步中位)

构建 精度 优化前 优化后
PROFILE_MODE=ON BF16 136.6 ms 99.8 ms(-27%)
PROFILE_MODE=ON FP32 129.3 ms 97.0 ms(-25%,无回退)
PROFILE_MODE=OFF BF16 39.7 ms 36.5 ms(7008 tok/s,-7.9%)
PROFILE_MODE=OFF FP32 45.3 ms 41.8 ms(6120 tok/s,-7.6%)
PROFILE_MODE=OFF,batch 8×seq 128 BF16 90.5 ms 72.2 ms(14192 tok/s,+25.4% 吞吐

优化前 profiler 开启时 BF16 反而比 FP32 慢 5%(cast 风暴 × 逐 kernel 同步的开销放大);优化后各配置下 BF16 均快于 FP32,FP32 性能无明显下降。微基准正确性检查全 PASS,详细数据与分析见报告。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant