【发布时间】:2020-06-03 13:19:05
【问题描述】:
我非常熟悉为 CPU 分发的 Dask。我想探索在 GPU 内核上运行我的代码的过渡。当我向 LocalCUDACluster 提交任务时,我收到此错误:
ValueError: tuple is not allowed for map key
这是我的测试用例:
import cupy as cp
import numpy as np
from dask_cuda import LocalCUDACluster
from dask.distributed import Client
cluster = LocalCUDACluster()
c = Client(cluster)
def test_function(x):
return(x+1)
sample_np = np.array([0,1])
sample_cp = cp.asarray(sample_np)
test_1 = test_function(sample_cp)
test_2 = c.submit(test_function,sample_cp)
test_2 = test_2.result()
test_1 输出:
array([1, 2])
test_2 输出:
distributed.protocol.core - CRITICAL - Failed to deserialize
.....
ValueError: tuple is not allowed for map key
如何在 CUDA 内核上正确分配任务?
更新:
我首先安装了 Dask Distributed 和 Dask CUDA 版本,设法让它工作。
但是,我注意到只有 1 个工作器可用,但我有 600 个 CUDA 内核。如何在这 600 个 CUDA 内核上分配单个任务?我想在这 600 个内核上并行执行任务。
版本:
dask 2.17.2
dask-cuda 0.13.0
cupy 7.5.0
cudf 0.13.0
msgpack-python 1.0.0
【问题讨论】:
-
Dask 的分布式调度程序是单线程的(CPU 和 GPU),而 Dask-CUDA 使用每个 GPU 模型一个工作者。这意味着分配给给定 GPU 的每个任务都将串行运行,但任务本身将使用 GPU 进行并行计算。您可能想查看 Dask 文档并探索 Dask.Array(它也支持 GPU 数组)。
-
如果您只有一个 GPU 并且不受内存限制,您可能只想使用 CuPy 而不是 Dask + CuPy。
-
如果您需要对并行性进行更细粒度的控制但又不想编写 CUDA 代码,您应该查看 Numba.cuda。它非常强大,可能正是您想要的。
-
只是添加到 Nick 的 cmets 中,GPU 的工作方式与 CPU 非常不同,因为 GPU 具有的内核数量每个内核的资源(寄存器、缓存)比 CPU 更有限。与 CPU 代码不同,CUDA 内核本质上是并行的,即并行化将在单个 GPU 中发生的级别。 Dask/Dask-CUDA 将允许您在多个 GPU 上进行并行化,而无需编写专门针对多个 GPU 的代码,就像它对针对多个线程/内核的单线程 CPU 代码所做的那样。长话短说:多 GPU 使用 Dask-CUDA,单 GPU 使用 CuPy 和 Numba 等库。
-
如果您对 GPU 工作原理的更多细节感兴趣,我建议您阅读An Even Easier Introduction to CUDA。
标签: dask dask-distributed cupy