最近购买了一台腾讯云 Nvidia Tesla T4 服务器,速度提升巨大,因此想自己入手一台电脑,下面从深度学习角度来考虑相关参数对炼丹的影响。
下面以Nvidia T4为例
首先是架构,Turing 架构
Tensor 核心数,320个Tensor Core 。张量核支持混合精度计算,动态调整计算以加快吞吐量,同时保持精度。
CUDA数量,2560 CUDA运算速度之和核心频率有关,而CUDA核心数量则决定了显卡的计算能力的强弱,如一项渲染任务,可以拆分为更多份交给不同的CUDA核心处理。
单精度浮点性能(FP32) 8.1FLOPS,代表显卡的浮点运算能力,越高能力越强。
半精度浮点数(FP16) 65TFLOPS
浮点性能:7.76TFLOPS,衡量GPU处理器基本马力的方法。
显存带宽:320GB/s,指显示芯片与显存之间的数据传输速率,它以字节/秒为单位。显存带宽是决定显卡性能和速度最重要的因素之一。
显存类型:GDDR6
显存大小(VRAM) 16GB,很重要,这将直接关系到型是否可用。决定batch_size的上限。
内存总线宽度(显存位宽)256bit ,更宽的总线宽度代表在每个电脑运行周期能处理更多的数据。(代表GPU芯片每个时钟周期内能从GPU显卡中读取的数据大小,值越大,代表GPU芯片与显存之间的数据交换的速度越快。)
功率 75W
当在GPU上跑一个模型时,显存的占用主要有两部分:
模型的输出
(特征图、特征图的梯度)、模型的参数
(权重矩阵、偏置值、梯度)
模型参数的显存占用:(例如:卷积核的参数、BN层、全连接层的参数等(池化层没有参数))
如果是在训练阶段,需要反向传播更新参数值,所以每个参数都需要存储梯度。所以模型参数的显存占用,与采用的优化器有关。
1)如果使用SGD,需要2倍模型参数的显存占用,模型参数+模型参数的梯度;
2)如果使用SGD+Momentum,需要3倍的模型参数显存占用,模型参数+梯度+动量;
3)如果使用Adam,需要4倍的显存占用,模型参数+梯度+动量+二阶动量。
训练阶段,会保存模型每一层输出的特征图。(因为反向传播中需要对中间层的特征图求导,所以中间层的输出特征图不会被释放)
训练阶段,会保存对于每一层输出特征图的导数。(因为反向传播中链式求导,公式中有),但是由于特征图不像模型参数一样需要优化更新,所以在训练阶段特征图需要2倍显存(特征图+特征图梯度)。
显存的占用主要是模型本身的参数占用,还与每一层输出的特征图大小有关(这一部分与batch_size呈线性正相关)
模型参数的显存占用与batchsize无关,但是在训练阶段与优化器有关
所以在预测阶段要使用
with torch.no_grad():
inputs = None
output = model(inputs)
从而减少显存的使用。
每层output特征图的显存占用为:B x Cout x H x W,与batch size的大小成正比
训练阶段,需要保存特征图的梯度,所以需要2倍的显存占用
占用显存较多的部分是卷积层输出的特征图,模型参数的显存占用较少,其中全连接层占据了模型参数的大部分
所以降低模型显存一般有如下几种方法:
去掉全连接层,改为全局平均池化
降低batch size
池化,减小特征图size
pytorch中的inplace操作,torch.no_grad()
从上面的分析可知,显存占用并不是严格的与batch size成正比,还与模型自身的参数和延伸出来的数据相关(每层特征图size、优化器等)
并不是batch size越大速度越快。在充分利用计算资源的时候,加大batch size在速度上的提升很有限。—也就是显存足够,但是GPU的计算能力达到上限。
比如batch size=8时,模型的FLOPs等于GPU的峰值FLOPS,并且假设GPU能够维持其峰值FLOPS,那么刚好1秒跑一个batch size;若此时令batch size=16,那么需要2秒跑一个batch size,并不能提升训练速度。
FLOPS:全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。
FLOPs:注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。
模型的FLOPs越大,那么执行一遍前向传播或者反向传播的时间也就越长,从而导致漫长的训练时间。
在博主看来,深度学习虽然主要依靠显卡,但CPU也不容忽视,先前在google的colab中使用的也是nvidia T4,但其表现与腾讯云的nvidia T4简直是天壤之别,这是由于colab中的cpu瓶颈造成的。
此外,在模型训练中,首先应该在显存满足的前提下在考虑速度,以博主的yolo模型为例,博主的960显存为4g,能够将模型加载进来,但batch-size只能为4,而且随着模型模型的不断训练,在迭代到10次时便发生了内存不足的情况,,且由于是本地运行,cpu占用也极高,基本在运行程序时很难再去做其他的事,而选择使用服务器后,使用pycharm连接gpu资源不再占用本地资源,服务器的16G显存可以将batch-size支持到32(建议16,防止溢出,且此时也达到了速度瓶颈),而内存高达32G,其速度也获得了明显提升。
先前博主有自己搭建一个服务器的打算,从先前的训练过程可知,博主的模型在batch-size=16时,其在后期的显存占用便达到了12G,若调小batch-size=8,则可以将其稳定在8G左右,目前市面上笔记本主流为3060,显存为6G,虽然速度上有明显提升,但显存很明显不够用,而桌面级3060的有12G和8G版本,相较而言,12G明显更符合我的要求,但由于矿潮褪去也是不敢入手,若是选择8G倒不如直接入手3060Ti或者3070,很少纠结,归根结底还是没钱,呜呜呜
租用服务器算是解决了自己的燃眉之急,目前用起来感觉不错,美中不足的便是平时最开始时项目上传费了些时间,pycharm的速度有些慢,在这里也推荐一款文件上传下载软件Xftp,用起来感觉还不错。
最后补充一句:博主还是想自己搭配一台电脑,有没有合适的推荐,欢迎留言。