目前,我使用dask_jobsquee来并行化我的代码,当工作人员数量很大时,我很难快速建立集群。
当我扩大工作人员的数量(比如说超过2000人)时,集群需要15分钟才能准备就绪。考虑到我在这里需要这么多工人,我理解这需要一些时间,但我想知道是否有办法加快速度。
(我还试图释放gil,以便使用线程,但尚未成功。在这里,我想知道是否有一种方法可以在不使用线程的情况下加快安装速度)
我的群集设置看起来像
from dask_jobqueue import SLURMCluster
cluster = SLURMCluster(cores = 256,
memory = '252 GB',
interface='ib0',
processes = 128,
death_timeout = '2000', #originally 60 sec. this is too short and workers would die.
walltime = '01:00:00',
job_extra = ['--partition=<****>'],
local_directory = '/tmp', #use compute nodes' local
log_directory = '<****>',
scheduler_options={"dashboard_address": ":8786"},
env_extra = ['module purge',
'module load Compilers/GCC/8.2.0 MPI/EPYC/OpenMPI/4.0.2/GCC/8.2.0 Python/3.7.6 Anaconda/3.7',
'export MKL_NUM_THREADS=1',
])
cluster.job_cls.submit_command = 'ssh <login node> sbatch' # I'm not allowed to throw a job from a compute node
,它生成一个脚本,如
# !/usr/bin/env bash
# SBATCH -J dask-worker
# SBATCH -e <local_log>/dask-worker-%J.err
# SBATCH -o <local_log>/dask-worker-%J.out
# SBATCH -n 1
# SBATCH --cpus-per-task=256
# SBATCH --mem=235G
# SBATCH -t 01:00:00
# SBATCH --partition=<***>
module purge
module load Compilers/GCC/8.2.0 MPI/EPYC/OpenMPI/4.0.2/GCC/8.2.0 Python/3.7.6 Anaconda/3.7
export MKL_NUM_THREADS=1
echo $PATH
<python> -m distributed.cli.dask_worker tcp://***.**.***.**:<port> --nthreads 2 --nprocs 128 --memory-limit 1.83GiB --name dummy-name --nanny --death-timeout 2000 --local-directory /tmp --interface ib0 --protocol tcp://
然后我将集群放大到20个节点,
cluster.scale(128*20)
集群准备就绪需要15分钟以上。
工人数量为128(1个节点),大约需要一分钟。
distributed.yaml具有以下设置。
distributed:
worker:
multiprocessing-method: fork #speed up a bit
use-file-locking: True #did not change the time
admin:
tick:
limit: 30s # otherwise the I get many warnings in the log files
1条答案
按热度按时间yizd12fk1#
这并不理想,但当与如此大量的工人一起工作时,可能更容易从外部请求工人(不使用
dask_jobqueue
). 这里的工作流将是一个bash脚本,用于提交开始于单个工人的作业。工人们需要知道在哪里连接,让他们知道的一种方法是写下连接的内容
client.scheduler_info()
并告诉工作人员使用该文件获取有关调度程序连接的信息(--scheduler-file my_file.json
).