如何从一个numpy数组制作一个GPU dask数组?

时间:2019-05-28 00:41:21

标签: dask dask-distributed cupy

我一直在处理大于gpu的数据,现在我正在尝试使用dask。

我记得读过Matthew Rocklin的这篇文章http://matthewrocklin.com/blog/work/2019/01/03/dask-array-gpus-first-steps,内容涉及使用Cupy创建基于GPU的数组。帖子显示由于dask的分块,您可以制作比gpu大的数组。但是,我的问题不包括随机数据,因此不完全符合发布要求。

import numpy as np
import cupy as cp
import dask.array as da
from numba import cuda
from dask_cuda import LocalCUDACluster
from dask.distributed import Client

@cuda.jit
def work (array):
    i = cuda.grid(1)
    if i < array.shape[0]:
        for j in range(array.shape[1]):
            array[i][j] = 2


def toCUDA (array):

    arraysize = 100000
    threadsperblock = 64
    blockspergrid = (arraysize + (threadsperblock - 1))
    stream = cuda.stream()

    d_array = cuda.to_device(array, stream)
    work[blockspergrid, threadsperblock, stream](d_array)
    array = d_array.copy_to_host()
    return array

if __name__ == "__main__":

    cluster = LocalCUDACluster()
    client = Client(cluster)
    d = np.ones(shape=(100000,30000), dtype=np.float32)
    x = da.from_array(d, chunks=('auto', -1))
    x = x.persist()

    answer = client.submit(toCUDA, x)

    answer = client.gather(answer)
    print(answer[0])

在上面的代码中,我试图将12 gb的数据推送到gpu,但是我的gpu只有8 gb。现在,如果我将numpy数组更改为较小,则代码会运行,但不会使用当前数组大小。目前,我正在从以前的现有numpy数组制作普通的dask数组。然后,在我的函数上运行client.submit,该函数尝试将整个dask数组发送到gpu。

在dask上方链接的文章中,由于其块大小,它能够处理大型数组,但是我没有成功使dask数组基于cupy。

我有可能让我的dask数组(x)使用Cupy吗,我可以将该数组发送到内核吗?

谢谢

0 个答案:

没有答案