我正在使用 Python 多重处理,然后使用 sbatch 提交作业。 .sh代码如下:
#!/bin/bash
##----------------------- Start job description -----------------------
#SBATCH --partition=standard
#SBATCH --job-name=multi_Leaspy
#SBATCH --nodes=1
#SBATCH --ntasks=40
#SBATCH --mem-per-cpu=4096
#SBATCH --time=160:00:00
#SBATCH --mail-type=ALL
#SBATCH --output=out-%j.log
#SBATCH --error=err-%j.log
##------------------------ End job description ------------------------
这是我并行化代码的片段:
num_workers = ntasks = int(os.environ.get('SLURM_NTASKS', 1))
if __name__ == "__main__":
with ProcessPoolExecutor(max_workers = num_workers - 1) as executor:
arg_list = [(i, row, df_test, id_test, btstrp, classes, classes_auc,
results_table, MAE_table, features_set, vector_range) for i, row in feat_sub.iterrows()]
for result, MAE_row in executor.map(multiLeaspyIter, arg_list):
if result is not None and MAE_row is not None:
results_table = results_table.append(result, ignore_index=True)
MAE_table = MAE_table.append(MAE_row, ignore_index = True)
然后,我通过 ssh 和 htop 查看资源利用率,并且执行进程数多于请求的进程数。此外,还会出现许多等待过程,从而减慢一切。
h 顶级结果:
任务 = 1627,第 501 个,正在运行 40 个 平均负载 = 201.3, 180.94, 117.36
每个节点有 40 个 cpu,启用超线程。
以前,我使用的是 ProcessPoolExecutor,相同的代码,而且速度要慢得多。
我不确定多重处理是否适合 slurm 环境,或者我遗漏了一些东西。
以前,我使用的是 ProcessPoolExecutor,相同的代码,而且速度较慢。
当我将 .sh 配置为 --ntasks = 1 并将 .py 配置为 max_workers = 1 时,代码运行得更快。如果 --ntasks = 5 且 max_workers = 5,它会变慢并创建额外的等待进程。
除此之外,我注意到只有 1 个进程,就创建了许多线程。
我在 Windows 上尝试过相同的代码,速度更快。
htop 显示登录节点上的作业,而您应该查询执行节点,请使用
squeue -u $USER
或适当的东西