跳到主要内容

起飞检查:单机与双机训练环境验证

本文用于超大规模训练任务启动前的环境验收:在 1 台或 2 台 8 卡机器上,确认 GPU、机内互联、PCIe、RDMA 和 MCCL 集合通信是否可用。检查全部通过后,再扩展到多机和大规模任务,可以避免把硬件或网络问题带进正式训练。

本文只覆盖单机与双机的连通性验证,不提供吞吐量、MFU、训练耗时等性能指标,也不替代大规模集群巡检和自动隔离。

建议严格按以下顺序执行:基础状态 → 拷贝链路 → 机内互联 → 网络与 RDMA → 单机集合通信 → 双机 AllReduce。前一步失败时,先修复再继续,不要把多个层级的故障混在一起排查。

本文中的命令分为两类:标注“宿主机执行”的命令在 Docker 宿主机运行,其余命令默认在训练容器内执行。带有 <...> 的内容必须替换为当前环境的实际值。

1. 前置条件​

  • 每台机器 8 张 GPU,且 GPU 必须空闲。存在残留训练或推理进程时,拷贝和 MCCL 测试结果不可信。
  • Docker 默认 runtime 为 mthreads,或启动容器时显式指定 --runtime=mthreads。
  • 本文使用 TrainingSuite v2.1.7 镜像 registry.mthreads.com/mcconline/training-suite:v2.1.7。启动前请确认当前环境可以访问该镜像仓库。
  • 准备好机器管理面 IP,以及用于 MPI / RoCE 的训练网卡名称。本文示例使用 bond0,实际网卡名以机器输出为准。

每台机器启动一个检查容器(宿主机执行):

docker run -it --rm \
--runtime=mthreads \
--privileged \
--network=host \
--ipc=host \
--name hw-check \
registry.mthreads.com/mcconline/training-suite:v2.1.7 \
bash

--network=host 用于让容器看到宿主机的 RDMA 网卡;--ipc=host 便于单机多进程共享 GPU 通信。镜像已配置好 /usr/local/musa/bin、/usr/local/musa/mccl_test 和 /usr/local/openmpi/bin 等路径,如果当前镜像未配置,需要手动补充 PATH 和 LD_LIBRARY_PATH。

2. 单机基础状态​

2.1 检查 GPU 是否可查询​

在容器内执行:

timeout 30 mthreads-gmi -q >/dev/null && echo PASS_GMI
timeout 30 musaInfo >/dev/null && echo PASS_MUSAINFO
mthreads-gmi -L
musaInfo | grep -c pciBusID

通过标准:

  • 两条命令都能在 30 秒内返回。
  • mthreads-gmi -L 列出 8 张 GPU。
  • pciBusID 的行数为 8。

如果命令卡住或超时,优先排查驱动和 GPU 管理接口,不要继续执行后续压测。

2.2 检查 GPU 是否空闲​

mthreads-gmi

查看输出中的 Processes: 段。除偶发的系统占位进程外,不应存在业务进程。发现训练、推理或其他占用 GPU 的进程时,先停止这些进程,再继续后面的检查。

2.3 记录版本与显存​

mthreads-gmi -q | grep -E 'Product Name|MTBios Version'
musa_runtime_version
musaInfo | grep -E 'device#|Name:|pciBusID|memInfo'

需要确认:

  • 8 张卡的型号一致,BIOS 版本一致。
  • musa_runtime_version 能正常输出版本和 commit id。
  • 空闲状态下 memInfo.free 接近 memInfo.total。如果 free 明显偏低,通常说明仍有进程占用显存。

3. 拷贝链路检查​

分别检查 TDM 和 CE 两条拷贝路径。在容器内执行:

MUSA_MEMCPY_PATH=2 muMemcpyTest -f 1024 -t 1024 -s 1 | grep SUCCESS | wc -l
MUSA_MEMCPY_PATH=3 muMemcpyTest -f 1024 -t 1024 -s 1 | grep SUCCESS | wc -l

其中 MUSA_MEMCPY_PATH=2 对应 TDM,MUSA_MEMCPY_PATH=3 对应 CE。

通过标准:两条命令的输出都应为 8。数量不足或命令失败时,检查是否存在掉卡、显存异常或驱动异常。

4. 机内互联与 PCIe 检查​

mthreads-gmi mtlink -s | grep -c 'LINK UP'
mthreads-gmi mtlink -s | grep 'LINK DOWN'

