GPU

Dask 可以通过几种方式与 GPU 协同工作。

自定义计算

许多人将 Dask 与 PyTorch 和 TensorFlow 等 GPU 加速库一起使用,以管理跨多台机器的工作负载。他们通常使用 Dask 的自定义 API,特别是 DelayedFutures

Dask 不需要知道这些函数是否使用 GPU。它只是运行 Python 函数。这些 Python 函数是否使用 GPU 与 Dask 是正交的。它都能工作。

作为一个示例,您可以查看此讲座

高级集合

Dask 还可以通过将 Dask Array 和 DataFrame 集合与 GPU 加速的数组或 dataframe 库结合使用,来扩展大型数组和 dataframe 计算。

回顾一下,Dask Array 是由许多 NumPy 数组组成的一个大数组,而 Dask DataFrame 是由许多 Pandas dataframes 组成的一个大 dataframe。如果我们将 NumPy/Pandas 组件替换为这些库的 GPU 加速版本,并且 GPU 加速版本看起来足够像 NumPy/Pandas 以便与 Dask 互操作,我们就可以使用这些相同的系统与 GPU 协同工作。

幸运的是,在 GPU 上模拟 NumPy、Pandas 和 Scikit-Learn 的库确实存在。

DataFrames

RAPIDS 库提供了一个 GPU 加速的类似 Pandas 的库 cuDF,它与 Dask DataFrame 良好互操作并经过测试。

如果安装了 cuDF,您应该能够将 Pandas 支持的 Dask DataFrame 转换为 cuDF 支持的 Dask DataFrame,如下所示

import cudf

df = df.map_partitions(cudf.from_pandas)  # convert pandas partitions into cudf partitions

然而,cuDF 不支持完整的 Pandas 接口,因此各种 Dask DataFrame 操作可能无法正常工作。请查看 cuDF API 参考 以了解当前支持的接口。

数组

注意

Dask 与 CuPy 的集成依赖于 NumPy 和 CuPy 最近添加的功能,特别是在版本 numpy>=1.17cupy>=6 中。

Chainer 的 CuPy 库提供了一个 GPU 加速的类似 NumPy 的库,它与 Dask Array 良好互操作。

如果安装了 CuPy,您应该能够将 NumPy 支持的 Dask Array 转换为 CuPy 支持的 Dask Array,如下所示

import cupy

x = x.map_blocks(cupy.asarray)

CuPy 相当成熟,并且严格遵循 NumPy API。然而,确实存在一些微小差异,这些差异可能导致 Dask Array 操作无法正常运行。请查看 CuPy 参考手册 以了解 API 兼容性。

Scikit-Learn

有多种 GPU 加速的机器学习库遵循 Scikit-Learn 的 Estimator API(fit、transform 和 predict)。这些库通常可以在 Dask-ML 的元估计器中使用,例如 超参数优化

其中一些包括

设置

从上面的示例可以看出,使用 Dask 与 GPU 支持的库的用户体验与使用 CPU 支持的库并没有太大区别。但是,在设置集群时,您可能需要考虑进行一些更改。

限制工作

默认情况下,Dask 允许运行与 CPU 核心数量一样多的并发任务。但是,如果您的任务主要使用 GPU,那么您可能希望同时运行的任务数量少得多。这里有几种限制并行性的方法

  • 在 worker 上使用 CLI 中的 --nthreads 关键字或 Cluster 构造函数中的 ncores= 关键字显式限制线程数。

  • 使用 worker 资源 并将某些任务标记为 GPU 任务,以便调度器对其进行限制,同时将剩余的 CPU 核心用于其他工作。

按机器指定 GPU

某些配置可能在每个节点上具有许多 GPU 设备。Dask 通常用于平衡和协调这些设备之间的工作。

在这种情况下,通常为每个设备启动一个 Dask worker,并使用 CUDA 环境变量 CUDA_VISIBLE_DEVICES 将每个 worker 固定到首选的一个设备上。

# If we have four GPUs on one machine
CUDA_VISIBLE_DEVICES=0 dask-worker ...
CUDA_VISIBLE_DEVICES=1 dask-worker ...
CUDA_VISIBLE_DEVICES=2 dask-worker ...
CUDA_VISIBLE_DEVICES=3 dask-worker ...

Dask CUDA 项目包含一些方便的 CLI 和 Python 工具来自动化此过程。

进行中的工作

GPU 计算是当今发展迅速的领域,因此本页信息可能很快就会过时。我们鼓励感兴趣的读者查看 Dask 的博客,其中包含更多有关正在进行的工作的及时更新。