背景
mpirun 是 OpenMPI 的一个工具,用于启动并行程序。它负责启动多个进程,并在这些进程之间建立通信。mpirun常见参数记录。
- MPI 是 Message Passing Interface ,“消息传递接口”。MPI 是一种标准化的并行计算通信协议,用于在分布式内存系统中实现进程间通信。它允许开发者编写可扩展的并行程序,这些程序可以在多台计算机(或多个进程)之间高效地传递数据。
- MPI 是一个标准协议,有多种实现,常见的包括:
MPICH:一个开源的 MPI 实现,广泛用于学术和研究领域。
OpenMPI:另一个流行的开源 MPI 实现,支持多种通信后端(如 TCP、InfiniBand 等)。
Intel MPI:由英特尔提供的高性能 MPI 实现,优化了英特尔硬件。
MVAPICH:针对 InfiniBand 和其他高性能网络优化的 MPI 实现。- mpirun 是 MPI 实现中的一个工具,用于启动并行程序。它负责:
- 启动多个进程。(-np)
- 配置进程间的通信环境。(NCCL_xxx=xxx)
- 管理进程的执行和同步。
常见参数
一条简单命令:mpirun -np 2 --allow-run-as-root --mca btl openib,self,vader --mca btl_openib_if_include mlx5_0,mlx5_1 --mca btl_openib_cpc_include rdmacm -x NCCL_SOCKET_IFNAME=enp1s0f0 ./build/all_reduce_perf -b 8 -e 128M -f 2 -g 1 -c 0
-np
: Number of processes to run 运行的进程数, 比如 -np 2。每个进程通常对应一个计算节点(例如一个 CPU 核心或一个 GPU 卡)。--allow-run-as-root
: 允许在root权限运行mpirun。 Allow execution as root (STRONGLY DISCOURAGED)--mca
:设置模块化组件架构(Modular Component Architecture)的参数。btl
:表示 Byte Transfer Layer(字节传输层),是 OpenMPI 中用于进程间通信的底层传输机制。openib,self,vader
:指定要启用的 BTL 组件:
openib:启用 InfiniBand 支持,用于高性能通信。
self:启用进程内通信(适用于单个节点上的进程间通信)。
vader:启用共享内存通信(适用于同一主机上的进程间通信)。
--mca btl_openib_if_include mlx5_0,mlx5_1
指定 InfiniBand 接口(设备)。告诉 OpenMPI 使用哪些 InfiniBand 设备进行通信。在这个例子中,mlx5_0 和 mlx5_1 是两个 InfiniBand 设备的名称。openib是btl的一个组件。这里是btl_opib中用来指定interface的包含--mca btl_openib_cpc_include rdmacm
指定 InfiniBand 的连接提供者(Connection Provider)。rdmacm 是连接提供者,管理 InfiniBand 网络中的连接。指定 OpenMPI 使用 rdmacm 来建链-x NCCL_SOCKET_IFNAME=enp1s0f0
-x 将环境变量传递给 mpirun 启动的进程。NCCL_SOCKET_IFNAME:环境变量, NCCL(NVIDIA Collective Communications Library)库,指定通信接口,与IB绑定的以太网接口。这里是让all_reduce_perf使用的环境变量。 一般会指定多个 -x在多行进行指定环境变量,比如 -x NCCL_IB_DISABLE=1、-x NCCL_DEBUG=INFO等--hostfile plistfile
指定iplist的文件- ./build/all_reduce_perf 要运行的可执行程序的路径。
-b 8 -e 128M -f 2 -g 1 -c 0
传递给 all_reduce_perf 程序的参数
[root@one build]# ./all_reduce_perf --help
USAGE: all_reduce_perf
[-t,–nthreads ]
[-g,–ngpus ] 每个线程的 GPU 数,默认值为 1
[-b,–minbytes ] 最小字节数,这里是8字节。默认值为 32M
[-e,–maxbytes ] 最大字节数,这里是128M的数据。默认值为 32M
[-i,–stepbytes ]
[-f,–stepfactor ]
[-n,–iters ]
[-m,–agg_iters ]
[-w,–warmup_iters ]
[-N,–run_cycles run & print each cycle (default: 1; 0=infinite)]
[-p,–parallel_init <0/1>]
[-c,–check ] 检查数量的间隔
[-o,–op <sum/prod/min/max/avg/mulsum/all>]
[-d,–datatype <nccltype/all>]
[-r,–root ]
[-z,–blocking <0/1>]
[-y,–stream_null <0/1>]
[-T,–timeout
一些例子
mpirun -np 64 -N 8 ./build/all_reduce_perf -b 8 -e 8G -f 2 -g 1
64 MPI 进程在 8 节点运行:每个节点有 8 个 GPU,共 64 个 GPU./build/all_reduce_perf -b 8 -e 128M -f 2 -g 8
单节点 8 GPU 运行:扫描从 8 字节到 128MB 的数据./build/all_reduce_perf -b 4k -e 8G -f 2 -g 8
单节点 8 GPU 运行:扫描从 4k 字节到 8G 的数据./build/all_reduce_perf -b 16 -e 64M -f 2 -g 4 -n 10
扫描从 16 字节到 64MB 的数据,每个线程使用 1 个 GPU,且进行 10 次迭代mpirun -np 2 ./build/all_reduce_perf -t 2 -g 2 -b 32 -e 256M -f 2
单节点 2 进程,每个进程 2 线程,每个线程 2 GPU 运行
其他
- NCCL 测试可以在多个进程、多个线程以及每个线程使用多个 CUDA 设备的环境下运行。进程数量由 MPI 管理,不通过参数传递给测试程序。总的 rank 数量(即 CUDA 设备数量)= 进程数 × 线程数 × 每个线程的 GPU 数。