写在前面
在使用GPU进行深度学习训练经常会遇到下面几个问题,这里做一个解决方法的汇总。
🐕Q1🐕:在一个多卡服务器上,指定了cuda:1,但是0号显卡显存还是会被占用一定量的显存。
这个问题很经典的出现场景就是0号卡已经几乎要被占满了,但是1号卡空的很。本想指定在1号卡上跑DL,结果因为一直会占用0号卡一定量的显存,但0号卡此时已经不够显存了,就会反复报:CUDA OUT OF MEMORY.
A1:这个问题是因为模型的部分初始化操作会默认在0号卡上进行,后续的cuda:1没法将这个初试化操作放到1号卡上,所以就占用了部分0号卡的情况。解决的方法可以直接在代码运行的时候指定模型的可见显卡环境。比如现在有一台双卡服务器,现在要将代码指定在1号卡进行,可通过下面代码运行:
CUDA_VISIBLE_DEVICES=1 python3 train.py
其中CUDA_VISIBLE_DEVICES=1的作用是将你的1号显卡暴露给这个代码,这个代码在运行过程中只看到了这张卡,这时候你代码中可以通过调用cuda:0就能够实现只占用这张卡的内存了。另外CUDA_VISIBLE_DEVICES这里指定的顺序也有讲究,如果是如下这样指定:
CUDA_VISIBLE_DEVICES=0,1 python3 train.py
那代码中如果是调用cuda:0的话对应调用的就是0号卡,但如果是按照下面这样指定的话:
CUDA_VISIBLE_DEVICES=1,0 python3 train.py
调用cuda:0的话对应调用的就是1号卡。
🐕Q2🐕:在一个多卡服务器上,想要同时利用多张卡同时训练。
这个一般就是用于模型需要较多显存,但是单卡的显存不够的情况了。
A2:使用如下代码即可:
if torch.cuda.device_count() > 1:model = nn.DataParallel(model)
注意,在模型分布到多卡上之后,输入数据直接按照下面方式存入显存即可:
input = input.cuda()
数据会进行自适应分流到各个显卡上的。
To be continued…