赞
踩
占用显存可分为激活内存和失活内存,通常我们使用GPU的场景是:
假设GPU总的显存有10G首先加载一个模型,占用1G激活显存。
(1) 来一个数据并进行推理,推理结束后占用2G失活内存。则此时的占用率是3/10
(2) 如果又来个稍小的数据进行推理,推理时需占用1G失活内存,CUDA会把2G失活内存中的1G释放掉并提供给其进行推理,推理结束后又产生1G失活内存,推理结束后仍占用2G失活内存,则此时的占用率仍是3/10
(3) 如果又来个稍大的数据进行推理,需要3G内存,CUDA会把当前的2G失活内存释放并再申请1G内存供其推理,推理结束后共占用3G失活内存,此时占用率则为4/10
调用 torch 的功能可以实现显存释放 torch.cuda.empty_cache(),
但只能释放失活显存,即通过手动释放后,1中的例子显存占用率为1/10(加载模型占用的1G激活显存,推理过程结束后通过手动释放,失活显存会被释放)。反观1中CUDA分配GPU资源的机制,手动释放显存意义并不大
综上,如果出现显存溢出的错误还是要从模型和数据瘦身、减少并行计算量、增加硬件资源、控制进程、线程数等方面着手才行
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。