多卡训练
当一台机器上有多张卡可以使用时,我们希望能够在多张GPU上跑实验
torch.nn.DataParallel
显卡负载不均衡…(to be update)主卡比其他副卡占了将近2倍的显存
PyTorch分布式训练
没试过,还不会,但听说可以解决负载不均衡的问题
CPU 内存占用率不断增长
num_workers
当num_workers设为0时,CPU memory没有增长,但是取数据特别慢。在num_wokers = 8时,每秒钟能处理将近128张图片,但我把num_workers设置为0,每秒钟处理的图片数大概是8-10张,相差10倍多…
我遇到的问题是:
当num_workers大于0时,内存会渐渐增长,直到溢出(CPU memory leak), 120G都不够用。。。
- num_workers还是要大于0,不然时间难以承受
- 检查你的变量里是不是有保存list,根据pytorch官方人员的解答,其实不是真正的“内存爆掉”,而是python 语言设计的机制。
解决方法是:将list变量换成numpy array或者tensor
Python列表仅存储对对象的引用,这些对象分别保存在内存中。每个对象都有一个引用计数,因此列表中的每个项目都有一个引用计数。
Numpy数组(标准np类型)作为连续块存储在内存中,并且只有一个引用计数的一个对象。
强烈建议爆内存的伙伴可以看一下这里完整的讨论:
https://github.com/pytorch/pytorch/issues/13246
这并不是pytorch的问题,而是python 语言设计的机制。
节省显存
之前我不用的变量都是用del删掉,发现作用没有那么明显,但当在每次iteration后加入:
torch.cuda.empty_cache()
来清理无用的值,oh my god,变化很明显,能少将近5G的显存。
但感觉还是作用不大,因为显存一直在变化,它的峰值最高能达到9G,就算变化到2G左右,我还是不能同时在一张卡上跑几份代码,因为得按它的最高需求来分配显存。
但大部分时候只有2G左右的显存了,神奇…