我对为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内核上正确分配任务?
UPDATE:
通过首先安装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
看来该问题在评论中有答案。我要复制Nick Becker的回复
Dask的分布式调度程序是单线程(CPU和GPU),并且Dask-CUDA在每个GPU模型中使用一个工作线程。这意味着分配给给定GPU的每个任务将串行运行,但是任务本身将使用GPU进行并行计算。您可能需要查看Dask文档并浏览Dask.Array(它也支持GPU阵列)。