|
|
|
|
@ -27,7 +27,7 @@
|
|
|
|
|
* Triton:基于 Python 编写的高效 GPU Kernel,可利用 Agent 自动调优,**开发效率高、易于迁移**;
|
|
|
|
|
|
|
|
|
|
* 要求 pybind 和 Triton 结果均与 reference 一致,鼓励参赛选手持续调优 Triton ,使其性能逼近甚至超越 pybind 性能。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6. 输出 benchmark 结果对比表。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -131,20 +131,31 @@ EOF
|
|
|
|
|
|
|
|
|
|
**目标:**进入本模块所需的源码目录:https://gitlink.org.cn/metax-maca/op_optimization/tree/master/%E5%9F%BA%E4%BA%8EAI%20Agent%E5%BC%80%E5%8F%91%E8%8C%83%E5%BC%8F%E7%9A%84%E5%9B%BD%E4%BA%A7GPU%E5%A4%A7%E6%A8%A1%E5%9E%8B%E6%8E%A8%E7%90%86%E7%AE%97%E5%AD%90%E5%BA%93%E4%BC%98%E5%8C%96%2Fbaselines%2Ffused_moe
|
|
|
|
|
|
|
|
|
|
1. 克隆代码仓库
|
|
|
|
|
|
|
|
|
|
```Bash
|
|
|
|
|
git clone https://gitlink.org.cn/metax-maca/op_optimization.git
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
2. 准备fused_moe
|
|
|
|
|
|
|
|
|
|
在仓库目录 `op_optimization/基于AI Agent开发范式的国产GPU大模型推理算子库优化` 下,找到 `fused_moe` 文件夹。可以将 `fused_moe` 整个目录复制到工作目录 `data/` 下。
|
|
|
|
|
|
|
|
|
|
**下一步操作:** 切换到 FlashInfer Baseline 项目目录。
|
|
|
|
|
|
|
|
|
|
**操作:**切换到指定项目路径。
|
|
|
|
|
|
|
|
|
|
**命令示例:**
|
|
|
|
|
|
|
|
|
|
```apl
|
|
|
|
|
cd /root/Project/fused_moe # 这里需要替换成自己的项目路径
|
|
|
|
|
cd data/fused_moe # 这里需要替换成自己的项目路径
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**预期结果:**
|
|
|
|
|
|
|
|
|
|
终端提示符路径显示为 fused\_moe 项目路径:
|
|
|
|
|
|
|
|
|
|
* (base) root@0a5a9d0c0f06:~/Project/fused\_moe#
|
|
|
|
|
* (base) root@0a5a9d0c0f06:/data/fused_moe#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 步骤 3:pybind 编译
|
|
|
|
|
@ -162,15 +173,14 @@ bash scripts/build_fused_moe_i8_tn_pybind.sh
|
|
|
|
|
切换 Python 环境命令示例:
|
|
|
|
|
|
|
|
|
|
```apl
|
|
|
|
|
PYTHON_BIN=/path/to/python bash scripts/build_fused_moe_i8_tn_pybind.sh
|
|
|
|
|
[SUCCESS] /data/fused_moe/standalone/fused_moe_i8_tn/build/fused_moe_i8_tn_pybind.sh
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**预期结果:**
|
|
|
|
|
|
|
|
|
|
编译成功无报错,终端显示:
|
|
|
|
|
|
|
|
|
|
* \[SUCCESS\] /root/Project/fused\_moe/standalone/fused\_moe\_i8\_tn/build/fused\_moe\_i8\_tn\_ pybind.so
|
|
|
|
|
* \[SUCCESS] /data/fused_moe/standalone/fused_moe_i8_tn/build/fused_moe_i8_tn_pybind.so
|
|
|
|
|
|
|
|
|
|
且成功生成 `fused_moe/standalone/fused_moe_i8_tn/build/fused_moe_i8_tn_pybind.cpython-310-x86_64-linux-gnu.so` 文件
|
|
|
|
|
|
|
|
|
|
@ -185,9 +195,9 @@ PYTHON_BIN=/path/to/python bash scripts/build_fused_moe_i8_tn_pybind.sh
|
|
|
|
|
| `recompile with -fPIC` | 编译未开启位置无关代码 | 确保 `mxcc`/ `g++`编译参数中有 `-fPIC` |
|
|
|
|
|
| `permission denied` | 无脚本执行权限 | `chmod +x scripts/*.sh` |
|
|
|
|
|
| `undefined reference to Py_...` | Python 版本不匹配 | 确认编译脚本中`PYTHON_BIN`路径与当前运行的 Python 环境完全一致 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 步骤 4:正确性测试
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**目标:**验证 reference 计算、pybind 计算、Triton 计算这三种方式计算结果的数值是否完全一致。
|
|
|
|
|
|
|
|
|
|
**操作:**运行 `fused_moe/scripts/run_fused_moe_i8_tn_pybind_test.sh` 脚本
|
|
|
|
|
@ -214,24 +224,24 @@ bash scripts/run_fused_moe_i8_tn_pybind_test.sh --backend reference
|
|
|
|
|
> pybind:fused\_moe\_i8\_tn\_topk1 passed: rows=256, cols=128, sample C\[0\]=0.69531, C\[last\]=-0.44531
|
|
|
|
|
> pybind:fused\_moe\_i8\_tn\_topk2 passed: rows=512, cols=128, sample C\[0\]=-0.57813, C\[last\]=-0.49805
|
|
|
|
|
> pybind:fused\_moe\_i8\_tn\_topk3 passed: rows=384, cols=128, sample C\[0\]=-1.08594, C\[last\]=-0.33594
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> reference:fused\_moe\_i8\_tn\_topk1 passed: rows=256, cols=128, sample C\[0\]=0.6934, C\[last\]=-0.4451
|
|
|
|
|
> reference:fused\_moe\_i8\_tn\_topk2 passed: rows=512, cols=128, sample C\[0\]=-0.5768, C\[last\]=-0.4975
|
|
|
|
|
> reference:fused\_moe\_i8\_tn\_topk3 passed: rows=384, cols=128, sample C\[0\]=-1.0875, C\[last\]=-0.3362
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> triton:fused\_moe\_i8\_tn\_topk1 passed: rows=256, cols=128, sample C\[0\]=0.69337, C\[last\]=-0.44513
|
|
|
|
|
> triton:fused\_moe\_i8\_tn\_topk2 passed: rows=512, cols=128, sample C\[0\]=-0.57678, C\[last\]=-0.49749
|
|
|
|
|
> triton:fused\_moe\_i8\_tn\_topk3 passed: rows=384, cols=128, sample C\[0\]=-1.08748, C\[last\]=-0.33618
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**结果解释:**
|
|
|
|
|
|
|
|
|
|
* “pybind/reference/Triton”:三种计算方式;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* “fused\_moe\_i8\_tn\_topk1/2/3 passed”:测试算子通过数值校验,数值误差在允许范围内且无明显异常,否则会报错 FAILED;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* ”rows=... , cols=...“:输出 Tensor 的行和列的大小;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* ”sample C\[0\]=... , C\[last\]=...“:首尾采样值,用于辅助定位数值偏差,不作为精度判定依据。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -245,9 +255,9 @@ bash scripts/run_fused_moe_i8_tn_pybind_test.sh --backend reference
|
|
|
|
|
| `FAILED: shape mismatch` | 输出张量形状不一致 | 检查 Token Permute / Unpermute 逻辑;确认 expert 维度对齐 |
|
|
|
|
|
| `FAILED: NaN or Inf detected` | 溢出或未初始化内存 | 检查 INT8 乘加是否溢出;确认 GEMM 输出是否反量化 |
|
|
|
|
|
| 终端长时间无输出 | Kernel 死锁或 Launch 失败 | 减小测试 shape;检查是否触发 MACA 硬件限制 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### 步骤5:性能测试
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**目标:**输出 benchmark 结果对比表
|
|
|
|
|
|
|
|
|
|
**操作:**运行 `fused_moe/scripts/run_fused_moe_i8_tn_benchmark.sh` 脚本
|
|
|
|
|
@ -260,8 +270,8 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|
|
|
|
# --warmup:设置预热次数
|
|
|
|
|
# --iters:设置迭代次数
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**预期结果:**
|
|
|
|
|
|
|
|
|
|
编译成功无报错,输出示例如下:
|
|
|
|
|
@ -269,26 +279,26 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|
|
|
|
> pybind:fused\_moe\_i8\_tn\_topk1 benchmark: avg\_ms=0.308978, TOPS=0.027149, warmup=5, iters=20
|
|
|
|
|
> pybind:fused\_moe\_i8\_tn\_topk2 benchmark: avg\_ms=0.304500, TOPS=0.055098, warmup=5, iters=20
|
|
|
|
|
> pybind:fused\_moe\_i8\_tn\_topk3 benchmark: avg\_ms=0.297775, TOPS=0.042256, warmup=5, iters=20
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> reference:fused\_moe\_i8\_tn\_topk1 benchmark: avg\_ms=1685.43, TOPS=0.000005, warmup=5, iters=20
|
|
|
|
|
> reference:fused\_moe\_i8\_tn\_topk2 benchmark: avg\_ms=3384.52, TOPS=0.000005, warmup=5, iters=20
|
|
|
|
|
> reference:fused\_moe\_i8\_tn\_topk3 benchmark: avg\_ms=2532.14, TOPS=0.000005, warmup=5, iters=20
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> triton:fused\_moe\_i8\_tn\_topk1 benchmark: avg\_ms=19.013421, TOPS=0.000441, warmup=5, iters=20
|
|
|
|
|
> triton:fused\_moe\_i8\_tn\_topk2 benchmark: avg\_ms=16.745914, TOPS=0.001002, warmup=5, iters=20
|
|
|
|
|
> triton:fused\_moe\_i8\_tn\_topk3 benchmark: avg\_ms=19.630328, TOPS=0.000641, warmup=5, iters=20
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**结果解释:**
|
|
|
|
|
|
|
|
|
|
* “pybind/reference/Triton”:三种计算方式;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* “fused\_moe\_i8\_tn\_topk1/2/3”:分别对应选择前 1 / 2 / 3 个专家场景下的 MoE 算子;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* “avg\_ms”:平均算子执行耗时(毫秒),这里不计算预热时间,只计算正式迭代的<E4BBA3><E79A84><EFBFBD>间<EFBFBD><E997B4><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* “TOPS”:Tera Operations Per Second,本次 MoE 算子的总运算量 / 实际耗<E99985><E88097><EFBFBD>;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
* “warmup=5, iters=20”:预热轮数和正式迭代数。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -408,7 +418,7 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|
|
|
|
* 选择适配硬件:算子需要适配的目标硬件厂商及型号,建议:沐曦
|
|
|
|
|
|
|
|
|
|
* 最大演化轮次:优化算法迭代次数,取值范围40-400,建议默认40,复杂算法可提高至100+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5. 提交优化任务:点击右下角 \[优化\] 按钮,系统将提交任务并进入 \[生成中\] 状态
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -550,7 +560,7 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|
|
|
|
* 确保算力平台已正确安装 Python 和 C++、MACA 编译器及相关运行时库,避免因环境缺失导致编译失败;
|
|
|
|
|
|
|
|
|
|
* 镜像环境使用 Conda Python 作为默认运行环境,避免系统 Python 与 Conda Python 混用,防止 `Python.h`或 `libpython`路径错误。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. pybind 编译与链接
|
|
|
|
|
|
|
|
|
|
* 若`Python.h not found`,请检查脚本中`PYTHON_INCLUDE`是否指向当前 Python 的 `include`目录;
|
|
|
|
|
@ -558,7 +568,7 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|
|
|
|
* 若`libpython not found`,请直接指定 Conda 下的`**libpython3.x.so**`绝对路径,避免链接系统静态库;
|
|
|
|
|
|
|
|
|
|
* 编译 `pybind`模块时,务必开启 `-fPIC`,否则会出现 `recompile with -fPIC`错误。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3. 性能测试建议
|
|
|
|
|
|
|
|
|
|
* benchmark 应在关闭其他占用 GPU 的任务后执行,避免干扰性能数据;
|
|
|
|
|
@ -579,13 +589,13 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|
|
|
|
* `def get_init_inputs`,表示 module init 的输入测试样例;
|
|
|
|
|
|
|
|
|
|
* `def get_inputs`,表示 module forward 的输入测试样例。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. 性能优化建议
|
|
|
|
|
|
|
|
|
|
* 对于复杂算子,可适当提高最大演化轮次(如 100-200),获得更高加速比;
|
|
|
|
|
|
|
|
|
|
* 优先选择算子广场中已有优化案例的算子类型,降低适配失败概率。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3. 硬件适配问题
|
|
|
|
|
|
|
|
|
|
* 提交任务前确认目标硬件支持的算子类型;
|
|
|
|
|
|