这篇博客是在pytorch中基于apex使用混合精度加速的一个偏工程的描述,原理层面的解释并不是这篇博客的目的,不过在参考部分提供了非常有价值的资料,可以进一步研究。
一个关键原则:“仅仅在权重更新的时候使用fp32,耗时的前向和后向运算都使用fp16”。其中的一个技巧是:在反向计算开始前,将dloss乘上一个scale,人为变大;权重更新前,除去scale,恢复正常值。目的是为了减小激活gradient下溢出的风险。
apex是nvidia的一个pytorch扩展,用于支持混合精度训练和分布式训练。在之前的博客中,神经网络的Low-Memory技术梳理了一些low-memory技术,其中提到半精度,比如fp16。apex中混合精度训练可以通过简单的方式开启自动化实现,组里同学交流的结果是:一般情况下,自动混合精度训练的效果不如手动修改。分布式训练中,有社区同学心心念念的syncbn的支持。关于syncbn,在去年做CV的时候,我们就有一些来自民间的尝试,不过具体提升还是要考虑具体任务场景。
那么问题来了,如何在pytorch中使用fp16混合精度训练呢?
第零:混合精度训练相关的参数
parser.add_argument('--fp16',
action='store_true',
help="Whether to use 16-bit float precision instead of 32-bit")
parser.add_argument('--loss_scale',
type=float, default=0,
help="Loss scaling to improve fp16 numeric stability. Only used when fp16 set to True.\n"
"0 (default value): dynamic loss scaling.\n"
"Positive power of 2: static loss scaling value.\n")
第一:模型参数转换为fp16
nn.Module中的half()方法将模型中的float32转化为float16,实现的原理是遍历所有tensor,而float32和float16都是tensor的属性。也就是说,一行代码解决,如下:
model.half()
第二:修改优化器
在pytorch下,当使用fp16时,需要修改optimizer。类似代码如下(代码参考这里):
# Prepare optimizer
if args.do_train:
param_optimizer = list(model.named_parameters())
no_decay = ['bias', 'LayerNorm.bias', 'LayerNorm.weight']
optimizer_grouped_parameters = [
{'params': [p for n, p in param_optimizer if not any(nd in n for nd in no_decay)], 'weight_decay': 0.01},
{'params': [p for n, p in param_optimizer if any(nd in n for nd in no_decay)], 'weight_decay': 0.0}
]
if args.fp16:
try:
from apex.optimizers import FP16_Optimizer
from apex.optimizers import FusedAdam
except ImportError:
raise ImportError("Please install apex from https://www.github.com/nvidia/apex to use distributed and fp16 training.")
optimizer = FusedAdam(optimizer_grouped_parameters,
lr=args.learning_rate,
bias_correction=False,
max_grad_norm=1.0)
if args.loss_scale == 0:
optimizer = FP16_Optimizer(optimizer, dynamic_loss_scale=True)
else:
optimizer = FP16_Optimizer(optimizer, static_loss_scale=args.loss_scale)
warmup_linear = WarmupLinearSchedule(warmup=args.warmup_proportion,
t_total=num_train_optimization_steps)
else:
optimizer = BertAdam(optimizer_grouped_parameters,
lr=args.learning_rate,
warmup=args.warmup_proportion,
t_total=num_train_optimization_steps)
第三:backward时做对应修改
if args.fp16:
optimizer.backward(loss)
else:
loss.backward()
第四:学习率修改
if args.fp16:
# modify learning rate with special warm up BERT uses
# if args.fp16 is False, BertAdam is used that handles this automatically
lr_this_step = args.learning_rate * warmup_linear.get_lr(global_step, args.warmup_proportion)
for param_group in optimizer.param_groups:
param_group['lr'] = lr_this_step
optimizer.step()
optimizer.zero_grad()
根据参考3,值得重述一些重要结论:
(1)深度学习训练使用16bit表示/运算正逐渐成为主流。
(2)低精度带来了性能、功耗优势,但需要解决量化误差(溢出、舍入)。
(3)常见的避免量化误差的方法:为权重保持高精度(fp32)备份;损失放大,避免梯度的下溢出;一些特殊层(如BatchNorm)仍使用fp32运算。
参考资料:
1.nv官方repo给了一些基于pytorch的apex加速的实现
实现是基于fairseq实现的,可以直接对比代码1-apex版和代码2-非apex版(fairseq官方版),了解是如何基于apex实现加速的。
按图索骥,可以get到很多更加具体地内容。
感谢团队同学推荐。
相关推荐
时间序列预测:informer改进模型(Fourier-Mixed Window Informer 采用傅里叶混合窗口注意力机制加速)实现高精度长期预测,PyTorch框架实现。 PyTorch基于改进Informer模型的时间序列预测(锂电池SOC估计)(完整...
本文将详细介绍如何基于PyTorch实现一个自动化模型压缩工具库,旨在帮助开发者更高效地对模型进行优化。 一、PyTorch与模型压缩基础 PyTorch以其动态计算图和易于调试的特点,成为许多研究者和工程师首选的深度...
本项目“量化加速-基于Pytorch+TVM进行低精度+混合精度的量化感知训练”旨在通过Pytorch和TVM库实现低精度和混合精度的量化感知训练,以提升模型的执行效率。以下是关于这个主题的详细解释: **量化技术**: 量化是...
标题中的“Python-NVIDIA开源面向精简混合精度和分布式训练的Pytorch扩展”指的是NVIDIA公司为PyTorch框架提供的一款开源工具——Apex。Apex是针对深度学习的优化库,尤其在处理混合精度训练和分布式训练方面具有...
4. **混合精度训练**:使用半精度(FP16)训练可以加速计算,但需要处理数值稳定性问题。 5. **分布式训练**:对于大规模数据和计算资源,可能需要使用多GPU或分布式训练策略,如DataParallel或...
PyTorch提供了多种工具和库来支持低精度计算,例如`torch.cuda.amp`(Automatic Mixed Precision,自动混合精度)和第三方库如QPyTorch。 **自动混合精度(AMP)** 1. **torch.cuda.amp**:PyTorch的内置库,它提供...
这个"STGCN-PyTorch-master.zip"压缩包包含了一个基于PyTorch实现的STGCN源码,是IJCAI 2018年计算机顶会的一篇论文的代码实现。以下是对STGCN模型以及其PyTorch实现的详细解释: 1. **STGCN模型结构**: - **图...
"物体姿态估计-基于Pytorch混合表示下的6D物体姿态估计-优质项目实战"是一个全面的教程,旨在帮助开发者和研究人员了解并实践6D物体姿态估计的最新方法,利用PyTorch的灵活性和高效性,结合混合表示以提升模型性能。...
PyTorch还支持混合精度训练(Mixed Precision Training),这是一种训练技术,可以在不牺牲模型精度的前提下,加快训练速度并减少内存使用。通过使用半精度浮点数来提高计算效率,同时利用自动混合精度功能(AMP)...
pytorch-auto-drive是一个纯Python代码库,包括基于PyTorch的语义分割模型,车道检测模型以及混合精度训练。 例如,您不需要matlab即可在CULane上进行测试。 该存储库正在积极开发中,上载模型的结果是稳定的。 对于...
文档中的“Automatic Mixed Precision”部分说明了PyTorch如何通过torch.cuda.amp模块和GradScaler类支持自动混合精度训练,以减少模型训练时间,同时避免算力不足导致的精度损失。不过文档也提醒开发者,GradScaler...
1. **Mosaic 数据增强**:这是一种增强训练数据的方法,通过随机混合多个图像,增加模型对不同场景和物体位置的泛化能力。 2. **Path Aggregation Network (PAN)**:YOLO v5 引入了路径聚合网络,用于提高特征金字塔...
基于PyTorch实现YOLOv4,你可以遵循以下步骤: 1. 安装必要的库,如torch、torchvision以及可能需要的额外依赖。 2. 构建YOLOv4的网络结构,根据CSPNet、SPP-Block等组件设计网络模型。 3. 准备数据集,包括图片...
4. **自动混合精度训练**:利用NVIDIA的Apex库,PyTorch 1.6支持混合精度训练,可以显著加快训练速度并减少内存占用。 5. **更多优化器和损失函数**:包括新的优化器如RAdam(Rectified Adam)和损失函数,为用户...
PyTorch Lightning通过自动内存优化技术,如梯度累积和混合精度训练,有效地减少了内存使用。混合精度训练(Mixed Precision Training,MPT)利用半精度浮点数(FP16)进行计算,可以显著提高内存效率和计算速度,...
混合精度训练 1. 训练 准备好训练数据后,终端可运行命令 python3 run.py 2 评估 加载已训练好的模型,并使用valid set作模型测试,输出文件到 ./dataset/${your_dataset}/output.txt 目录下。 3. 预测 预测未知...
- **混合精度训练**:通过混合精度训练可以有效提升训练效率,尤其是在具有FP16支持的GPU上。 - **数据增强**:通过对训练数据进行翻转、旋转、缩放等变换来增加模型泛化能力。 - **模型融合**:通过组合多个模型的...
NVIDIA的apex库是PyTorch的一个扩展,主要目的是为了加速深度学习模型的训练和实现混合精度训练(Mixed Precision Training)。混合精度训练通过使用半精度浮点数(FP16)来提高计算速度,同时通过动态损失放大...
3. **性能调优**:利用Jetson Orin的硬件特性,例如启用混合精度训练(Mixed Precision Training),可以显著提升模型训练速度。 4. **内存管理**:由于Jetson Orin的内存资源有限,可能需要优化内存使用,避免内存...