我在群集上使用多处理,使用具有20个核心的单个节点。虽然我只保留10个cpus(Slurm中的-n 1和-c 10)并且多处理池以8个工作程序启动,但我在集群监视器(Ganglia监视器)中看到负载超过了保留的cpus数量。通过此设置,我将在节点中加载大约30个过程。
我不明白为什么我得到的进程多于我实例化的工作者数量。如果我保留20个cpu并且让Pool自动设置工作者数量,并且进程数量跳到大约100,则问题更严重。现在真正的问题是代码无法在这种情况下运行,因为管理员取消了设置的任务比节点中的cpus数量更多的进程(几个小时后)。
我的代码基本上解决了一个可以通过独立块解决的大型线性代数问题,它的结构是这样的:
import pandas as pd
import numpy as np
import multiprocessing as mp
class storer:
res = pd.DataFrame(columns=['A','B',...])
def job(manuf, week):
# Some intensive job using the global data
# an np.linalg
return res
def child_initialize(_data):
global data
data = _data
def err_handle(err):
raise err
def join_results(job_res):
storer.res = storer.res.append(job_res, ignore_index=True)
def run_jobs(data, grid, output_file):
pool = mp.Pool(8, initializer=child_initialize,
initargs=(data, ))
for idx, row in grid.iterrows():
pool.apply_async(job,
args=(row[0], row[1]),
callback = join_results, error_callback=err_handle)
pool.close()
pool.join()
storer.res.to_csv(output_file)
return True
if __name__=="__main__":
#get data, grid, and output_file from sys.argv and from some csv
run_jobs(data, grid, output_file)