DeepLearning相关工作免不了对显卡的重度使用,现mark一下常用指令和常见情况的处理方法。
nvidia-smi
指令可查看当前显卡状态,进阶点的做法可以使用watch -n 0.5 nvidia-smi
每0.5秒刷新并实时查看显卡状态。sudo fuser -v /dev/nvidia*
可以查看占用GPU资源的程序PID。如要进一步溯源可使用如下两种方法来查找进程的详细启动路径。# method 1
cd /proc/PID
ls -ail
# method 2
lsof -p PID
可通过
apt-get install psmisc
来配置fuser。
sudo kill -9 PID
杀死对应进程。import os
os.environ["CUDA_VISIBLE_DEVICES"] = "3, 0"
上述语句会将GPU3作为程序调用的第一块卡(主卡),将GPU0作为程序调用的第二块卡。且需要注意的是,这语句需要在任何调用GPU的语句前使用。
或直接在命令行前加上指定显卡的语句CUDA_VISIBLE_DEVICES=0,1 python main.py
。
5. 多卡训练
Pytorch中多卡训练的语句例下所示:
os.environ["CUDA_VISIBLE_DEVICES"] = "3, 0"
model = MyModel(opt)
model = nn.DataParallel(model,device_ids=[0,1])
model.cuda()
其中nn.DataParallel
的device_ids
参数只能写[0,1]
,实测写[1,0]
都会报错,或者直接去掉device_ids
参数也可,因为Pytorch会自动纳入所有可用的显卡。实测最后的model.cuda()
语句也需加上。
6. 单卡训练
单卡训练有很多种写法,这里本着最小改动原则记录Pytorch中一种个人用起来很舒适的方法。
os.environ["CUDA_VISIBLE_DEVICES"] = "1"
model = MyModel(opt)
model = nn.DataParallel(model)
model.cuda()
os.environ["CUDA_VISIBLE_DEVICES"] = "1,2,3"
device = torch.device("cuda:1"if USE_CUDA else "cpu")
model = nn.DataParallel(model)
model.to(device)
此时所用的主卡为2卡。
如下,实际用到的显卡为4、5、6、7号显卡,显卡的运算编号为0、2、3,也就是说
其中物理上的4号显卡为实际的主卡。同时注意,多卡并行计算时的显卡中必须包含主卡。
os.environ["CUDA_VISIBLE_DEVICES"] = "4,5,6,7"
model = torch.nn.DataParallel(model, device_ids=[0,2,3]).cuda()