type
status
date
slug
summary
tags
category
icon
password
Property
使用
nvidia-smi
命令来查看显卡信息计算设备
可以指定用于存储和计算的设备(CPU和GPU)。 默认情况下,张量是在内存中创建的,然后使用CPU计算它。在PyTorch中,CPU和GPU可以用
torch.device('cpu')
和torch.device('cuda')
表示。 cpu
设备意味着所有物理CPU和内存,PyTorch的计算将尝试使用所有CPU核心
gpu
设备只代表一个卡和相应的显存,如果有多个GPU,使用torch.device(f'cuda:{i}')
来表示第块GPU( 从0开始),cuda:0
和cuda
是等价的
定义两个方便的函数, 这两个函数允许在不存在所需所有GPU的情况下运行代码:
张量与GPU
可以查询张量所在的设备, 默认情况下张量是在CPU上创建的
需要注意:无论何时对多个项进行操作,它们都必须在同一个设备上。 例如,如果对两个张量求和,需要确保两个张量都位于同一个设备上, 否则框架将不知道在哪里存储结果,甚至不知道在哪里执行计算。
存储在GPU上
有几种方法可以在GPU上存储张量。 例如,可以在创建张量时指定存储设备。
在GPU上创建的张量只消耗这个GPU的显存,需要确保不创建超过GPU显存限制的数据。
假设至少有两个GPU,下面的代码将在第二个GPU上创建一个随机张量
复制
如果要计算
X + Y
,需要决定在哪里执行这个操作。 如图所示,可以将X
传输到第二个GPU并在那里执行操作。不要简单地X
加上Y
,运行时引擎不知道该怎么做(会导致异常 ):它在同一设备上找不到数据会导致失败。 由于Y
位于第二个GPU上,所以需要将X
移到那里, 然后才能执行相加运算。神经网络与GPU
类似地,神经网络模型可以指定设备
当输入为GPU上的张量时,模型将在同一GPU上计算结果。只要所有的数据和参数都在同一个设备上,就可以有效地学习模型
GPU显存分析
模型参数的显存占用
有参数的层:卷积、全连接、BatchNorm、Embedding层、......
无参数的层:多数的激活层(Sigmoid/ReLU)、池化层、Dropout、......
参数量
- Linear(M->N):M×N
- Conv2d(Cin, Cout, K):Cin × Cout × K × K
- BatchNorm(N):2N
- Embedding(N,W): N × W
梯度与动量的显存占用
优化器如果是SGD:
除了保存之外还要保存对应的梯度
如果是带Momentum-SGD:
还需要保存动量
输入输出的显存占用
每一层输出的Tensor的形状