Я работал над данными, которые больше моего графического процессора, и сейчас я пытаюсь использовать dask.
Я помню, как читал этот пост http://matthewrocklin.com/blog/work/2019/01/03/dask-array-gpus-first-steps Мэтью Роклина о том, как делать массивы на основе графических процессоров с использованием cupy. В посте показано, что вы можете создавать массивы, которые больше, чем у 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 ГБ данных в GPU, но мой GPU имеет только 8 ГБ. Прямо сейчас, если я изменю размер моего массива на numy, код будет выполняться, но не с текущим размером массива. В настоящее время я делаю обычный массив dask из ранее существовавшего массива numpy. Затем я запускаю client.submit в своей функции, которая пытается отправить весь массив dask в gpu.
В посте, указанном выше, dask может обрабатывать большой массив из-за его размера чанка, но мне не удалось получить массив dask на основе cupy.
Могу ли я получить массив dask (x) для использования cupy, и могу ли я отправить этот массив в свое ядро?
Спасибо