工作原理
目录
工作原理¶
调度器和作业¶
Dask-jobqueue 在实例化集群对象的 Python 进程中创建一个 Dask 调度器
cluster = PBSCluster( # <-- scheduler started here
cores=24,
memory='100GB',
shebang='#!/usr/bin/env zsh', # default is bash
processes=6,
local_directory='$TMPDIR',
resource_spec='select=1:ncpus=24:mem=100GB',
queue='regular',
account='my-account',
walltime='02:00:00',
)
这些参数指定的是一个单个作业或一个单个计算节点的特性,而不是整个计算的特性。它实际上还没有启动任何作业。对于完整的计算,您将使用 scale
命令请求一定数量的作业
cluster.scale(jobs=2) # launch 2 jobs, each of which starts 6 worker processes
cluster.scale(cores=48) # Or specify cores or memory directly
cluster.scale(memory="200 GB") # Or specify cores or memory directly
您可以指定作业的数量,或者您想要的总核心数或总内存数。
集群生成一个传统的作业脚本,并将其以适当的次数提交到作业队列。您可以按如下方式查看它将生成的作业脚本
>>> print(cluster.job_script())
#!/usr/bin/env zsh
#PBS -N dask-worker
#PBS -q regular
#PBS -A P48500028
#PBS -l select=1:ncpus=24:mem=100G
#PBS -l walltime=02:00:00
/home/username/path/to/bin/dask-worker tcp://127.0.1.1:43745
--nthreads 4 --nworkers 6 --memory-limit 18.66GB --name dask-worker-3
--death-timeout 60
每个作业都会独立发送到作业队列,一旦作业启动,就会启动一个 dask-worker 进程并连接回在此进程中运行的调度器。
如果作业队列很忙,那么 worker 可能需要一段时间才能启动,或者并非所有 worker 都能到达。在实践中我们发现,因为 dask-jobqueue 提交的是许多小作业而不是一个大作业,所以 worker 通常能相对快速地启动。但这将取决于您集群的作业队列的状态。
当集群对象消失时,无论是因为您删除了它还是因为您关闭了 Python 程序,它都会向 worker 发送一个信号以关闭。如果由于某种原因该信号未能送达,那么 worker 在等待不存在的调度器 60 秒后将自行终止。
Worker 与 Job¶
在 dask-distributed 中,Worker
是 dask Cluster
中的一个 Python 对象和节点,有两个用途:1) 提供数据,2) 执行计算。Jobs
是提交到并由作业排队系统(例如 PBS、SGE 等)管理的资源。在 dask-jobqueue 中,一个 Job
可能包含一个或多个 Workers
。