Zexian Li

Ubuntu显卡资源配置

2020-08-13 · 3 min read
Linux

DeepLearning相关工作免不了对显卡的重度使用,现mark一下常用指令和常见情况的处理方法。

  1. 查看显卡状态
    nvidia-smi指令可查看当前显卡状态,进阶点的做法可以使用watch -n 0.5 nvidia-smi每0.5秒刷新并实时查看显卡状态。
  2. 查看使用显卡资源的程序
    使用sudo fuser -v /dev/nvidia*可以查看占用GPU资源的程序PID。如要进一步溯源可使用如下两种方法来查找进程的详细启动路径。
# method 1
cd /proc/PID
ls -ail
# method 2
lsof -p PID

可通过apt-get install psmisc来配置fuser。

  1. 杀死进程
    使用sudo kill -9 PID杀死对应进程。
  2. 指定使用显卡
    可以在Python程序中使用如下语句指定显卡:
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.DataParalleldevice_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()
  1. 设定主卡
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()
Bad decisions make good stories.