从 MCCL 2.1 迁移到 MCCL 2.3
1. 文档目的
本文用于指导外部用户将 MCCL 从 2.1 版本升级到 2.3 版本,并说明升级收益、兼容性影响、推荐实施步骤、验证方法和回退建议。
本文基于以下版本基线整理:
- 源版本:MCCL 2.1
- 目标版本:MCCL 2.3
2. 升级收益概览
与 2.1 相比,2.3 版本的主要提升如下:
- 对外公共 API 能力增强:新增更完整的通信器管理、故障处理、缓冲区注册和集合通信能力
- 安装、构建、打包和版本查询流程更清晰:便于交付、部署和定位问题
- 对调优和诊断场景的支持增强:版本查询信息更完整,错误反馈更丰富
- 保留常用
MCCL_*运行时环境变量用法:已有调优脚本可以较低成本迁移 - 对外符号收敛到标准 mccl 接口*:降低误用内部符号带来的兼容性风险
3. 升级影响摘要
| 维度 | MCCL 2.1 | MCCL 2.3 | 升级影响 |
|---|---|---|---|
| 版本基线 | 2.1 | 2.3 | 建议按完整版本进行升级验证,不建议仅替换单个 .so 文件 |
| 交付包命名 | mccl_2.1.4-1+musa1.0_... | mccl_2.3-1+musa3.1_... | 2.3 交付默认面向更高版本的 MUSA 软件栈,升级前需确认驱动、Toolkit 与编译环境 |
| 构建入口 | 旧版 benchmark/ + 根目录 setup.sh | 新版 tools/mccl-test/ + setup.sh | 若已有自动化脚本依赖旧目录结构,需要同步调整 |
| 安装内容 | 安装 lib/、include/、cmake/、bin/* | 安装 lib/、include/、cmake/、bin/mccl_version | 若依赖旧包中的其他二进制文件,需重新确认交付内容 |
| 公共头文件 | mccl.h,并带有 mccl_net.h | 扩展后的 mccl.h | 若应用依赖 mccl_net.h 或内部扩展接口,升级前需做兼容性评估 |
| 集合通信接口 | 含 mcclAllToAllv、mcclBatchAllToAllv | 新增 mcclAlltoAll、mcclGather、mcclScatter,移除 mcclAllToAllv、mcclBatchAllToAllv | 使用被移除接口的应用需要修改代码并重新编译 |
| 通信器管理 | 基础初始化/销毁能力 | 新增 Config 初始化、Finalize、Revoke、Split、Shrink、Scalable Init | 大规模训练、容错和通信域拆分场景可获得更强能力 |
| 错误与诊断 | 基础错误字符串和版本查询 | 新增 mcclGetLastError、mcclRemoteError、mcclInProgress,mccl_version 输出更丰富 | 监控、日志和故障排查脚本建议同步适配 |
| 符号可见性 | 历史实现中可能暴露更多非标准符号 | 明确仅对外暴露 mccl* 符号 | 若历史程序绕过公共头文件直接链接内部符号,升级后会失效 |
4. 对应用侧最重要的兼容性变化
4.1 新增的主要能力
2.3 版本新增了以下对外能力:
- 通信器配置初始化:
mcclCommInitRankConfig - 大规模初始化:
mcclCommInitRankScalable - 通信器生命周期管理:
mcclCommFinalize、mcclCommRevoke - 通信域管理:
mcclCommSplit、mcclCommShrink - 缓冲区注册:
mcclCommRegister、mcclCommDeregister - 额外集合通信:
mcclAlltoAll、mcclGather、mcclScatter - 组调用模拟:
mcclGroupSimulateEnd - 更细粒度错误查询:
mcclGetLastError
如果当前应用只使用 AllReduce、Broadcast、ReduceScatter、AllGather、Send/Recv 等常规能力,通常不需要修改业务逻辑即可完成升级验证。
4.2 需要重点排查的兼容性风险
以下情况在升级时需要重点检查:
- 应用使用了
mcclAllToAllv或mcclBatchAllToAllv - 应用直接包含或调用
mccl_net.h相关能力 - 应用通过
dlsym或其他方式访问非mccl*内部符号 - 自动化脚本写死了旧目录,如
benchmark/、pkg/ - 日志分析或运维脚本依赖旧版
mccl_version输出格式
其中最关键的是接口兼容性:mcclAllToAllv 和 mcclBatchAllToAllv 这两个接口在 2.3 对外头文件中不再提供。若用户代码依赖这两个接口,建议结合业务模型改造为:
- 可等量切分场景:优先改造为
mcclAlltoAll - 不等量切分场景:在应用层自行拆分消息或重新设计数据分发逻辑
4.3 运行时环境变量兼容性
2.3 仍保留了常见的 MCCL_* 调优方式,现有脚本一般可继续沿用,例如:
MCCL_PROTOS
MCCL_ALGOS
MCCL_IB_GID_INDEX
MCCL_NET_SHARED_BUFFERS
5. 升级前准备
建议在正式升级前完成以下检查:
- 确认目标环境已安装并验证 MUSA 驱动、MUSA Toolkit、mtml
- 多机场景确认 MPI 运行环境已就绪,推荐提前验证
mpirun --version - 若使用 IB 或 RoCE,先通过
ibstat等命令确认链路状态正常 - 备份现网使用中的 MCCL 2.1 安装目录、交付包和启动脚本
- 盘点业务代码中是否使用了已移除接口、内部符号或旧路径
6. 推荐升级方式
建议采用 "并行安装 + 验证通过后切换" 的方式,而不是直接覆盖旧版本。
6.1 解压交付包
tar -Jxvf mccl_2.3+mp_<arch>.txz
cd mccl_2.3+mp_<arch>
6.2 安装到独立目录
./install.sh -d /opt/mccl/2.3
export LD_LIBRARY_PATH=/opt/mccl/2.3/lib:$LD_LIBRARY_PATH
export PATH=/opt/mccl/2.3/bin:$PATH
这样可以保留旧版 2.1 安装目录,便于验证失败时快速回退。