Можно ли асинхронно передавать память из / в GPU с помощью cupy
(или chainer
)?
Я обучаю относительно небольшую сеть с очень большими данными, которые не помещаются в память графического процессора. Эти данные должны храниться в памяти ЦП и последовательно предоставляться графическому процессору для его минипакетного расчета.
Время передачи памяти является основным узким местом этого приложения. Я думаю, что асинхронная передача памяти решает эту проблему, т.е. во время расчета одного мини-пакета другой мини-пакет передается на GPU в фоновом режиме.
Мне интересно, что это было бы возможно с классом cupy.cuda.Stream
, но я еще не знаю. Буду признателен за любые комментарии / советы.
РЕДАКТИРОВАТЬ: Я думал, что следующие коды выполняют асинхронную передачу памяти, но это не так.
import numpy as np
import cupy as cp
a_cpu = np.ones((10000, 10000), dtype=np.float32)
b_cpu = np.ones((10000, 10000), dtype=np.float32)
a_stream = cp.cuda.Stream(non_blocking=True)
b_stream = cp.cuda.Stream(non_blocking=True)
a_gpu = cp.empty_like(a_cpu)
b_gpu = cp.empty_like(b_cpu)
a_gpu.set(a_cpu, stream=a_stream)
b_gpu.set(b_cpu, stream=b_stream)
# This should start before b_gpu.set() is finished.
a_gpu *= 2
NVVP показывает, что передача памяти происходит последовательно.