MPI绑定进程数超CPU数报错:OpenAI HER训练脚本运行问题
这个MPI绑定错误我之前在跑HER(Hindsight Experience Replay)训练的时候也碰到过,本质是MPI试图分配的进程数超过了你机器实际可用的CPU核心数,或者绑定规则和系统的CPU配置不匹配。下面给你几个可行的解决办法:
1. 核对CPU核心数与--num_cpu参数的匹配性
首先确认你机器的实际可用CPU核心数,在终端运行:
lscpu
查看输出里的CPU(s)字段,这是你机器的总核心数。
OpenAI Baselines中--num_cpu参数指定的是用于环境采样的worker进程数,每个worker默认会占用一个CPU核心。所以你需要确保--num_cpu的值不超过机器的总核心数(比如你机器是4核,就不要设成5或更高)。如果之前设1-4能跑,现在报错大概率是你设置的数值超过了核心数,或者有其他进程占用了核心导致可用数不足。
2. 调整MPI的超订阅与绑定策略
如果确实需要用超过核心数的进程数(比如做测试),可以通过设置MPI环境变量允许超订阅:
export OMPI_MCA_rmaps_base_oversubscribe=1
然后再运行你的训练脚本,这个变量会让MPI忽略进程数超过核心数的限制,由系统调度CPU资源。
另外,也可以禁用MPI的严格CPU绑定策略,避免绑定冲突:
export OMPI_MCA_hwloc_base_binding_policy=none
同样在启动脚本前执行这个命令即可。
3. 检查MPI启动命令的进程数设置
有些HER训练脚本会用mpirun或mpiexec启动,比如脚本里可能默认指定了进程数-np,如果这个数值加上--num_cpu的worker数超过了核心数,也会触发错误。比如如果启动命令是:
mpirun -np 2 python train.py --num_cpu=4
总进程数(2个主进程+4个worker)就可能超过你的4核限制,这时可以调整-np的数值,比如改成-np 1,或者降低--num_cpu的值。
4. 排查系统层面的CPU限制
有时候系统的CPU亲和性设置或cgroup会限制进程可用的CPU核心,你可以用以下命令查看当前shell的CPU亲和性:
taskset -p $$
如果输出显示可用CPU被限制在部分核心,你可以用taskset命令调整训练脚本的可用CPU,比如允许使用所有核心:
taskset -c 0-3 python train.py --num_cpu=4
(其中0-3对应你的4个核心编号,根据lscpu的输出调整)
另外,也可以用top或htop查看是否有其他进程占用了大量CPU资源,导致可用核心不足。
内容的提问来源于stack exchange,提问作者ComputerScientist

