如何为ipcluster与MPI启用超线程?
问题与解决方法
问题描述
我正在用MPI引擎启动IPython集群,在多进程环境下运行Jupyter Notebook,当前使用的命令是:
ipcluster start --engines=MPI -n 6 --profile=mpi
这台机器有6个物理核心,所以上面的命令能正常运行。但我想利用它的12个硬件线程,请问怎么让IPython/ipcluster命令启用超线程——也就是给它调用的mpirun/mpiexec命令传递--use-hwthread-cpus参数?
尝试启动12个引擎时的错误日志
2023-01-06 14:01:35.586 [IPClusterStart] 使用<class 'ipyparallel.cluster.launcher.MPIEngineSetLauncher'>启动12个引擎 2023-01-06 14:01:35.688 [IPClusterStart] 警告 | 引擎组已停止 1673010095: {'exit_code': 1, 'pid': 187667, 'identifier': 'ipengine-1673010095-187622'} 2023-01-06 14:01:35.689 [IPClusterStart] 错误 | 引擎提前关闭,大概率是连接失败。 请检查引擎日志文件查看输出。 如果控制器和引擎不在同一台机器上,你可能需要让控制器监听localhost之外的接口。 可以通过在ControllerLauncher.controller_args中添加"--ip=*"来设置。 在让控制器监听公网接口前,请务必阅读安全文档。 2023-01-06 14:01:35.690 [IPClusterStart] 错误 | 引擎输出: Invalid MIT-MAGIC-COOKIE-1 key-------------------------------------------------------------------------- 系统没有足够的可用slot来满足应用请求的12个slot: /****/venv/bin/python 请减少应用请求的slot数量,或者增加可用slot数量。 "slot"是Open MPI的术语,指可分配用于启动进程的单元。可用slot数量由Open MPI运行的环境决定: 1. 主机文件,通过"slots=N"子句(如果未指定,N默认等于物理核心数) 2. --host命令行参数,通过主机名后的":N"后缀(如果未指定,N默认是1) 3. 资源管理器(如SLURM、PBS/Torque、LSF等) 4. 如果没有主机文件、--host参数或资源管理器,Open MPI默认使用物理核心数 在以上所有情况下,如果你想让Open MPI默认使用硬件线程数而非物理核心数,请使用--use-hwthread-cpus选项。 另外,你也可以使用--oversubscribe选项,在决定启动进程数量时忽略可用slot的限制。 -------------------------------------------------------------------------- 2023-01-06 14:01:35.690 [IPClusterStart] 错误 | IPython集群:正在停止 2023-01-06 14:01:35.691 [IPClusterStart] 正在停止控制器 2023-01-06 14:01:35.691 [IPController] 严重 | 收到信号15,正在关闭 2023-01-06 14:01:35.692 [IPController] 严重 | 正在终止子进程... 2023-01-06 14:01:35.816 [IPClusterStart] 控制器已停止:{'exit_code': 0, 'pid': 187624, 'identifier': 'ipcontroller-187622'} 2023-01-06 14:01:35.816 [IPClusterStart] 正在停止引擎:1673010095
解决方法
要让ipcluster给底层MPI命令传递--use-hwthread-cpus参数,有两种可行方式:
方式1:命令行直接指定
启动集群时,用--engine-args参数把MPI选项传递进去,命令如下:
ipcluster start --engines=MPI -n 12 --profile=mpi --engine-args="--use-hwthread-cpus"
这个参数会将指定的选项转发给mpirun/mpiexec,让Open MPI识别所有硬件线程作为可用slot。
方式2:修改配置文件永久生效
如果需要每次启动都自动启用该参数,可以修改IPython集群的配置文件:
- 找到mpi配置文件目录,通常是
~/.ipython/profile_mpi/ - 编辑
ipcluster_config.py,添加或修改以下配置项:
c.MPIEngineSetLauncher.mpi_args = ["--use-hwthread-cpus"]
保存后,直接用ipcluster start --engines=MPI -n 12 --profile=mpi启动即可。
注意:虽然可以用--oversubscribe参数强制绕过slot限制,但这种方式可能导致性能下降,优先推荐使用--use-hwthread-cpus来正确识别硬件线程。
内容的提问来源于stack exchange,提问作者weidler
相关产品推荐
相关产品推荐

