如何解决多重处理时,Pytorch推断CUDA内存不足
为了充分利用CPU / GPU,我运行了几个对单独的数据集进行DNN推断(前馈)的过程。由于进程在前馈期间分配了CUDA内存,因此我得到了CUDA内存不足错误。为了减轻这种情况,我添加了torch.cuda.empty_cache()
调用,使情况变得更好。但是,仍然偶尔会出现内存不足的错误。可能是由于分配/发布时间安排不正确。
我设法通过在前馈调用周围添加multiprocessing.BoundedSemaphore
来解决此问题,但这在初始化和共享进程之间的信号量方面带来了困难。
在运行多个GPU推理过程时是否有更好的方法来避免此类错误?
解决方法
我为研究进行了multiprocessing
的并行训练和推理(并非在行业范围内)。根据我的经验,挤压GPU内存的每一块是困难的或几乎是不可能的。
您只能估计最大可以并行运行多少个进程,然后限制并行代码以同时运行多个进程。使用信号量是限制并行进程数的典型方法。为了使进程之间的信号量共享更容易,可以使用池及其初始化程序。
semaphore = mp.BoundedSemaphore(n_process)
with mp.Pool(n_process,initializer=pool_init,initargs=(semaphore,)) as pool:
# run here,each process can access the shared variable pool_semaphore
def pool_init(semaphore):
global pool_semaphore
pool_semaphore = semaphore
另一种方法是使用while
块将推理调用放入try ... except
循环中,并继续尝试进行推理。但是,这可能会严重影响性能,但可能不是一个好主意。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。