引入本地PyTorch自动混合精度以在NVIDIA GPU上进行更快的训练
默认情况下,大多数深度学习框架(包括PyTorch)都采用32位浮点(FP32)算法进行训练。但是,对于许多深度学习模型而言,这对于获得完全准确性不是必需的。2017年,NVIDIA研究人员开发了一种用于混合精度训练的方法,该方法在训练网络时将单精度(FP32)与半精度(例如FP16)格式结合在一起,并使用相同的超参数实现了与FP32训练相同的精度, NVIDIA GPU的其他性能优势:
- 训练时间更短;
- 较低的内存要求,可实现更大的批处理大小,更大的型号或更大的输入。
为了简化为研究人员和从业人员提供的混合精度训练的用户体验,NVIDIA在2018年开发了Apex,这是具有自动混合精度(AMP)功能的轻型PyTorch扩展。此功能可将某些GPU操作从FP32精度自动转换为混合精度,从而在保持精度的同时提高性能。
对于PyTorch 1.6版本,NVIDIA和Facebook的开发人员将混合精度功能作为AMP软件包torch.cuda.amp移入了PyTorch核心。torch.cuda.amp
与apex.amp
。相比,更加灵活和直观。能够解决的一些apex.amp
已知痛点torch.cuda.amp
:
- 保证的PyTorch版本兼容性,因为它是PyTorch的一部分
- 无需构建扩展
- Windows支援
- 按位精确保存/还原检查点
- DataParallel和进程内模型并行性(尽管我们仍然建议torch.nn.DistributedDataParallel每个进程一个GPU,这是性能最高的方法)
- 渐变惩罚(向后翻倍)
- torch.cuda.amp.autocast()在启用该功能的区域之外没有任何影响,因此它应该可以为以前多次调用apex.amp.initialize()(包括交叉验证)而遇到困难的情况提供服务。在同一脚本中运行的多个收敛都应使用一个新的GradScaler实例,但是GradScalers是轻量级的且自包含的,因此这不是问题。
- 稀疏梯度支持
随着AMP被添加到PyTorch Core,我们已经开始弃用过程,apex.amp.
我们已经apex.amp
进入维护模式,将为客户提供支持。apex.amp.
但是,我们强烈鼓励apex.amp
客户torch.cuda.amp
从PyTorch Core过渡到使用。
示例演练
请参阅官方文档以了解用法:
例:
import torch# Creates once at the beginning of trainingscaler = torch.cuda.amp.GradScaler()for data, label in data_iter:optimizer.zero_grad() # Casts operations to mixed precisionwith torch.cuda.amp.autocast():loss = model(data) # Scales the loss, and calls backward() # to create scaled gradientsscaler.scale(loss).backward() # Unscales gradients and calls # or skips optimizer.step()scaler.step(optimizer) # Updates the scale for next iterationscaler.update()
Performance Benchmarks
在本节中,我们将讨论在最新的NVIDIA GPU A100和上一代V100 GPU上使用AMP进行混合精度训练的准确性和性能。在NGC的NVIDIA pytorch:20.06-py3容器中运行深度学习工作负载时,将混合精度性能与FP32性能进行了比较。
精度:AMP(FP16),FP32
使用AMP进行深度学习训练的优势在于,模型可以收敛到相似的最终精度,同时提供改进的训练效果。为了说明这一点,对于Resnet 50 v1.5训练,我们看到以下精度结果,越高越好。请注意,下面的准确度数字是样本数,该样本数之间的差异最大为0.4%。包括BERT,Transformer,ResNeXt-101,Mask-RCNN,DLRM在内的其他型号的精度数字可在 NVIDIA深度学习示例Github中找到。
训练精度:NVIDIA DGX A100(8x A100 40GB)
时代 |
混合精度前1(%) |
TF32 Top1(%) |
90 |
76.93 |
76.85 |
训练精度:NVIDIA DGX-1(8x V100 16GB)
时代 |
混合精度前1(%) |
FP32 Top1(%) |
50 |
76.25 |
76.26 |
90 |
77.09 |
77.01 |
250 |
78.42 |
78.30 |
加速性能:
NVIDIA V100上的FP16与V100上的FP32
带FP16的AMP是V100上进行DL训练的最高性能的选择。在表1中,我们可以看到,对于各种型号,V100上的AMP的速度比V100上的FP32快1.5倍至5.5倍,同时收敛到相同的最终精度。
在NVIDIA 8xV100上混合精度训练与在8xV100 GPU上FP32训练的性能对比。条形图表示V100 AMP相对于V100 FP32的加速因子。越高越好
NVIDIA A100上的FP16与V100上的FP16
带有FP16的AMP仍然是A100上进行DL训练的最高性能的选择。在下图中,我们可以看到,对于各种型号,A100上的AMP的速度比V100上的AMP快1.3倍至2.5倍,同时收敛到相同的最终精度。
在NVIDIA 8xA100与8xV100 GPU上进行混合精度训练的性能。条形图表示A100相对于V100的加速因子。越高越好。
Call to action
AMP为Nvidia Tensor Core GPU(尤其是最新一代的Ampere A100 GPU)上的深度学习训练工作负载提供了健康的加速。您可以开始针对NVIDIA深度学习示例中可用的A100,V100,T4和其他GPU的启用AMP的模型和模型脚本进行实验。PyTorch NGC容器版本20.06可提供具有本地AMP支持的NVIDIA PyTorch 。我们强烈建议现有apex.amp
客户过渡到使用torch.cuda.amp
最新PyTorch 1.6版本中可用的PyTorch Core 。
接下来,给大家介绍一下租用GPU做实验的方法,我们是在智星云租用的GPU,使用体验很好。具体大家可以参考:智星云官网: http://www.ai-galaxy.cn/,淘宝店:https://shop36573300.taobao.com/公众号: 智星AI