Как записать большой массив 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 (как это происходит во время этой записи).

Другие вопросы по тегам