通过标准:

  • LINK UP 数量约为 112(8 卡 × 14 条链路),允许少量偏差,建议不少于 100。
  • 不应出现 LINK DOWN。

4.2 检查 GPU PCIe 链路​

for d in $(lspci -d 1ed5: | awk '{print $1}'); do
echo -n "$d "
lspci -vvv -s "$d" 2>/dev/null | grep LnkSta | head -1
done

通过标准:8 张 GPU 都能读到 LnkSta,状态为 (ok),并且没有 downgraded 或 down。常见正常值为 Speed 32GT/s, Width x16。

5. 网络与 RDMA 检查​

双机训练必须完成本节;单机训练建议执行,用于确认后续多机扩展所需的网络基础。

网卡名和 bond 名因机型而异。以下示例使用 bond0,请替换为实际用于 MPI / RoCE 的网卡。

ibdev2netdev
show_gids | awk 'NR==1 || $3==3'
cat /proc/net/bonding/bond0
ip -4 addr show bond0

通过标准:

  • 训练使用的 RDMA 设备状态为 Up 或 ACTIVE。
  • show_gids 中 INDEX=3 存在 IPv4 地址,后续需要设置 MCCL_IB_GID_INDEX=3。
  • bond 的 MII Status 为 up,slave 没有大面积 down。
  • 双机场景下,两台机器的管理面 IP 和 MPI 面 IP 能互相 ping 通。

ibdev2netdev 中个别备用网口显示 Down 不一定是故障,应以训练实际使用的网卡组为准。

6. 单机集合通信检查​

先为单机生成 hostfile:

echo "$(hostname) slots=8" > /tmp/hostfile
cat /tmp/hostfile

设置 MCCL 环境变量,单机和双机共用:

export MCCL_PROTOS=2
export MCCL_ALGOS=1
export MCCL_IB_GID_INDEX=3
export MCCL_BUFFSIZE=20971520
export MUSA_BLOCK_SCHEDULE_MODE=1
export MUSA_BLOCK_DISTRIBUTION_GRANULARITY=0
export MCCL_IB_QPS_PER_CONNECTION=16
export MCCL_CROSS_NIC=0
export MCCL_IB_TC=136
export MCCL_IB_TIMEOUT=20
export MCCL_IB_RETRY_CNT=7

将 IFACE 设置为第 5 节确认过的训练网卡:

export IFACE=bond0

6.1 单机 All-to-All​

mpirun -hostfile /tmp/hostfile -np 8 \
--allow-run-as-root \
--bind-to none \
--mca btl_tcp_if_include "$IFACE" \
-x LD_LIBRARY_PATH -x PATH \
-x MCCL_PROTOS -x MCCL_ALGOS -x MCCL_IB_GID_INDEX \
-x MCCL_BUFFSIZE -x MUSA_BLOCK_SCHEDULE_MODE \
-x MUSA_BLOCK_DISTRIBUTION_GRANULARITY \
-x MCCL_IB_QPS_PER_CONNECTION -x MCCL_CROSS_NIC \
-x MCCL_IB_TC -x MCCL_IB_TIMEOUT -x MCCL_IB_RETRY_CNT \
alltoall_perf -n 2 -w 1 -b 8M -e 128M -f 2 -g 1 -t 1

6.2 单机 AllReduce​

mpirun -hostfile /tmp/hostfile -np 8 \
--allow-run-as-root \
--bind-to none \
--mca btl_tcp_if_include "$IFACE" \
-x LD_LIBRARY_PATH -x PATH \
-x MCCL_PROTOS -x MCCL_ALGOS -x MCCL_IB_GID_INDEX \
-x MCCL_BUFFSIZE -x MUSA_BLOCK_SCHEDULE_MODE \
-x MUSA_BLOCK_DISTRIBUTION_GRANULARITY \
-x MCCL_IB_QPS_PER_CONNECTION -x MCCL_CROSS_NIC \
-x MCCL_IB_TC -x MCCL_IB_TIMEOUT -x MCCL_IB_RETRY_CNT \
all_reduce_perf -n 2 -w 1 -b 8M -e 128M -f 2 -g 1 -t 1

通过标准:

  • mpirun 退出码为 0。
  • 输出中没有 ERROR。
  • 如果输出包含 Out of bounds values,该计数必须为 0。
  • 输出中存在 Avg bus bandwidth,且带宽明显大于 0。

