🐡GPU加速
2021-11-20
| 2023-8-6
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 
使用nvidia-smi命令来查看显卡信息
notion image
 
 

计算设备

可以指定用于存储和计算的设备(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:0cuda是等价的
 
定义两个方便的函数, 这两个函数允许在不存在所需所有GPU的情况下运行代码:
 

张量与GPU

可以查询张量所在的设备, 默认情况下张量是在CPU上创建的
需要注意:无论何时对多个项进行操作,它们都必须在同一个设备上。 例如,如果对两个张量求和,需要确保两个张量都位于同一个设备上, 否则框架将不知道在哪里存储结果,甚至不知道在哪里执行计算。
 

存储在GPU上

有几种方法可以在GPU上存储张量。 例如,可以在创建张量时指定存储设备。
在GPU上创建的张量只消耗这个GPU的显存,需要确保不创建超过GPU显存限制的数据。
 
假设至少有两个GPU,下面的代码将在第二个GPU上创建一个随机张量
 

复制

如果要计算X + Y,需要决定在哪里执行这个操作。 如图所示,可以将X传输到第二个GPU并在那里执行操作。不要简单地X加上Y,运行时引擎不知道该怎么做(会导致异常 ):它在同一设备上找不到数据会导致失败。 由于Y位于第二个GPU上,所以需要将X移到那里, 然后才能执行相加运算。
notion image
 

神经网络与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的形状
 
 
  • PyTorch
  • 读写文件异步计算
    目录