【微知】mpirun常见参数作用?(mca:Modular Component Architecture;-np 进程数;btl Byte Transfer Layer;openib IB组件)

背景

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 数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值