Как записать большой массив dask (numpy.ndarray) в файл Zarr с использованием графических процессоров?
Я пытаюсь записать большой массив dask (46 ГБ с фрагментами 124 - 370 МБ) в файл zarr с помощью dask. Если бы мой массив dask был названdask_data
, то простой dask_data.to_zarr("my_zarr.zarr")
должно сработать. Но насколько я понимаю, это синхронный процесс, связанный с процессором.
Что я хотел бы сделать, так это использовать параллелизм с большей частью работы, выполняемой графическим процессором Quadro GV100. Я попытался преобразовать numpy.ndarray в cupy.ndarray черезdask_data_cupy = dask_data.map_blocks(cupy.asarray)
и записываю это в файл zarr, но получаю:
ValueError: object __array__ method not producing an array
(и, честно говоря, прироста производительности я тоже не вижу).
Как я могу использовать графический процессор для распараллеливания записи массива dask в файл zarr?
Спасибо!
2 ответа
Но насколько я понимаю, это синхронный процесс, связанный с процессором.
Это, вероятно, неправда, скорее всего, ваше узкое место - запоминающее устройство. В любом случае каждый фрагмент записывается в отдельный файл и параллельно между потоками и / или процессами (в зависимости от вашей настройки). В этом весь смысл дизайна zarr: приложение может независимо взаимодействовать с каждым фрагментом.
Вы можете быть привязаны к ЦП, если решите использовать различные кодировки сжатия; однако они не обязательно подходят для работы с GPU.
Короче говоря, если ваши данные уже не сгенерированы на графическом процессоре, я был бы удивлен, если передача их на графический процессор для обработки перед записью в файлы того стоит. Если бы была функция для прямого чтения / записи массивов Cupy в zarr, и вы также обрабатывали бы на GPU, это было бы иначе, но я не верю, что есть.
Я думаю, вам нужно добавить dask_data.map_blocks(cupy.asnumpy)
перед звонком to_zarr
.
CuPy пытается убедиться, что пользователь намеревался выполнить передачу с устройства на хост (поскольку это может быть дорогостоящим). Так намеренно повышается, когдаnumpy.asarray
вызывается в массиве CuPy (как это происходит во время этой записи).