Dask-Jobqueue

轻松将 Dask 部署到 PBS、Slurm、MOAB、SGE、LSF 和 HTCondor 等作业排队系统上。

dask-jobqueue 项目使在高性能超级计算机、学术研究机构和其他集群中常见的作业排队系统上部署 Dask 变得容易。

Dask 在 HPC 上有两种常见的部署模式:动态集群批处理运行器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 工作负载的典型做法。

  • 作业开始时保证所有工作节点都可用,这可以避免工作节点超额订阅。

  • 由一个大型分配组成的集群通常比许多小型分配组成的集群更可靠。

  • 所有进程具有相同的开始时间和墙钟时间。

要了解更多信息,请参阅批处理运行器文档