目录

【CCF创新大赛】InfiniCore 沐曦适配 sigmoid 算子 MetaX 后端 PR(参赛ID:Esperanza)

参赛信息

实现概要

  • 新增文件:
    • src/infiniop/ops/sigmoid/metax/sigmoid_metax.h
    • src/infiniop/ops/sigmoid/metax/sigmoid_metax.maca
  • 修改文件:
    • src/infiniop/ops/sigmoid/operator.cc(增加 5 处 #ifdef ENABLE_METAX_API 接线)
  • 实现方式:直接复用现有 op::sigmoid::cuda::SigmoidOp 内核,通过 elementwise MetaX 描述符接入 MetaX 后端;与 silu 的 MetaX 实现同构。
  • 支持数据类型:BF16 / F16 / F32 / F64

交付物清单

sigmoid-metax-deliverable/
├── README.md                         <- 本文档
├── PERFORMANCE.md                    <- 性能对比数据报告(含方法学说明,重要)
├── patch/
│   └── feat-metax-sigmoid.patch      <- 三处改动的 git patch(可一键应用,推荐)
├── src/                              <- 改动后的源文件原件(供直接对照/拷贝)
│   ├── sigmoid_metax.h               <- 新增文件1
│   ├── sigmoid_metax.maca            <- 新增文件2(核心实现)
│   └── operator.cc                   <- 修改文件3(已含 MetaX 接线,完整文件)
├── bench/                            <- 性能复现脚本
│   ├── sigmoid_bench.py              <- 大张量吞吐 bench(改自官方 test)
│   └── torch_sigmoid_baseline.py     <- 正确同步的 torch 基线
├── logs/                             <- 验证证据(已去除终端颜色码)
│   ├── build_metax_summary.log       <- 编译成功摘要(build ok, 818s)
│   ├── baseline_silu_test.log        <- 基线 silu 单测(Test passed)
│   ├── sigmoid_test.log              <- sigmoid 正确性单测(Test passed)
│   ├── sigmoid_perf.csv              <- 小/中张量延迟(54 用例)
│   ├── sigmoid_perf_large.csv        <- 大张量 lib vs 真实 torch(12 用例)
│   └── *_raw.log                     <- 三份原始 profile/bench 日志
└── docs/
    └── PROGRESS.md                   <- 完整工作记录 / 断点恢复文档

改动详情

新增 sigmoid/metax/sigmoid_metax.h(8 行)

MetaX 后端描述符声明,一行宏展开,与 silu 同构:

#include "../../../elementwise/metax/elementwise_metax_api.h"
ELEMENTWISE_DESCRIPTOR(sigmoid, metax)

新增 sigmoid/metax/sigmoid_metax.maca(核心,~70 行)

MetaX 后端实现。create() 做 dtype/shape 校验并创建 elementwise 描述符;calculate() 按 dtype 分派到复用的 cuda::SigmoidOp 内核(block=256):

#include "../cuda/kernel.cuh"          // 复用已有 SigmoidOp
namespace op::sigmoid::metax {
  // create: CHECK_DTYPE(BF16,F16,F32,F64) + CHECK_SAME_SHAPE + CREATE_ELEMENTWISE_METAX_DESCRIPTOR
  // calculate: switch(_dtype) -> _device_info->calculate<256, cuda::SigmoidOp, T>(...)
}

silu/metax/silu_metax.maca 做「归一化 diff」(把 sigmoid->silu 名字抹掉后比较)结果完全一致,证明结构正确。

修改 sigmoid/operator.cc(+5 处,每处 3 行)

在算子总入口照 silu 模式加 5 个 #ifdef ENABLE_METAX_API 块,把 MetaX 接进 4 个 C API 的设备分派:

  • 顶部 #include "metax/sigmoid_metax.h"
  • CREATE / GET(workspace)/ CALCULATE / DELETE 各加一行 INFINI_DEVICE_METAX -> metax

xmake 无需改动:xmake/metax.lua 用通配符 ops/*/metax/*.maca 自动收集源文件,新增文件自动纳入编译。

如何应用到 InfiniCore

在一份干净的 InfiniCore 仓库(git checkout 56053d9 或最新 main)里,二选一:

方式 A(推荐,打 patch)

cd /path/to/InfiniCore
git checkout -b feat/metax-sigmoid
git apply /path/to/patch/feat-metax-sigmoid.patch     # 或 git am 若想保留为 commit
git status      # 应看到 2 新增 + operator.cc 修改

方式 B(手动拷贝)

mkdir -p src/infiniop/ops/sigmoid/metax
cp src/sigmoid_metax.h   src/infiniop/ops/sigmoid/metax/
cp src/sigmoid_metax.maca src/infiniop/ops/sigmoid/metax/
cp src/operator.cc       src/infiniop/ops/sigmoid/operator.cc   # 整文件覆盖

如何编译

坑:默认并行度会 OOM 卡死。本机 128 核但仅 32GB RAM,xmake 默认 128 路并行调用 mxcc(MACA 的 LLVM 编译器,每个吃几 GB),瞬间打满内存触发 OOM Killer,编译卡死/报 mxcc: error: unable to execute command: Killed

解法:限制并行度 -j4(峰值内存 <16GB),并放后台跑(前台长时间编译会把交互会话拖到超时假死)。

cd /path/to/InfiniCore
source /data/workspace/env_infinicore.sh        # MACA_PATH / xmake PATH / XMAKE_ROOT=y / INFINI_ROOT

# 首次需配置(已配过则跳过):metax + mc,关闭 ninetoothed
xmake f -y --metax-gpu=y --use-mc=y -c

# 编译(务必 -j4 + 后台)
nohup xmake -y -j4 > build.log 2>&1 &
# 等待完成(实测约 13~14 分钟,818s);完成后:
xmake install -y                                 # 装到 ~/.infini/lib/

编译成功标志:build.log 出现 [100%]: build oklibinfiniop-metax.a完成archiving(见logs/build_metax_summary.log)。-Werror已开,代码须零警告(本实现满足)。

如何测试

cd /path/to/InfiniCore
source /data/workspace/env_infinicore.sh
python3 test/infiniop/sigmoid.py --metax

测试框架会用大量 shape / stride / inplace 组合、F16/F32/BF16 三种 dtype,与 torch.sigmoid 逐一对拍。期望末行输出 Test passed!(见 logs/sigmoid_test.log)。

想先验证 MetaX 运行链路本身通畅,可先跑已有算子基线:python3 test/infiniop/silu.py --metax(见 logs/baseline_silu_test.log)。

验证环境

  • GPU:MetaX C500 64GB
  • MACA 版本:3.3.0.15
  • torch 版本:2.8.0+metax

验证结果

  • 编译:xmake -y -j4 通过,零错误零警告;xmake install -y 成功
  • 正确性:python3 test/infiniop/sigmoid.py --metax 对拍 torch.sigmoid 通过
  • 覆盖范围:F16 / F32 / BF16,多种 shape / stride / inplace / out-of-place
  • 符号检查:op::sigmoid::metax::Descriptor 已链接进 libinfiniop.so
  • 代码风格:clang-format --dry-run --Werror 三文件全 clean

性能数据(大张量吞吐)

测试方法:10 次 warmup + 300 次迭代取平均;torch 基线使用显式 torch.cuda.synchronize() 同步。

Shape Elements dtype lib (ms) torch (ms) lib/torch Throughput (Gelem/s) Bandwidth (GB/s)
8192^2 67.1M F32 1.206 0.364 3.32x 55.6 445
16384^2 268.4M F32 4.582 1.442 3.18x 58.6 469
16384^2 268.4M F16 4.218 1.179 3.58x 63.6 255
16384^2 268.4M BF16 4.212 1.289 3.27x 63.7 255

注:torch 原生 kernel 在此规模下已基本打满 C500 带宽;本实现采用通用 elementwise 模板,与同族算子(silu/gelu 等)性能水平一致。

状态

  • PR 状态:OPEN(等待上游 review / merge)

提 PR 指引

代码已就绪,提 PR 需用你的 GitHub 身份完成以下步骤。

DCO 签名提交(InfiniCore 强制 DCO,user.name/email 须与 GitHub/CLA 一致)

git config user.name  "你的名字"
git config user.email "你的邮箱"
git add src/infiniop/ops/sigmoid/metax/ src/infiniop/ops/sigmoid/operator.cc
git commit -s -m "feat: support sigmoid operator on metax"

commit 标题已对齐仓库约定(参考历史 feat: support deepseek paged attention on metax)。

push 到你的 fork 并开 PR

git remote add myfork https://github.com/你的用户名/InfiniCore.git
git push myfork feat/metax-sigmoid
# 到 GitHub 开 PR:base=InfiniTensor/InfiniCore:main, head=你:feat/metax-sigmoid

PR 正文建议

Adds the MetaX backend for the sigmoid elementwise operator. Mirrors the existing silu metax op - reuses op::sigmoid::cuda::SigmoidOp via the elementwise MetaX descriptor. Supports BF16/F16/F32/F64. New files sigmoid/metax/sigmoid_metax.{h,maca}; operator.cc wires 5 #ifdef ENABLE_METAX_API blocks. Tested via test/infiniop/sigmoid.py --metax on MetaX C500 - passes accuracy vs torch.sigmoid across shapes/strides and inplace/out-of-place for F16/F32/BF16.

竞赛留痕

gitlink.org.cn/ccf-ai-infra/GPUApps/issues 贴上 PR 链接。

后续计划

  • 当前 PR 聚焦功能适配与正确性验证;
  • 下一步计划对连续内存 + 同 dtype 路径做向量化访存优化(float4 / half2),作为独立 PR 进一步提升 MetaX elementwise 算子带宽。
关于
154.0 KB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号