Python如何在LSF分配我4核的集群上看到12个CPU?

2 投票
3 回答
1310 浏览
提问于 2025-04-17 02:27

我在一个Linux集群上工作,这里使用LSF来分配资源。我觉得LSF是一个常用的工具,来自Scali公司(http://www.scali.com/workload-management/high-performance-computing)。在一个交互式队列中,我申请了最多4个核心,并且得到了这个数量。但是,当我检查Python的多进程模块能看到多少个CPU时,发现是12个,这个数字是我被分配到的节点上实际的物理核心数量。看起来多进程模块在遵循LSF应该或可能施加的限制方面存在问题。这是LSF的问题,还是Python的问题呢?

[lsandor@iliadaccess03 peers_prisons]$ bsub -Is -n 4 -q interact sh
Job <7408231> is submitted to queue <interact>.
<<Waiting for dispatch ...>>
<<Starting on heroint5>>
sh-3.2$ python3
Python 3.2 (r32:88445, Jun 13 2011, 09:20:03) 
[GCC 4.3.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import multiprocessing
>>> 
>>> multiprocessing.cpu_count()
12

3 个回答

0

如果你在使用 lsf 提交任务时,选择了 -n 选项来指定你需要多少个处理器,然后通过使用 span 来请求这四个处理器在同一台主机上可用,像下面这个命令:

bsub -n 4 -R "span[hosts=1]" my_job

那么我的任务就会在启动时设置一些环境变量,你可以在你的 Python 脚本中读取这些变量,以便将要启动的子进程数量设置为 LSF 分配的数量:

LSB_HOSTS= "hostA hostA hostA hostA"
LSB_MCPU_HOSTS="hostA 4" 

(或者说,子进程的数量应该是 LSF 分配的处理器数量减去 1,因为要留一个给启动子进程的 Python 脚本使用 :-)

1

虽然来得有点晚,但我想补充一下@Paddy3118的回答,其实不需要指定span。相反,环境变量 LSB_DJOB_NUMPROC 存储了分配的核心数量。至少在我使用的LSF版本(9.1.2)中是这样的。

1

没问题,不过你的程序应该遵循排队系统分配给它的资源量,这个量可能远远少于100%,你已经意识到了这一点。我觉得LSF(负载共享框架)没有操作系统级别的钩子来强制执行这个规则,而且可能也不应该有。

以前我见过用一个包装脚本来处理这个问题。这个脚本可以同时设置程序和作业的相关参数,然后再启动它。

撰写回答