Python 多处理时,Pytorch推断CUDA内存不足
为了充分利用CPU/GPU,我运行了几个进程,在单独的数据集上进行DNN推断(前馈)。由于进程在前馈期间分配CUDA内存,因此我得到一个CUDA内存不足错误。为了缓解这种情况,我添加了Python 多处理时,Pytorch推断CUDA内存不足,python,pytorch,Python,Pytorch,为了充分利用CPU/GPU,我运行了几个进程,在单独的数据集上进行DNN推断(前馈)。由于进程在前馈期间分配CUDA内存,因此我得到一个CUDA内存不足错误。为了缓解这种情况,我添加了torch.cuda.empty\u cache()调用,这使事情变得更好。但是,仍然会偶尔出现内存不足错误。可能是由于错误的分配/发布时间 我通过在前馈调用周围添加一个多处理.BoundedSemaphore来解决这个问题,但这在初始化和在进程之间共享信号量方面带来了困难 在运行多个GPU推理过程时,有没有更好的
torch.cuda.empty\u cache()
调用,这使事情变得更好。但是,仍然会偶尔出现内存不足错误。可能是由于错误的分配/发布时间
我通过在前馈调用周围添加一个多处理.BoundedSemaphore
来解决这个问题,但这在初始化和在进程之间共享信号量方面带来了困难
在运行多个GPU推理过程时,有没有更好的方法来避免此类错误?根据我的并行训练和推理经验,几乎不可能压缩GPU内存的最后一位。您只能估计并行运行的最大进程数,然后限制代码同时运行那么多进程。使用信号量是限制并行进程数量的典型方法 为了简化进程之间的初始化和共享信号量,可以使用
多处理.Pool
和池初始值设定项,如下所示
semaphore = mp.BoundedSemaphore(n_process)
with mp.Pool(n_process, initializer=pool_init, initargs=(semaphore,)) as pool:
# here each process can access the shared variable pool_semaphore
def pool_init(semaphore):
global pool_semaphore
pool_semaphore = semaphore
另一种方法是在循环中运行,同时使用try。。。除了
阻止并继续尝试使用GPU。但是,这可能会带来巨大的性能开销,这可能不是一个好主意