本教程详细说明如何在 NVIDIA H20 GPU 上运行 DeepEP replay benchmark。
目录
环境配置
硬件要求
- NVIDIA H20-3e GPU (8卡)
- CUDA 13.0+
- NVLink 连接
软件要求
- Python 3.12
- PyTorch 2.x with CUDA 13.0
- NCCL 2.28.9+ (PyTorch 内置) 或 NCCL 2.30.4+ (系统)
- NVSHMEM
容器信息
- 镜像名称:
deepep-shape-sim:latest - 容器名称:
deepep_exp - 工作目录:
/workspace
NCCL 兼容性问题
问题描述
DeepEP V2 需要使用 NCCL Gin API (如 ncclCommQueryProperties),这些 API 仅在 NCCL 2.19+ 中可用。但 PyTorch 内置的 NCCL 版本可能不包含这些 API,导致符号未定义错误:
1 | ImportError: undefined symbol: ncclCommQueryProperties |
解决方案
我们提供了两种解决方案:
方案一:使用系统 NCCL (推荐)
通过 LD_PRELOAD 强制加载系统 NCCL 库:
1 | export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libnccl.so.2 |
优点:
- 简单快速
- 无需重新编译
- 使用更新的 NCCL 版本
缺点:
- 需要每次运行时设置环境变量
- 系统和 PyTorch NCCL 版本冲突检查
方案二:修改源码重新编译 (推荐)
修改 DeepEP 源码以兼容旧版 NCCL,详见 Dockerfile 修改部分。
优点:
- 自动适配 NCCL 版本
- 无需手动设置环境变量
- 更加稳定可靠
缺点:
- 需要重新编译 DeepEP
运行 Benchmark
方式一:使用脚本 (推荐)
1 | cd /workspace |
示例:
1 | # 快速测试 |
方式二:直接运行 Python
1 | cd /workspace |
参数说明
--dispatch-input-csv: Dispatch 操作配置文件--combine-input-csv: Combine 操作配置文件--output-csv: 结果输出文件--warmup: 预热迭代次数(默认:5)--iters: 正式测试迭代次数(默认:20)--num-processes: GPU 进程数(默认:8)
输入文件格式
dispatch_input.csv
1 | run_id,hidden,num_experts,num_topk,num_local_experts,num_tokens,tokens_per_rank,tokens_per_expert,x_dtype,timing_us |
字段说明:
tokens_per_rank: 分号分隔的每个 rank 的 token 数量timing_us: 原始 benchmark 的 dispatch 时间(微秒)
combine_input.csv
1 | run_id,hidden,num_experts,num_topk,num_local_experts,num_tokens,tokens_per_rank,tokens_per_expert,has_bias,timing_us |
结果分析
输出文件格式
h20_replay_results.csv:
1 | run_id,num_tokens,hidden,num_experts,num_topk,dispatch_avg_us,dispatch_min_us,dispatch_max_us,combine_avg_us,combine_min_us,combine_max_us,csv_dispatch_timing_us,csv_combine_timing_us |
关键指标
- dispatch_avg_us: Dispatch 平均延迟(微秒)
- dispatch_min_us: Dispatch 最小延迟
- dispatch_max_us: Dispatch 最大延迟
- combine_avg_us: Combine 平均延迟(微秒)
- csv_dispatch_timing_us: 原始 H20 benchmark 的 dispatch 时间
- csv_combine_timing_us: 原始 H20 benchmark 的 combine 时间
性能分析示例
1 | import pandas as pd |
故障排除
问题 1: NCCL 符号未定义
错误信息:
1 | ImportError: undefined symbol: ncclCommQueryProperties |
解决方案:
方案一:设置环境变量
1 | export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libnccl.so.2 |
方案二:重新编译 DeepEP(推荐)
1 | cd /workspace/DeepEP |
问题 2: NCCL 版本冲突
错误信息:
1 | AssertionError: Duplicate NCCL runtime found in the current system |
解决方案:
1 | export EP_SUPPRESS_NCCL_CHECK=1 |
问题 3: CUDA Out of Memory
错误信息:
1 | RuntimeError: CUDA out of memory |
解决方案:
- 减少进程数:
--num-processes 4 - 减少 token 数量
- 增加缓冲区大小
问题 4: NCCL 初始化失败
错误信息:
1 | NCCL error: unhandled system error |
解决方案:
1 | # 检查 NCCL 版本 |
问题 5: 进程卡死
可能原因:
- NCCL 通信死锁
- GPU 之间的同步问题
解决方案:
1 | # 设置 NCCL 超时 |
高级配置
自定义输入数据
创建新的输入 CSV 文件:
1 | import pandas as pd |
启用 RDMA
1 | python3 replay_bench_v1.py \ |
调整 Buffer 大小
修改 replay_bench_v1.py 中的 buffer 计算逻辑:
1 | # 原始计算 |
参考链接
联系方式
如有问题,请联系:
- DeepEP 问题: GitHub Issues
- 本实验问题: 查看
/workspace/README_H20_REPLAY.md