1. 改变系统变量使得仅目标显卡可见
1、在程序开头设置 os.environ["CUDA_VISIBLE_DEVICES"] = '0,1,2,3'
2、 CUDA_VISIBLE_DEVICES=0,1,2,3 python xxx.py
来设置该程序可见的gpu
设置完,代码中直接用model.cuda(),input.cuda()即可
2. 使用 torch.cuda
接口
在生成网络对象之前执行:torch.cuda.set_device(0)
3. 使用pytorch的并行GPU接口
net = torch.nn.DataParallel(model, device_ids=[0])
4. 初始化模型时
5、使用.to(device)
对于单个gpu
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
model.to(device)
# 这里需要注意的是,仅仅调用Tensor.to()只会在GPU上返回一个新的copy,并不会对原来的引用造成变化,因此需要通过赋值rewrite
x.to(device)
对于多个gpu
model = Model(input_size, output_size)
print("Let's use", torch.cuda.device_count(), "GPUs!\n")
model = nn.DataParallel(model)
model.to(device)
print(model)
# output
# Let's use 2 GPUs!
DataParallel(
(module): Model(
(fc): Linear(in_features=5, out_features=2, bias=True)
)
)
具体例子参考:https://blog.csdn.net/xxboy61/article/details/97973288;https://blog.csdn.net/weixin_36670529/article/details/104349669
深度学习pytorch,tensorflow中gpu利用率较低,使用率周期性变化的问题
GPU在等待CPU读取,预处理,并传输数据过来,因此要提高GPU的使用率,降低GPU的等待时间,需要加快CPU的处理速度.
在PYTORCH中的解决方案是用torch.utils.data.DataLoader,用num_workers设置线程数。
torch.utils.data.DataLoader(image_datasets[x],
batch_size=batch_size,
shuffle=True,
num_workers=8,
pin_memory=True)
pytorch训练时,gpu利用率不稳定
参考:https://blog.csdn.net/qq_32768679/article/details/108522049
Q:单主机四gpu利用torch.nn.DataParallel进行多gpu的训练;gpu的内存占有率没问题,但使用率很低,很长一段时间在百分之零。
问题原因:读取每个batch size的图像时,cpu读取时间较长。(batch_size = 1024, 设置DataLoader线程4、8、16、32的改善都不大,且pin_memory=true),开始的dataset为下面方式,显然每次读取时io的耗时比较长。于是,将图像全部读出(硬件支持…),然后再进行每次的变量赋值。
实际上,参考文章的解决方案就是,在定义DataSet时,
__init__
里面就打开、读取了全部图像,在__getitem__
里面只是按index取图像而已。提高训练速度GPU利用率较低,CPU利用率很低,且模型训练速度很慢的问题总结
参考:深度学习PyTorch,TensorFlow中GPU利用率较低,CPU利用率很低,且模型训练速度很慢的问题总结与分析
对上面的分析总结一下,第一是增加batch size,增加GPU的内存占用率,尽量用完内存,而不要剩一半,空的内存给另外的程序用,两个任务的效率都会非常低。第二,在数据加载时候,将num_workers线程数设置稍微大一点,推荐是8,16等,且开启pin_memory=True。不要将整个任务放在主进程里面做,这样消耗CPU,且速度和性能极为低下。 :::info 个人总结:
如果GPU内存占用率低,可以适当增大batch
- 如果GPU利用率低,可以在dataloader上做优化,设置nmum_workers(线程数),pin_memory=True,解决好数据传输的带宽瓶颈。
- 这个是Volatile GPU-Util表示,当没有设置好CPU的线程数时,这个参数是在反复的跳动的,0%,20%,70%,95%,0%。这样停息1-2 秒然后又重复起来。其实是GPU在等待数据从CPU传输过来,当从总线传输到GPU之后,GPU逐渐起计算来,利用率会突然升高,但是GPU的算力很强大,0.5秒就基本能处理完数据,所以利用率接下来又会降下去,等待下一个batch的传入。因此,这个GPU利用率瓶颈在内存带宽和内存介质上以及CPU的性能上面。最好当然就是换更好的四代或者更强大的内存条,配合更好的CPU。 :::