【问题标题】:GPU Dask Cuda cluster: client.submitGPU Dask Cuda 集群:client.submit
【发布时间】: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


【解决方案1】:

看起来这个问题在 cmets 中有答案。我将复制 Nick Becker 的回复

Dask 的分布式调度程序是单线程的(CPU 和 GPU),而 Dask-CUDA 对每个 GPU 模型使用一个工作器。这意味着分配给给定 GPU 的每个任务都将串行运行,但任务本身将使用 GPU 进行并行计算。您可能想查看 Dask 文档并探索 Dask.Array(它也支持 GPU 数组)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2020-09-18
    • 2020-11-17
    • 2021-07-12
    • 2021-05-20
    • 2020-06-25
    相关资源
    最近更新 更多