Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多处理时,Pytorch推断CUDA内存不足_Python_Pytorch - Fatal编程技术网

Python 多处理时,Pytorch推断CUDA内存不足

Python 多处理时,Pytorch推断CUDA内存不足,python,pytorch,Python,Pytorch,为了充分利用CPU/GPU,我运行了几个进程,在单独的数据集上进行DNN推断(前馈)。由于进程在前馈期间分配CUDA内存,因此我得到一个CUDA内存不足错误。为了缓解这种情况,我添加了torch.cuda.empty\u cache()调用,这使事情变得更好。但是,仍然会偶尔出现内存不足错误。可能是由于错误的分配/发布时间 我通过在前馈调用周围添加一个多处理.BoundedSemaphore来解决这个问题,但这在初始化和在进程之间共享信号量方面带来了困难 在运行多个GPU推理过程时,有没有更好的

为了充分利用CPU/GPU,我运行了几个进程,在单独的数据集上进行DNN推断(前馈)。由于进程在前馈期间分配CUDA内存,因此我得到一个CUDA内存不足错误。为了缓解这种情况,我添加了
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。但是,这可能会带来巨大的性能开销,这可能不是一个好主意