部署示例

在不同的集群上部署 dask-jobqueue 需要进行一些定制。下面,我们提供了一些来自实际部署的例子

欢迎提供其他集群的更多示例,请访问此处

PBS 部署

from dask_jobqueue import PBSCluster

cluster = PBSCluster(queue='regular',
                     account='DaskOnPBS',
                     local_directory='$TMPDIR',
                     cores=24,
                     processes=6,
                     memory='16GB',
                     resource_spec='select=1:ncpus=24:mem=100GB')

cluster = PBSCluster(cores=24,
                     processes=6,
                     shebang='#!/usr/bin/env zsh',
                     memory="6GB",
                     account='P48500028',
                     queue='premium',
                     resource_spec='select=1:ncpus=36:mem=109G',
                     walltime='02:00:00',
                     interface='ib0')

Moab 部署

在使用 Moab Workload Manager 的系统上,可以使用 PBSCluster 的子类 MoabCluster

import os
from dask_jobqueue import MoabCluster

cluster = MoabCluster(
    cores=6,
    processes=6,
    account="gfdl_m",
    memory="16G",
    resource_spec="pmem=96G",
    job_extra_directives=["-d /home/First.Last", "-M none"],
    local_directory=os.getenv("TMPDIR", "/tmp"),
)

SGE 部署

在使用 SGE 作为调度器的系统上,可以使用 SGECluster。请注意,Grid Engine 有一段稍显复杂的历史,因此存在多种 Grid Engine 衍生版本。SGECluster 可用于 Grid Engine 的任何衍生版本,例如:SGE (Son of Grid Engine)、Oracle Grid Engine、Univa Grid Engine。

由于 Grid Engine 衍生版本和配置部署的多样性,无法使用 memory 关键字参数自动指定请求的 RAM 量。相反,您需要根据系统的配置方式,使用 resource_spec 关键字参数指定所需的资源,此外还需要使用 memory 关键字参数(Dask 内部用于内存管理,更多详细信息请参阅此处)。

在下面的示例中,我们的系统管理员使用了 m_mem_free 关键字参数来让我们请求 RAM。其他已知关键字可能包括 mem_reqmem_free。我们需要查阅集群文档和/或咨询系统管理员以获取此信息。同时,我们还必须正确指定 memory 关键字参数,以便 Dask 的内存管理能够正常工作。

from dask_jobqueue import SGECluster

cluster = SGECluster(queue='default.q',
                     walltime="1500000",
                     processes=10,   # we request 10 processes per worker
                     memory='20GB',  # for memory requests, this must be specified
                     resource_spec='m_mem_free=20G',  # for memory requests, this also needs to be specified
                     )

LSF 部署

from dask_jobqueue import LSFCluster

cluster = LSFCluster(queue='general',
                     project='cpp',
                     walltime='00:30',
                     cores=15,
                     memory='25GB')

SLURM 部署

from dask_jobqueue import SLURMCluster

cluster = SLURMCluster(cores=8,
                       processes=4,
                       memory="16GB",
                       account="woodshole",
                       walltime="01:00:00",
                       queue="normal")

SLURM 部署:低优先级节点使用

from dask_jobqueue import SLURMCluster

cluster = SLURMCluster(
    cores=24,
    processes=6,
    memory="16GB",
    account="co_laika",
    queue="savio2_bigmem",
    job_script_prologue=[
        'export LANG="en_US.utf8"',
        'export LANGUAGE="en_US.utf8"',
        'export LC_ALL="en_US.utf8"',
    ],
    job_extra_directives=['--qos="savio_lowprio"'],
)

SLURM 部署:为 dask-worker 提供额外的参数

关键字参数可以传递给 dask-worker。一个这样的参数是用于指定抽象资源,此处对此进行了描述。这可用于指定调度器不知道的特殊硬件可用性,例如 GPU。下面指定了任意资源“ssdGB”和“GPU”。请注意,使用 worker_extra_args 关键字将参数传递给 dask-worker。

注意:参数 worker_extra_args 在版本 0.7.4 之前被命名为 extraextra 仍然可以使用,但已被视为弃用,并将在未来版本中移除。

from dask_jobqueue import SLURMCluster
from distributed import Client
from dask import delayed

cluster = SLURMCluster(
    memory="8g", processes=1, cores=2, worker_extra_args=["--resources ssdGB=200,GPU=2"]
)

cluster.scale(2)
client = Client(cluster)

然后客户端可以正常使用。此外,可以在处理的某些步骤中指定所需的资源。例如

def step_1_w_single_GPU(data):
    return "Step 1 done for: %s" % data


def step_2_w_local_IO(data):
    return "Step 2 done for: %s" % data


stage_1 = [delayed(step_1_w_single_GPU)(i) for i in range(10)]
stage_2 = [delayed(step_2_w_local_IO)(s2) for s2 in stage_1]

result_stage_2 = client.compute(stage_2,
                                resources={tuple(stage_1): {'GPU': 1},
                                           tuple(stage_2): {'ssdGB': 100}})