Python如何在LSF分配我4核的集群上看到12个CPU?
我在一个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(负载共享框架)没有操作系统级别的钩子来强制执行这个规则,而且可能也不应该有。
以前我见过用一个包装脚本来处理这个问题。这个脚本可以同时设置程序和作业的相关参数,然后再启动它。