forked from metax-maca/op_optimization
Merge pull request '修改Fused MoE教程' (#42) from wu_xy/op_optimization:master into master
This commit is contained in:
commit
3d82d79844
|
|
@ -1,54 +1,69 @@
|
|||
# MCTLASS\_Fused MoE 算子优化
|
||||
|
||||
# Fused MoE Baseline 入门:快速跑通最小闭环教程
|
||||
# Fused MoE 算子入门:从 Benchmark 验证到 XPU-OJ 接口提交
|
||||
|
||||
## 一、教程定位
|
||||
|
||||
本教程是参赛训练课程的 baseline 入门模块,主要帮助用户快速跑通 Fused MoE 的最小可运行流程。
|
||||
本教程是赛题二 **Fused MoE** 任务的“benchmark 性能基线与 XPU-OJ 提交衔接”模块,主要帮助学员跑通目标算子的 benchmark 脚本,理解原库 API、输入输出结构、性能指标和性能基线结果,并进一步读懂 XPU-OJ 题目包中的接口约定、测试数据、参考输出和精度要求。
|
||||
|
||||
完成本教程后,用户应能够完成源码编译、正确性测试和 benchmark 测试,并记录一份 baseline 性能结果,为后续算子优化提供对比基准。
|
||||
需要特别说明:
|
||||
|
||||
* 本教程不提供可直接提交的标准答案代码。
|
||||
|
||||
* 本教程仅提供冒烟级 starter 示例代码,用于验证环境、语言、提交链路和 `run_kernel(...)` 接口。
|
||||
|
||||
* benchmark 脚本用于建立性能基线,不是最终提交物。
|
||||
|
||||
* XPU-OJ 题包中的 `baseline()` 属于 OJ 后台参考实现,用于生成 `output_ref`,不是选手提交代码。
|
||||
|
||||
* 选手最终需要自行实现 `run_kernel(...)`,并在正确性通过后继续优化性能。
|
||||
|
||||
|
||||
完成本教程后,学员应能够跑通 benchmark 脚本,记录性能基线结果,读懂 XPU-OJ 题包,理解 OJ 的测试输入与参考实现,并完成一次冒烟级 OJ 提交。
|
||||
|
||||
## 二、学习目标
|
||||
|
||||
完成本模块后,你将能够:
|
||||
|
||||
1. 理解 Fused MoE 推理算子及 int8 量化在大模型推理加速中的核心作用与优化意义;
|
||||
1. 理解 Fused MoE 推理算子的基本作用、输入输出和典型应用场景。
|
||||
|
||||
2. 完成环境配置和 Fused MoE baseline 源码准备;
|
||||
2. 跑通对应 benchmark 脚本,并记录性能基线结果。
|
||||
|
||||
3. 跑通 Fused MoE 的最小闭环示例;
|
||||
3. 学习如何基于 Trition 与 MXMACA C++ 编写 Fused MOE 算子。
|
||||
|
||||
4. 理解基于 Trition 与 MXMACA C++ 写Fused MOE 算子;
|
||||
4. 完成数值正确性测试,即验证 reference 计算、pybind 计算、Triton 计算这三种方式计算结果是否数值完全一致。
|
||||
|
||||
5. 完成数值正确性测试,即验证 reference 计算、pybind 计算、Triton 计算这三种方式计算结果是否数值完全一致。
|
||||
|
||||
* reference:基于 PyTorch 架构在 CPU 上运行的**数值基准**实现;
|
||||
* reference:基于 PyTorch 架构在 CPU 上运行的**数值基准**实现。
|
||||
|
||||
* pybind:将 MXMACA C++ 算子编译并封装为 Python 可调用的动态库,**实现复杂且迁移成本高**;
|
||||
* pybind:将 MXMACA C++ 算子编译并封装为 Python 可调用的动态库,**实现复杂且迁移成本高**。
|
||||
|
||||
* Triton:基于 Python 编写的高效 GPU Kernel,可利用 Agent 自动调优,**开发效率高、易于迁移**;
|
||||
* Triton:基于 Python 编写的高效 GPU Kernel,可利用 Agent 自动调优,**开发效率高、易于迁移**。
|
||||
|
||||
* 要求 pybind 和 Triton 结果均与 reference 一致,鼓励参赛选手持续调优 Triton ,使其性能逼近甚至超越 pybind 性能。
|
||||
|
||||
6. 输出 benchmark 结果对比表。
|
||||
5. 区分 benchmark 性能基线、OJ 参考实现和选手提交代码。
|
||||
|
||||
6. 读懂对应 XPU-OJ 题包中的题目描述、接口约定、数据范围和精度要求。
|
||||
|
||||
7. 完成一次冒烟级 `run_kernel(...)` 提交,确认 OJ 链路、语言环境和接口调用正常。
|
||||
|
||||
8. 使用 AI Agent 辅助阅读题包、生成初版实现、定位错误并规划性能优化方向。
|
||||
|
||||
|
||||
## 三、适用对象
|
||||
|
||||
**本模块适合以下人员:**
|
||||
|
||||
* 参与基于 AI Agent 开发范式的国产 GPU 大模型推理算子库优化比赛的学生;
|
||||
* 参与基于 AI Agent 开发范式的国产 GPU 大模型推理算子库优化比赛的学生。
|
||||
|
||||
* 对 GPU 推理算子性能优化感兴趣的开发者;
|
||||
* 对 GPU 推理算子性能优化感兴趣的开发者。
|
||||
|
||||
* 需要了解 Fused MoE 推理性能的研究人员。
|
||||
|
||||
|
||||
**学习本模块前,需掌握以下基础知识:**
|
||||
|
||||
* Python、C++ 编程基础;
|
||||
* Python、C++ 编程基础。
|
||||
|
||||
* PyTorch 基础;
|
||||
* PyTorch 基础。
|
||||
|
||||
* GPU 推理基本概念。
|
||||
|
||||
|
|
@ -73,18 +88,18 @@
|
|||
|
||||
**代码准备:**
|
||||
|
||||
* 已获取 Fused MoE Baseline 源码。
|
||||
* 已获取 Fused MoE 源码。
|
||||
|
||||
|
||||
## 五、项目实践1-算力平台 baseline 源码部署
|
||||
## 五、项目实践1-算力平台进行 Benchmark 验证
|
||||
|
||||
\*\*项目目标:\*\*在算力平台上拉取 Fused MoE 的 baseline 源码,快速跑通最小闭环,并记录一份 baseline 性能结果,为后续算子优化提供对比基准。
|
||||
**项目目标:**跑通 Fused MoE 算子的 benchmark 脚本,建立性能基线,为后续算子优化提供对比基准。
|
||||
|
||||
### 步骤 1:检查运行环境
|
||||
|
||||
\*\*目标:\*\*确认当前环境满足本模块运行要求,包括编译器、MXMACA 工具链及 Python 依赖库。
|
||||
**目标:**确认当前环境满足本模块运行要求,包括编译器、MXMACA 工具链及 Python 依赖库。
|
||||
|
||||
\*\*操作:\*\*检查 Python、编译工具、MXMACA 编译器及关键 Python 包(numpy、torch、triton)是否存在。
|
||||
**操作:**检查 Python、编译工具、MXMACA 编译器及关键 Python 包(numpy、torch、triton)是否存在。
|
||||
|
||||
**命令示例:**
|
||||
|
||||
|
|
@ -98,9 +113,7 @@ which mxcc # 确认 MACA 编译器存在
|
|||
python - << 'EOF'
|
||||
import sys
|
||||
deps = ["numpy", "torch", "triton"]
|
||||
|
||||
missing = [ ]
|
||||
|
||||
missing = []
|
||||
for d in deps:
|
||||
try:
|
||||
__import__(d)
|
||||
|
|
@ -112,7 +125,6 @@ if missing:
|
|||
else:
|
||||
print("[OK] numpy, torch, triton are installed.")
|
||||
EOF
|
||||
|
||||
```
|
||||
|
||||
**预期结果:**
|
||||
|
|
@ -123,7 +135,7 @@ EOF
|
|||
|
||||
* /opt/maca/mxgpu\_llvm/bin/mxcc
|
||||
|
||||
* [OK] numpy, torch, triton are installed.
|
||||
* \[OK\] numpy, torch, triton are installed.
|
||||
|
||||
|
||||
**常见问题:**
|
||||
|
|
@ -131,74 +143,58 @@ EOF
|
|||
| 报错 | 原因 | 解决办法 |
|
||||
| --- | --- | --- |
|
||||
| `g++:command not found` | 未安装 C++ 编译工具 | `apt update && apt install -y build-essential` |
|
||||
| `Python 3.6.x/ Python 3.7.x` | Python 版本过低 | `conda install python=3.12` (推荐3.10+) |
|
||||
| `Python 3.6.x/ Python 3.7.x` | Python 版本过低 | `conda install python=3.12` (推荐3.10+) |
|
||||
| `ModuleNotFoundError: numpy` | 当前 Python 缺少依赖 | `pip install numpy torch triton` |
|
||||
|
||||
### 步骤 2:进入项目目录
|
||||
|
||||
\*\*目标:\*\*进入本模块所需的源码目录: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 data/fused_moe # 这里需要替换成自己的项目路径
|
||||
|
||||
cd /root/Project/fused_moe # 这里需要替换成自己的项目路径
|
||||
```
|
||||
|
||||
**预期结果:**
|
||||
|
||||
终端提示符路径显示为 fused\_moe 项目路径:
|
||||
|
||||
* (base) root@0a5a9d0c0f06:/data/fused\_moe#
|
||||
* (base) root@0a5a9d0c0f06:~/Project/fused\_moe#
|
||||
|
||||
|
||||
### 步骤 3:pybind 编译
|
||||
|
||||
\*\*目标:\*\*将用 C++ 编写的 fused\_moe 算子编译为 Python 可调用的 pybind 模块。
|
||||
**目标:**将用 C++ 编写的 fused\_moe 算子编译为 Python 可调用的 pybind 模块。
|
||||
|
||||
\*\*操作:\*\*运行 `fused_moe/scripts/build_fused_moe_i8_tn_pybind.sh` 脚本
|
||||
**操作:**运行 `fused_moe/scripts/build_fused_moe_i8_tn_pybind.sh` 脚本
|
||||
|
||||
**命令示例:**
|
||||
|
||||
```apl
|
||||
bash scripts/build_fused_moe_i8_tn_pybind.sh
|
||||
|
||||
```
|
||||
|
||||
切换 Python 环境命令示例:
|
||||
|
||||
```apl
|
||||
[SUCCESS] /data/fused_moe/standalone/fused_moe_i8_tn/build/fused_moe_i8_tn_pybind.sh
|
||||
|
||||
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.so
|
||||
* \[SUCCESS\] /root/Project/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` 文件
|
||||
|
||||
|
||||
且成功生成 `fused_moe/standalone/fused_moe_i8_tn/build/fused_moe_i8_tn_pybind.cpython-310-x86_64-linux-gnu.so` 文件
|
||||
|
||||
**常见问题:**
|
||||
|
||||
|
||||
| 报错 | 原因 | 解决办法 |
|
||||
| --- | --- | --- |
|
||||
| `Python.h: No such file or directory` | Python 头文件路径未找到 | 确认 `PYTHON_BIN` 路径正确,脚本自动探测 `sysconfig.get_path('include')` |
|
||||
|
|
@ -206,15 +202,15 @@ 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` 脚本
|
||||
|
||||
|
||||
**目标:**验证 reference 计算、pybind 计算、Triton 计算这三种方式计算结果的数值是否一致。
|
||||
|
||||
**操作:**运行 `fused_moe/scripts/run_fused_moe_i8_tn_pybind_test.sh` 脚本
|
||||
|
||||
**命令示例:**
|
||||
|
||||
|
||||
```apl
|
||||
bash scripts/run_fused_moe_i8_tn_pybind_test.sh --backend all # 运行全部计算方式
|
||||
|
||||
|
|
@ -225,80 +221,104 @@ bash scripts/run_fused_moe_i8_tn_pybind_test.sh --backend pybind
|
|||
bash scripts/run_fused_moe_i8_tn_pybind_test.sh --backend triton
|
||||
# 只测 reference:
|
||||
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: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\]=...“:首尾采样值,用于辅助定位数值偏差,不作为精度判定依据。
|
||||
|
||||
|
||||
* “pybind/reference/Triton”:三种计算方式;
|
||||
|
||||
* “fused\_moe\_i8\_tn\_topk1/2/3 passed”:测试算子通过数值校验,数值误差在允许范围内且无明显异常,否则会报错 FAILED;
|
||||
|
||||
* ”rows=... , cols=...“:输出 Tensor 的行和列的大小;
|
||||
|
||||
* ”sample C\[0\]=... , C\[last\]=...“:首尾采样值,用于辅助定位数值偏差,不作为精度判定依据。
|
||||
|
||||
|
||||
**常见问题:**
|
||||
|
||||
|
||||
| 报错 | 原因 | 解决办法 |
|
||||
| --- | --- | --- |
|
||||
| `ModuleNotFoundError: fused_moe_i8_tn_pybind` | pybind 模块未编译或未加入 `PYTHONPATH` | 回到步骤 3,确认 `.so` 已生成;执行 `export PYTHONPATH=/root/Project/fused_moe:$PYTHONPATH` |
|
||||
| `ModuleNotFoundError: fused_moe_i8_tn_pybind` | pybind 模块未编译或未加入 `PYTHONPATH` | 回到步骤 3,确认 `.so`已生成;执行 `export PYTHONPATH=/root/Project/fused_moe:$PYTHONPATH` |
|
||||
| `FAILED: max abs diff too large` | 数值误差超过阈值 | 检查 scale 是否应用位置错误;确认 TopK 索引与权重是否一致 |
|
||||
| `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` 脚本
|
||||
|
||||
|
||||
**目标:**输出 benchmark 结果对比表
|
||||
|
||||
**操作:**运行 `fused_moe/scripts/run_fused_moe_i8_tn_benchmark.sh` 脚本
|
||||
|
||||
**命令示例:**
|
||||
|
||||
|
||||
```apl
|
||||
bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 20
|
||||
# --backend:选择计算方式
|
||||
# --warmup:设置预热次数
|
||||
# --iters:设置迭代次数
|
||||
|
||||
```
|
||||
|
||||
|
||||
**预期结果:**
|
||||
|
||||
|
||||
编译成功无报错,输出示例如下:
|
||||
|
||||
> 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: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>;
|
||||
|
||||
|
||||
* “avg\_ms”:平均算子执行耗时(毫秒),这里不计算预热时间,只计算正式迭代的时间;
|
||||
|
||||
* “TOPS”:Tera Operations Per Second,本次 MoE 算子的总运算量 / 实际耗时;
|
||||
|
||||
* “warmup=5, iters=20”:预热轮数和正式迭代数。
|
||||
|
||||
|
||||
|
||||
**常见问题:**
|
||||
**常见错误:**
|
||||
|
||||
| 报错 | 原因 | 解决办法 |
|
||||
| --- | --- | --- |
|
||||
|
|
@ -310,11 +330,11 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|||
|
||||
系统链接:[https://deeplink.org.cn/kernelswift/task](https://deeplink.org.cn/kernelswift/task)
|
||||
|
||||
\*\*项目目标:\*\*基于 KernelSwift 智能算子迁移系统,对 Fused MoE 算子进行在线自动调优。通过输入算子代码,一键生成适配沐曦硬件的高性能实现,高效完成算子优化与全流程追踪。
|
||||
**项目目标:**基于 KernelSwift 智能算子迁移系统,对 Fused MoE 算子进行在线自动调优。通过输入算子的 PyTorch 代码,一键生成适配沐曦硬件的高性能实现,高效完成算子优化与全流程追踪。
|
||||
|
||||
### 步骤1:复用算子广场的 fused\_moe 算子进行二次优化
|
||||
### 步骤1:复用算子广场的Fused MoE 算子进行二次优化
|
||||
|
||||
\*\*目标:\*\*通过提交算子广场的 fused\_moe 算子代码发起自动优化流程,实现二次优化
|
||||
**目标:**通过提交算子广场的 fused\_moe 算子代码发起自动优化流程,实现二次优化
|
||||
|
||||
**操作:**
|
||||
|
||||
|
|
@ -397,10 +417,7 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|||
return [hidden_states, w1, w2, topk_weights, topk_idx, top_k, True]
|
||||
|
||||
def get_init_inputs():
|
||||
|
||||
return [ ]
|
||||
|
||||
|
||||
return []
|
||||
```
|
||||
|
||||
2. 进入新建任务页:点击左侧导航栏【新建任务】 ,进入算子提交页面。
|
||||
|
|
@ -420,15 +437,15 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|||
5. 提交优化任务:点击右下角 \[优化\] 按钮,系统将提交任务并进入 \[生成中\] 状态
|
||||
|
||||
|
||||

|
||||
[](https://www.picgo.net/image/image1.4SHrb4)
|
||||
|
||||
完成上述步骤将看到如下界面:
|
||||
|
||||

|
||||
[](https://www.picgo.net/image/image2.4SHscu)
|
||||
|
||||
### 步骤2:任务查看与结果管理
|
||||
|
||||
**目标:** 在新建优化任务后可追踪任务进度,获取优化结果
|
||||
**目标:**在新建优化任务后可追踪任务进度,获取优化结果
|
||||
|
||||
**操作:**
|
||||
|
||||
|
|
@ -441,7 +458,7 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|||
* 操作按钮:查看详情、删除任务
|
||||
|
||||
|
||||

|
||||
[](https://www.picgo.net/image/image3.4SHDeY)
|
||||
|
||||
2. 追踪任务进度:当前任务状态为【运行中】时,点击任务列表中的【查看详情】按钮,追踪任务进度:
|
||||
|
||||
|
|
@ -457,11 +474,12 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|||
|
||||
4. 性能调优:按设定的演化轮次迭代优化算子性能
|
||||
|
||||
|
||||
* 顶部:任务名称、创建/更新时间、适配硬件、当前轮次进度
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
[](https://www.picgo.net/image/image4.4SHVpp)
|
||||
|
||||
3. 获取优化结果:当前任务状态为【已完成】时,可在详情页查看优化结果:
|
||||
|
||||
* 优化后算子代码支持一键复制
|
||||
|
|
@ -471,7 +489,7 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|||
* 可点击【Diff 对比】查看优化前后代码差异,理解性能提升逻辑
|
||||
|
||||
|
||||

|
||||
[](https://www.picgo.net/image/image5.4ScbBr)
|
||||
|
||||
4. 任务异常处理
|
||||
|
||||
|
|
@ -487,7 +505,7 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|||
1. **环境检查**
|
||||
|
||||
```plaintext
|
||||
我正在算力平台部署 fused_moe_baseline 源码。
|
||||
我正在算力平台进行 Fused MoE 的 Benchmark 验证。
|
||||
需要的环境信息如下:
|
||||
- Python 3.12
|
||||
- g++ 13.3.0
|
||||
|
|
@ -497,14 +515,12 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|||
请帮我确认:
|
||||
1. 当前环境是否满足编译与运行要求?
|
||||
2. 是否有潜在的不兼容风险(如 Python 与 libpython 版本)?
|
||||
|
||||
```
|
||||
|
||||
2. **运行测试**
|
||||
|
||||
```plaintext
|
||||
请帮我运行 scripts/run_fused_moe_i8_tn_pybind_test.sh 脚本
|
||||
|
||||
```
|
||||
|
||||
3. **分析结果**
|
||||
|
|
@ -519,7 +535,6 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|||
1. 为什么 pybind 比 Triton 快这么多?
|
||||
2. TOPS 指标是否可信?
|
||||
3. 当前结果是否已经具备提交价值?
|
||||
|
||||
```
|
||||
|
||||
4. **报错检查**
|
||||
|
|
@ -536,33 +551,30 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|||
1. 错误原因是什么?
|
||||
2. 如何用 find 命令定位 libpython3.10.so?
|
||||
3. 如何在 build_fused_moe_i8_tn_pybind.sh 中正确指定路径?
|
||||
|
||||
```
|
||||
|
||||
5. **代码理解**
|
||||
|
||||
```plaintext
|
||||
请帮我梳理释 benchmark_fused_moe_i8_tn.py 代码整体框架
|
||||
|
||||
```
|
||||
|
||||
6. **KernelSwift 系统搜索算子**
|
||||
|
||||
|
||||
```plaintext
|
||||
请帮我在算子广场检索 fused_moe 算子
|
||||
|
||||
```
|
||||
```plaintext
|
||||
请帮我在算子广场检索 fused_moe 算子
|
||||
```
|
||||
|
||||
## 八、常见问题与注意事项
|
||||
|
||||
### 算力平台 basline 源码部署项目:
|
||||
### 8.1 算力平台进行 Benchmark 验证:
|
||||
|
||||
1. 环境准备与依赖问题
|
||||
|
||||
* 确保算力平台已正确安装 Python 和 C++、MACA 编译器及相关运行时库,避免因环境缺失导致编译失败;
|
||||
|
||||
* 镜像环境使用 Conda Python 作为默认运行环境,避免系统 Python 与 Conda Python 混用,防止 `Python.h`或 `libpython`路径错误。
|
||||
* 镜像环境使用 Conda Python 作为默认运行环境,避免系统 Python 与 Conda Python 混用,防止 `Python.h`或 `libpython`路径错误。
|
||||
|
||||
2. pybind 编译与链接
|
||||
|
||||
|
|
@ -574,14 +586,14 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|||
|
||||
3. 性能测试建议
|
||||
|
||||
* benchmark 应在关闭其他占用 GPU 的任务后执行,避免干扰性能数据;
|
||||
* benchmark 应在关闭其他占用 GPU 的任务后执行,避免干扰性能数据;
|
||||
|
||||
* 多次运行取平均值,避免单次抖动影响结果;
|
||||
|
||||
* 性能对比应基于相同随机种子、相同 shape、相同 TopK、相同 batch size的条件下进行,降低误差。
|
||||
* 性能对比应基于相同随机种子、相同 shape、相同 TopK、相同 batch size的条件下进行,降低误差。
|
||||
|
||||
|
||||
### Kernel Swift 智能算子迁移系统自动调优项目:
|
||||
### 8.2 Kernel Swift 智能算子迁移系统自动调优项目:
|
||||
|
||||
1. 代码规范问题
|
||||
|
||||
|
|
@ -606,35 +618,24 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|||
* 优化失败时,可尝试更换适配硬件,或调整算子实现逻辑。
|
||||
|
||||
|
||||
## 九、下一步学习建议
|
||||
## 九、XPU-OJ 冒烟提交:从 Benchmark 验证到评测结果
|
||||
|
||||
完成本模块后,建议继续学习以下内容:
|
||||
### 9.1 教程定位
|
||||
|
||||
1. \*\*研读 fused\_moe源码:\*\*理解代码的底层逻辑,可尝试修改 `build_fused_moe_i8_tn_pybind.sh`中的编译参数,观察其对 `avg_ms` 的影响;
|
||||
|
||||
2. \*\*算子优化基础:\*\*了解如何分析 Kernel 性能瓶颈;
|
||||
|
||||
3. \*\*性能对比分析:\*\*将 baseline 结果与优化后的结果进行对比分析,明确后续优化方向。
|
||||
|
||||
|
||||
## 十、XPU-OJ 冒烟提交:从 Baseline 到评测结果
|
||||
|
||||
### 10.1 教程定位
|
||||
|
||||
前面的 Baseline 教程主要帮助你完成三件事:
|
||||
前面的Benchmark 验证教程主要帮助你完成三件事:
|
||||
|
||||
1. 看懂 Fused MoE 算子的输入、输出和计算逻辑;
|
||||
|
||||
2. 在模力方舟环境里跑通本地编译、测试和 benchmark;
|
||||
2. 在模力方舟环境里跑通本地编译、测试和 benchmark 脚本;
|
||||
|
||||
3. 得到一组本地性能基线,方便后续判断优化是否真的有效。
|
||||
|
||||
|
||||
需要特别说明:
|
||||
|
||||
* **Baseline 不是最终提交物。**
|
||||
* Benchmark 不是最终提交物。
|
||||
|
||||
* **XPU-OJ 才是最终评测入口。**
|
||||
* XPU-OJ 才是最终评测入口。
|
||||
|
||||
* XPU-OJ 不会直接运行前面的 benchmark 脚本,而是会调用你提交代码里的 `run_kernel(...)` 函数。
|
||||
|
||||
|
|
@ -643,18 +644,18 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|||
|
||||
| 内容 | 作用 |
|
||||
| --- | --- |
|
||||
| Baseline | 帮你理解算子和建立性能基线 |
|
||||
| Benchmark | 帮你理解算子和建立性能基线 |
|
||||
| Agent | 帮你读代码、写初版、定位错误、迭代优化 |
|
||||
| XPU-OJ | 按统一测试数据评测你的 `run_kernel(...)` |
|
||||
| Candidate | 每一版可提交、可复现的代码结果 |
|
||||
|
||||
完成本节后,你应该能完成一次最小 OJ 提交,确认自己的提交链路是通的。
|
||||
|
||||
### 10.2 学习目标
|
||||
### 9.2 学习目标
|
||||
|
||||
完成本模块后,你将能够:
|
||||
|
||||
1. 理解 Baseline benchmark 和 XPU-OJ 提交之间的区别;
|
||||
1. 理解 benchmark 和 XPU-OJ 提交之间的区别;
|
||||
|
||||
2. 找到 Fused MoE GEMM 题目的接口约定;
|
||||
|
||||
|
|
@ -665,13 +666,13 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|||
5. 根据 OJ 返回的 `Wrong Answer`、`Runtime Error`、`Accepted` 等状态判断下一步动作。
|
||||
|
||||
|
||||
### 10.3 适用对象
|
||||
### 9.3 适用对象
|
||||
|
||||
本模块适合已经完成以下准备的参赛者:
|
||||
|
||||
* 已经进入模力方舟赛事镜像;
|
||||
|
||||
* 已经上传或准备好 Fused MoE baseline 源码;
|
||||
* 已经上传或准备好 Fused MoE 源码;
|
||||
|
||||
* 已经可以在终端里运行基础命令;
|
||||
|
||||
|
|
@ -682,9 +683,9 @@ bash scripts/run_fused_moe_i8_tn_benchmark.sh --backend all --warmup 5 --iters 2
|
|||
|
||||
如果你还没有做过 GPU kernel 优化,也可以先照着本节完成一次冒烟提交。这里的目标不是马上拿高分,而是先确认“我能提交、OJ 能调用我的函数、反馈能回来”。
|
||||
|
||||
### 10.4 前置准备
|
||||
### 9.4 前置准备
|
||||
|
||||
#### 10.4.1 代码准备
|
||||
#### 9.4.1 代码准备
|
||||
|
||||
建议在工作目录下保留一个候选版本目录,例如:
|
||||
|
||||
|
|
@ -701,7 +702,7 @@ oj/problem_1_fused_moe/solution001.py
|
|||
|
||||
真正提交时,只需要把这个文件里的内容复制到 XPU-OJ 提交框。
|
||||
|
||||
#### 10.4.2 账号准备
|
||||
#### 9.4.2 账号准备
|
||||
|
||||
XPU-OJ 账号由组委会统一发放。登录入口:
|
||||
|
||||
|
|
@ -711,9 +712,9 @@ https://xpuoj.com/
|
|||
|
||||
如果登录后看不到比赛或题目,请联系助教或赛事运营确认账号是否已经加入对应比赛或用户组。
|
||||
|
||||
### 10.5 知识预备
|
||||
### 9.5 知识预备
|
||||
|
||||
#### 10.5.1 什么是 OJ
|
||||
#### 9.5.1 什么是 OJ
|
||||
|
||||
OJ 可以理解为“自动评测机”。
|
||||
|
||||
|
|
@ -734,7 +735,7 @@ OJ 可以理解为“自动评测机”。
|
|||
|
||||
所以,OJ 不是让你提交 benchmark 日志,也不是让你提交本地运行截图,而是让你提交一份符合接口约定的代码。
|
||||
|
||||
#### 10.5.2 什么是 Candidate
|
||||
#### 9.5.2 什么是 Candidate
|
||||
|
||||
Candidate 就是一次可复现的候选方案。
|
||||
|
||||
|
|
@ -750,7 +751,7 @@ Candidate 就是一次可复现的候选方案。
|
|||
|
||||
这样后续多次打榜时,不会忘记哪一版代码对应哪一次提交结果。
|
||||
|
||||
### 10.6 项目实践:Fused MoE GEMM OJ 冒烟提交
|
||||
### 9.6 项目实践:Fused MoE GEMM OJ 冒烟提交
|
||||
|
||||
本节以当前 XPU-OJ 题目 **1. Fused MoE GEMM** 为例。
|
||||
|
||||
|
|
@ -882,39 +883,28 @@ oj/problem_1_fused_moe/solution001.py
|
|||
|
||||
#### 步骤 4:提交到 XPU-OJ
|
||||
|
||||
1. 打开 XPU-OJ:
|
||||
|
||||
```text
|
||||
https://xpuoj.com/
|
||||
```
|
||||
1. 打开 XPU-OJ: ```texthttps://xpuoj.com/```
|
||||
|
||||
2. 使用组委会发放的账号登录;
|
||||
|
||||
3. 进入比赛页面;
|
||||
3. 进入比赛页面; [](https://www.picgo.net/image/image6.4ScJM4)
|
||||
|
||||
[](https://www.picgo.net/image/image.13ku6N)
|
||||
|
||||
4. 找到题目:
|
||||
|
||||
```text
|
||||
1. Fused MoE GEMM
|
||||
```
|
||||
4. 找到题目: ```text1. Fused MoE GEMM```
|
||||
|
||||
5. 点击题目进入详情页;
|
||||
|
||||
6. 在提交区域选择本题支持的语言,例如:
|
||||
6. 在提交区域选择本题支持的语言,例如: ```textTriton / Triton Maca```
|
||||
|
||||
```text
|
||||
Triton / Triton Maca
|
||||
```
|
||||
|
||||
```plaintext
|
||||
具体名称以页面下拉框为准。
|
||||
```
|
||||
|
||||
1. 将 `solution001.py` 中的代码复制到提交框;
|
||||
|
||||
具体名称以页面下拉框为准。
|
||||
2. 点击提交;
|
||||
|
||||
7. 将 `solution001.py` 中的代码复制到提交框;
|
||||
|
||||
8. 点击提交;
|
||||
|
||||
9. 等待评测结果返回。
|
||||
3. 等待评测结果返回。
|
||||
|
||||
|
||||
#### 步骤 5:查看 OJ 结果
|
||||
|
|
@ -979,7 +969,6 @@ oj/problem_1_fused_moe/solution001.py
|
|||
|
||||
```python
|
||||
torch.allclose(out_target.float(), out_ref.float(), rtol=0.0, atol=1e-2)
|
||||
|
||||
```
|
||||
|
||||
也就是说,OJ 允许很小的数值误差,但不是随便差一点都能过。
|
||||
|
|
@ -994,26 +983,23 @@ git status --short
|
|||
git add oj/problem_1_fused_moe/solution001.py
|
||||
git commit -m "candidate 001 fused moe i8 tn oj smoke"
|
||||
git tag candidate-001-oj-smoke
|
||||
|
||||
```
|
||||
|
||||
查看最近候选版本:
|
||||
|
||||
```bash
|
||||
git log --oneline --decorate -5
|
||||
|
||||
```
|
||||
|
||||
如果下一轮要继续优化,可以复制一份新文件:
|
||||
|
||||
```bash
|
||||
cp oj/problem_1_fused_moe/solution001.py oj/problem_1_fused_moe/solution002.py
|
||||
|
||||
```
|
||||
|
||||
然后让 Agent 基于 `solution002.py` 继续改。
|
||||
|
||||
### 10.7 Agent 使用说明
|
||||
### 9.7 Agent 使用说明
|
||||
|
||||
本模块中,Agent 主要用来做三件事:
|
||||
|
||||
|
|
@ -1030,7 +1016,6 @@ cp oj/problem_1_fused_moe/solution001.py oj/problem_1_fused_moe/solution002.py
|
|||
第一步:先写一个能过正确性的最小版本。
|
||||
第二步:提交 OJ,看是否 AC。
|
||||
第三步:AC 后再优化性能。
|
||||
|
||||
```
|
||||
|
||||
可以使用下面的 Prompt:
|
||||
|
|
@ -1051,7 +1036,6 @@ cp oj/problem_1_fused_moe/solution001.py oj/problem_1_fused_moe/solution002.py
|
|||
7. 不要添加 torch.Tensor 类型注解
|
||||
8. 不要依赖外部文件
|
||||
9. 请输出完整可复制提交的 Python 代码
|
||||
|
||||
```
|
||||
|
||||
如果 OJ 返回 `Wrong Answer`,可以继续问:
|
||||
|
|
@ -1066,7 +1050,6 @@ OJ 返回 Wrong Answer。
|
|||
4. 是否把结果写入 out,且 dtype 与 out 保持一致。
|
||||
|
||||
请给出最小修改建议。
|
||||
|
||||
```
|
||||
|
||||
如果 OJ 返回 `Runtime Error`,可以问:
|
||||
|
|
@ -1078,10 +1061,9 @@ OJ 返回 Runtime Error。
|
|||
|
||||
请先判断是函数签名、import、RestrictedPython 限制、dtype、shape 还是 GPU 算子调用问题。
|
||||
只给出最小修复方案。
|
||||
|
||||
```
|
||||
|
||||
### 10.8 常见问题
|
||||
### 9.8 常见问题
|
||||
|
||||
#### Q1:为什么本地能跑,OJ 上却 Runtime Error?
|
||||
|
||||
|
|
@ -1092,14 +1074,12 @@ OJ 返回 Runtime Error。
|
|||
```python
|
||||
def silu(x: torch.Tensor) -> torch.Tensor:
|
||||
...
|
||||
|
||||
```
|
||||
|
||||
这种类型注解可能触发:
|
||||
|
||||
```text
|
||||
Access to torch.Tensor is not allowed
|
||||
|
||||
```
|
||||
|
||||
处理方式:去掉 `torch.Tensor` 类型注解。
|
||||
|
|
@ -1147,11 +1127,11 @@ Access to torch.Tensor is not allowed
|
|||
|
||||
不要只看单次结果。每轮都记录,后面才知道 Agent 的修改到底有没有带来收益。
|
||||
|
||||
### 10.9 从 Baseline 到参赛作品的路径回顾
|
||||
### 9.9 从 Benchmark 验证到参赛作品的路径回顾
|
||||
|
||||
建议按下面顺序推进:
|
||||
|
||||
1. 跑通 baseline benchmark,理解算子输入输出;
|
||||
1. 跑通 benchmark 脚本,理解算子输入输出;
|
||||
|
||||
2. 阅读 XPU-OJ 题目页面,确认 `run_kernel(...)` 接口;
|
||||
|
||||
|
|
@ -1169,6 +1149,5 @@ Access to torch.Tensor is not allowed
|
|||
一句话总结:
|
||||
|
||||
```text
|
||||
Baseline 用来学习,OJ 用来评分,Candidate 用来管理每一轮结果。
|
||||
|
||||
Benchmark 验证代码用来学习,OJ 用来评分,Candidate 用来管理每一轮结果。
|
||||
```
|
||||
Loading…
Reference in New Issue