Dask-MPI 与交互式作业

Dask-MPI 与交互式作业

Dask-MPI 可用于在现有 MPI 环境中轻松启动整个 Dask 集群,并在交互式会话中将客户端连接到该集群。

在此场景中,您将使用 Dask-MPI 命令行接口 (CLI) dask-mpi 启动 Dask 集群。

mpirun -np 4 dask-mpi --scheduler-file scheduler.json

在此示例中,上述代码将使用 MPI 在 MPI rank 0 上启动 Dask 调度器,并在所有剩余的 MPI ranks 上启动 Dask 工作进程(或 Nannies)。

如前一个示例所示,建议在使用 dask-mpi CLI 时使用 --scheduler-file 选项。--scheduler-file 选项将 Dask 调度器的位置保存到一个文件中,该文件稍后可在您的交互式会话中引用。例如,以下代码将创建一个 Dask 客户端并使用调度器 JSON 文件将其连接到调度器。

from distributed import Client
client = Client(scheduler_file='/path/to/scheduler.json')

只要您的交互式会话可以访问保存调度器 JSON 文件的同一个文件系统,此过程就可以让您的交互式会话轻松连接到您单独的 dask-mpi 作业。

Dask 集群创建后,可以使用 dask-mpi CLI 并使用 --no-scheduler 选项向集群添加更多工作进程。

mpirun -n 5 dask-mpi --scheduler-file scheduler.json --no-scheduler

在此示例(上方)中,将创建 5 个额外的工作进程,并将它们注册到调度器(其地址在调度器 JSON 文件中)。

提示

与作业调度器一起运行

在高性能计算环境中,作业调度器(如 LSF、PBS 或 SLURM)常用于请求 MPI 作业所需的资源,例如 CPU 核数、所需的总内存以及/或用于分散 MPI 作业的节点数。在这种情况下,建议用户将 mpirun ... dask-mpi ... 命令放入作业提交脚本中,其中 MPI ranks 的数量(例如,-np 4)与从作业调度器请求的核数匹配。

警告

MPI 作业与 Dask Nannies

许多时候,使用 Dask Nannies(即使用 --worker-class distributed.Nanny 选项)启动 Dask-MPI 集群(使用 dask-mpi)会很有用,而不是严格地只使用 Dask Workers。这是因为 Dask Nannies 可以在发生故障时重新启动工作进程。然而,在某些 MPI 环境中,Dask Nannies 可能无法按预期工作。这是因为某些 MPI 安装可能会限制实际运行进程的数量不超过请求的 MPI ranks 数量。使用 Dask Nannies 时,Nanny 进程在 fork 一个 Worker 进程后执行并在后台运行。因此,每个 Nanny 进程都会有一个 Worker 进程。一些 MPI 安装会杀死任何 fork 的进程,您将看到许多因 Worker 进程被杀死而产生的错误。如果发生这种情况,请使用 --worker-class distributed.Worker 选项禁用 Dask Nannies 的使用,该选项应用于 dask-mpi 命令。

有关如何使用 dask-mpi 命令的更多详细信息,请参阅命令行接口 (CLI)