我一直在处理大于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吗,我可以将该数组发送到内核吗?
谢谢