动手学深度学习16 Pytorch神经网络基础)
- 5. GPU
- colab
- NVIDIA GPU
- QA
- 显存
5. GPU
课件: https://zh-v2.d2l.ai/chapter_deep-learning-computation/use-gpu.html
有GPU+装cuda。
把模型参数放到指定设备上。
# 5.6. GPU
# !nvidia-smi
# 在命令行中,感叹号(!)通常用于执行系统命令或外部程序。在这个上下文中,
# `!nvidia-smi`表示你正在执行一个名为`nvidia-smi`的系统命令,它通常用于显示关于NVIDIA GPU的信息,比如当前使用情况、显存占用等。
# 能查看cuda版本。
# 5.6.1. 计算设备 查看设备
import torch
from torch import nn
# cuda:0和cuda是等价的
print(torch.device('cpu'), torch.device('cuda'), torch.device('cuda:1'))
print(torch.cuda.device('cuda'))
# cpu cuda cuda:1
# torch.device('cpu'), torch.device('cuda'), torch.device('cuda:1')
# (device(type='cpu'), device(type='cuda'), device(type='cuda', index=1))
# 查询可用gpu的数量 nvidia-smi 查看 编号从0开始
print(torch.cuda.device_count()) # 1
def try_gpu(i=0):
"""如果存在,则返回gpu(i),否则返回cpu()"""
if torch.cuda.device_count() >= i+1:
return torch.device(f'cuda:{i}')
return torch.device('cpu')
def try_all_gpus():
"""返回所有可用的GPU,如果没有GPU,则返回[cpu(),]"""
devices = [torch.device(f'cuda:{i}') for i in range(torch.cuda.device_count())]
return devices if devices else [torch.device('cpu')]
print(try_gpu(), try_gpu(10), try_all_gpus()) # cpu cpu [device(type='cpu')]
# try_gpu(), try_gpu(10), try_all_gpus()
# (device(type='cpu'), device(type='cpu'), [device(type='cpu')])
# 5.6.2. 张量与GPU
x = torch.tensor([1, 2, 3])
print(x.device) # cpu 默认情况下,张量是在CPU上创建的
# device(type='cpu')
# 无论何时我们要对多个项进行操作, 它们都必须在同一个设备上。
# 例如,如果我们对两个张量求和, 我们需要确保两个张量都位于同一个设备上,
# 否则框架将不知道在哪里存储结果,甚至不知道在哪里执行计算
# 5.6.2.1. 存储在GPU上
X = torch.ones(2, 3, device=try_gpu())
print(X)
# X
# tensor([[1., 1., 1.],
# [1., 1., 1.]], device='cuda:0')
Y = torch.rand(2, 3, device=try_gpu(1)) # 只有1张卡 所以传1的话if判断不成立 所以用的是cpu
print(Y)
# tensor([[0.7767, 0.8478, 0.6001],
# [0.4728, 0.8607, 0.5628]])
# 5.6.2.2. 复制
# print(X+Y) # RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!
Z = Y.cuda(0)
print(Y)
# tensor([[0.7767, 0.8478, 0.6001],
# [0.4728, 0.8607, 0.5628]])
print(Z)
# tensor([[0.7767, 0.8478, 0.6001],
# [0.4728, 0.8607, 0.5628]], device='cuda:0')
print(X+Z) # X+Y 会发生在XY所在的device中
# tensor([[1.7767, 1.8478, 1.6001],
# [1.4728, 1.8607, 1.5628]], device='cuda:0')
# 假设变量Z已经存在于第二个GPU上。 如果我们还是调用Z.cuda(1)会发生什么? 它将返回Z,而不会复制并分配新内存。不会自己再copy一份自己。
print(Z.cuda(0) is Z) # True
# 在CPU和GPU之间传数据是很慢的事情。
# 5.6.3. 神经网络与GPU
net = nn.Sequential(nn.Linear(3,1))
# net.to(device) 挪到指定device上
net = net.to(device=try_gpu())
print(net(X))
# tensor([[0.5205],
# [0.5205]], device='cuda:0', grad_fn=<AddmmBackward0>)
# 确认模型参数存储和模型、输入数据都在同一个GPU上。
print(net[0].weight.data.device) # cuda:0
# device(type='cuda', index=0)
cpu cuda cuda:1
1
cuda:0 cpu [device(type='cuda', index=0)]
cpu
tensor([[1., 1., 1.],
[1., 1., 1.]], device='cuda:0')
tensor([[0.3054, 0.6903, 0.9338],
[0.3610, 0.6394, 0.2725]])
tensor([[0.3054, 0.6903, 0.9338],
[0.3610, 0.6394, 0.2725]])
tensor([[0.3054, 0.6903, 0.9338],
[0.3610, 0.6394, 0.2725]], device='cuda:0')
tensor([[1.3054, 1.6903, 1.9338],
[1.3610, 1.6394, 1.2725]], device='cuda:0')
True
tensor([[0.2109],
[0.2109]], device='cuda:0', grad_fn=<AddmmBackward0>)
cuda:0
colab
免费GPU资源,每月限时。
NVIDIA GPU
云GPU比真实GPU贵5-6倍。
买新的不买旧的。8G内存就可以了。内存很贵。内存对深度学习不是那么有用。
找GPU。
QA
1: 显存比cpu内存要贵,越大越好,但越大越贵
2:gpu存在性能的上限,通过不断加核的数量突破摩尔定律。
3: 跑训练的时候显存不够用,但是把batchsize调小,cuda占用又变小, 可以把模型调小一点。
4:长时间满负荷对显卡没有影响,但是要注意显卡的温度,不要长时间高于80°。
5:有显卡,但是torch.cuda.device_count()=0 ,可能原因:1是可能cuda没装好,可以看下显卡信息nvidia-smi。2可能是装的cpu版本的pytorch,需要装成gpu版本的pytorch。
6:一般在net() work之前,把数据data放到设备上to gpu。数据格式的变化和读取可能不一定gpu设备上计算快。
7:to(device) 是model的组件 net().to(device), 是把模型或数据copy到gpu device 上。
8:gpu推理,就是inference,不在gpu上forward,不做训练–算梯度-。
9:GPU使用率69%-70%,使用率还可以。GPU速度不明显可以看看网络或者机器本身性能问题。
10:nvidia训练的模型,不建议在其他GPU上跑。
11:apple M1 gpu和cpu共用内存,都在一个芯片里面, 主要看内存带宽。
12: cuda 编译cuda的编译器。
13:GPU上的推理通常比训练好一些,不是内存的关键,可以把batchsize设置大一些。
14:自定义的网络结构,每次创建一个实例是会创建新的参数,不把同一个实例放在不同位置,是不会共享参数的。
显存
显存是指显卡上的内存,用于存储图形数据、纹理、帧缓冲区等信息。它在计算机图形处理和深度学习等领域中扮演着重要角色。以下是关于显存的具体介绍:
-
作用:
- 存储图像和视频数据:显存可以存储屏幕上显示的图像、视频和其他图形数据。
- 加速图形处理:显存中存储了图形处理单元(GPU)需要的数据,可以加速图形渲染和处理过程。
- 支持多显示器:显存可以同时存储多个显示器所需的图像数据,支持多显示器配置。
- 训练深度学习模型:在深度学习中,显存用于存储模型参数、中间计算结果等,支持大规模模型的训练和推理。
-
类型:
- GDDR(Graphics Double Data Rate):主要用于显卡的显存,具有较高的带宽和传输速度,适合处理图形数据和计算任务。
- HBM(High Bandwidth Memory):高带宽内存,提供更高的带宽和能效,常用于高性能计算和深度学习加速器。
-
容量:
- 显存容量通常以GB(Gigabyte)为单位,不同显卡型号的显存容量会有所不同,从几GB到数十GB不等。
- 大容量显存适合处理大规模数据和复杂图形任务,如高分辨率图像处理、大规模模型训练等。
-
使用场景:
- 游戏:显存对于游戏性能至关重要,足够的显存可以存储大量的纹理、模型和渲染数据,提供流畅的游戏体验。
- 深度学习:在深度学习中,显存用于存储神经网络的参数、中间结果和计算图,支持大规模模型的训练和推理。
- 科学计算:对于需要大量计算和数据处理的科学计算任务,显存可以加速计算过程并提高计算效率。
总的来说,显存在图形处理、深度学习和高性能计算等领域都起着重要作用,其容量和性能直接影响着相关任务的执行效率和效果。