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 dataframe 构成一个大型 dataframe。如果我们用这些相同库的 GPU 加速版本替换 NumPy/Pandas 组件,只要 GPU 加速版本在外观上足够像 NumPy/Pandas 以便与 Dask 互操作,我们就可以将这些相同的系统与 GPU 一起使用。

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

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 Reference 以了解当前支持的接口。

数组

注意

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 Reference Manual 以了解 API 兼容性。

Scikit-Learn

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

其中一些包括

设置

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

限制工作

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

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

  • 使用 工作器资源 并将某些任务标记为 GPU 任务,这样调度器就会限制它们,同时将其余的 CPU 核心用于其他工作

指定每台机器的 GPU

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

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

# 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 博客,其中包含有关正在进行的工作的更及时更新。