单机 All-to-All 主要用于验证 GPU 之间的互联,AllReduce 用于确认集合通信库能在本机正常拉起。两项都通过后,再进入双机测试。

7. 双机 AllReduce 检查​

两台机器分别按第 1 节启动同名镜像容器,并先完成第 2~6 节的单机检查。

7.1 配置容器间 SSH​

镜像内 sshd 默认监听 62216 端口,并允许 root 登录。在两台容器内分别执行:

mkdir -p /root/.ssh
chmod 700 /root/.ssh
[ -f /root/.ssh/id_rsa ] || ssh-keygen -t rsa -N '' -f /root/.ssh/id_rsa
mkdir -p /run/sshd
/usr/sbin/sshd

将节点 A 的公钥写入节点 B 的 /root/.ssh/authorized_keys,将节点 B 的公钥写入节点 A,然后设置权限:

chmod 600 /root/.ssh/authorized_keys
ssh -p 62216 -o StrictHostKeyChecking=no root@<对端IP> hostname

两台机器都能免密登录后,再执行 MPI 测试。

7.2 配置双机 hostfile 并执行 AllReduce​

在发起节点上执行:

cat > /tmp/hostfile <<EOF
<NODE_A_IP> slots=8
<NODE_B_IP> slots=8
EOF

其中的 IP 必须是第 5 节确认的、与训练网卡处于同一平面的地址。

export IFACE=bond0
mpirun -hostfile /tmp/hostfile -np 16 \
--allow-run-as-root \
--bind-to none \
--mca plm_rsh_agent "ssh -p 62216" \
--mca btl_tcp_if_include "$IFACE" \
-x LD_LIBRARY_PATH -x PATH \
-x MCCL_PROTOS -x MCCL_ALGOS -x MCCL_IB_GID_INDEX \
-x MCCL_BUFFSIZE -x MUSA_BLOCK_SCHEDULE_MODE \
-x MUSA_BLOCK_DISTRIBUTION_GRANULARITY \
-x MCCL_IB_QPS_PER_CONNECTION -x MCCL_CROSS_NIC \
-x MCCL_IB_TC -x MCCL_IB_TIMEOUT -x MCCL_IB_RETRY_CNT \
all_reduce_perf -n 2 -w 1 -b 8M -e 128M -f 2 -g 1 -t 1

通过标准与单机 AllReduce 相同:退出码为 0、输出无 ERROR、越界值为 0、平均带宽大于 0。

双机失败时,优先依次核对:SSH 端口是否为 62216、hostfile 中的 IP 是否正确、IFACE 是否为训练网卡、MCCL_IB_GID_INDEX 是否为 3,以及两端 GPU 是否空闲。

8. 结果判定​

检查项通过标准常见问题
GPU 查询与数量8 卡,命令不卡死驱动异常、掉卡
GPU 进程无业务占用先停止训练 / 推理
TDM / CE 拷贝各输出 8 次 SUCCESS拷贝引擎或显存异常
mtlink无 LINK DOWN,LINK UP 数量足够机内互联断链
GPU PCIe8 张均为 ok链路降速、掉卡
RDMA / GID训练口 Up,GID 3 有 IPv4网卡、bond、RoCE 配置
单机 All-to-All / AllReduce正确且有带宽GPU 占用、mtlink、MCCL 环境变量
双机 AllReduce正确且有带宽SSH、网卡平面、GID、对端 GPU 占用

9. 失败时的排查顺序​

  1. 先确认 GPU 能查询、数量正确且没有业务进程占用。
  2. 再确认 TDM / CE 拷贝链路正常,排除掉卡和显存异常。
  3. 然后检查 mtlink 和 PCIe,定位机内互联问题。
  4. 单机集合通信失败时,检查 IFACE、MCCL_IB_GID_INDEX 和环境变量是否通过 -x 传入。
  5. 双机失败时,先验证 62216 端口 SSH,再核对 hostfile、IP 平面和两端网络状态。

10. 加压与边界说明​

单机和双机检查通过后,如需提高测试压力,可以逐步将 -e 128M 提高到 512M 或 1024M,将 -n 2 提高到 -n 5。建议先确认小规模连通性,再逐步加压,不要一开始就使用超大消息。

本文覆盖的范围是“这 1 台或 2 台机器能否正常承担训练任务”。大规模集群巡检、节点自动隔离、长时间稳定性测试和性能调优不在本文范围内。

相关文档​