Dask-Jobqueue
目录
Dask-Jobqueue¶
轻松地在 PBS、Slurm、MOAB、SGE、LSF 和 HTCondor 等作业排队系统上部署 Dask。
dask-jobqueue
项目使得在高性能超级计算机、学术研究机构和其他集群中常见的作业排队系统上部署 Dask 变得容易。
在 HPC 上部署 Dask 有两种常见的模式:动态集群和批量运行器,dask-jobqueue
对这两种模式都提供了支持。
动态集群¶
动态集群是一种 Dask 集群,其中可以在集群运行时动态添加新的工作器。
在 HPC 环境中,这通常意味着 Dask 调度器与客户端代码在同一位置运行,通常在单个计算节点上。然后 Dask 集群的工作器作为附加作业提交到作业队列调度器。
这种模式适用于提交许多小作业更有利的集群。
srun -n 1 dynamic_workload.py
# dynamic_workload.py
from dask_jobqueue.slurm import SLURMCluster
cluster = SLURMCluster()
cluster.adapt(minimum=1, maximum=10) # Tells Dask to call `srun -n 1 ...` when it needs new workers
from dask.distributed import Client
client = Client(cluster) # Connect this local process to remote workers
import dask.array as da
x = ... # Dask commands now use these distributed resources
优点
集群可以随着工作负载的进展而自动扩展。
HPC 中原本未被利用的小空隙可以被回填。
工作负载在繁忙时段可以以少量工作器缓慢运行,然后在空闲时段扩展。
交互式环境中的工作负载可以随着用户手动运行代码而扩展和收缩。
您无需等待所有节点都可用后才开始工作负载,因此作业通常会更快启动。
要了解更多信息,请参阅动态集群文档。
批量运行器¶
批量运行器是一种 Dask 集群,其中整个工作负载,包括客户端代码、调度器和工作器,作为一个整体分配提交到作业队列调度器。工作负载中的所有进程在启动期间协调,然后一起计算 Dask 工作负载。
这种模式适用于优先处理大型作业且节点局部性很重要的场景。
srun -n 12 python batch_workload.py
# batch_workload.py
from dask_jobqueue.slurm import SLURMRunner
cluster = SLURMRunner() # Boostraps all the processes into a client + scheduler + 10 workers
# Only the client process will continue past this point
from dask.distributed import Client
client = Client(cluster) # Connect this client process to remote workers
import dask.array as da
x = ... # Dask commands now use these distributed resources
优点
工作器通常物理上位于同一机器上,因此通信更快,特别是结合 UCX 使用时。
在某些 HPC 上,提交许多小作业可能不受欢迎,提交单个大作业更符合其他 HPC 工作负载的典型模式。
所有工作器在作业开始时都保证可用,这可以避免工作器超额预订。
由一个大型分配组成的集群往往比许多小型分配组成的集群更可靠。
所有进程具有相同的启动时间和壁钟时间。
要了解更多信息,请参阅批量运行器文档。