nvidia训练深度学习模型利器apex使用解读

本文参考:

英伟达(NVIDIA)训练深度学习模型神器APEX使用指南_咆哮的阿杰的博客-CSDN博客_apex 英伟达

Pytorch混合精度(FP16&FP32)(AMP)/半精度 训练(二) —— 代码示例 apex pytorch_hxxjxw的博客-CSDN博客_apex pytorch

目录

 一、背景

二、apex介绍

三、apex配置

四、代码实现

1、三行代码示例

2、opt_level参数设置

3、测试代码(不带amp)

4、测试代码(带amp)

5、swin-transformer算法添加amp实战 

五、溢出问题


 一、背景

gpu显存不大,很多模型没法跑,不能用很大的batch size等导致loss没法降低。使用apex工具可以从中解脱出来。

二、apex介绍

apex是nvidia开源的,完美支持pytorch框架,用于改变数据格式来减小模型显存占用的工具

其中最有价值的是amp(Automatic Mixed Precision),将模型的大部分操作都用float16数据类型替代,一些特别操作仍然使用float32.

并且用户仅仅通过三行代码即可完美将自己的训练代码迁移到该模型。

实验证明,使用float16作为大部分操作的数据类型,并没有降低参数,在一些实验中,反而由于可以增大batch size,带来精度上的提升,以及训练速度上的提升。

它号称能够在不降低性能的情况下,将模型训练的速度提升2~4倍,训练显存消耗减少为之前的一半。

三、apex配置

见:windows11安装apex工具_benben044的博客-CSDN博客

四、代码实现

1、三行代码示例

from apex import amp
model, optimizer = amp.initialize(model, optimizer, opt_level="O1") 
with amp.scale_loss(loss, optimizer) as scaled_loss:
    scaled_loss.backward()

2、opt_level参数设置

只有一个opt_level需要用户自行配置

  • O0:纯FP32训练,可以作为accuracy的baseline
  • O1:混合精度训练(推荐使用),根据黑白名单自动决定使用FP16(GEMM,卷积)还是FP32(Softmax)进行计算
  • O2:"几乎FP16"混合精度训练,不存在黑白名单,除了Batch Norm,几乎都是用FP16计算
  • O3:纯FP16训练,很不稳定,但是可以作为speed的baseline。

3、测试代码(不带amp)

import torch

N, D_in, D_out = 64, 1024, 512
x = torch.randn(N, D_in, device='cuda')
y = torch.randn(N, D_out, device='cuda')
model = torch.nn.Linear(D_in, D_out).cuda()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
for _ in range(1000):
    y_pred = model(x)
    loss = torch.nn.functional.mse_loss(y_pred, y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

4、测试代码(带amp)

import torch
from apex import amp

N, D_in, D_out = 64, 1024, 512
x = torch.randn(N, D_in, device='cuda')
y = torch.randn(N, D_out, device='cuda')
model = torch.nn.Linear(D_in, D_out).cuda()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
model, optimizer = amp.initialize(model, optimizer, opt_level="O1")
for _ in range(1000):
    y_pred = model(x)
    loss = torch.nn.functional.mse_loss(y_pred, y)
    optimizer.zero_grad()
    with amp.scale_loss(loss, optimizer) as scaled_loss:
        scaled_loss.backward()
    optimizer.step()

5、swin-transformer算法添加amp实战 

以上总共3处修改点。

测试结果:2g显存的batch_size从4增加到了6,1.5倍,似乎没有想象中那么多。

五、溢出问题

因为float16保存数据位数少了,能保存数据的上限和下限的绝对值也小了。

如果我们在处理分割类问题,需要用到一些涉及到求和的操作,如sigmoid,softmax,这些操作都涉及到求和。

分割问题特征图很大,求个sigmoid可能会导致数据溢出,得到错误的结果。

所以针对这些操作,仍然使用float32作为数据格式。

修改方式:仅需在模型定义中,在构造函数__init__中的某一个位置,加上下面这段:

from apex import amp
class xxxNet(Module):
	def __init__(using_map=False)
		...
		...
		if using_amp:
		     amp.register_float_function(torch, 'sigmoid')
		     amp.register_float_function(torch, 'softmax')

用register_float_function指明后面的函数需要使用float类型,注意第二实参是string类型。

和register_float_function相似的注册函数还有:

  • amp.register_half_function(module, function_name)
  • amp.register_float_function(module, function_name)
  • amp.register_promote_function(module, function_name)

需要在使用amp.initialize之前使用注册函数,所以最号的位置就放在模型的构造函数中。

  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Transformer发轫于NLP(自然语言处理),并跨界应用到CV(计算机视觉)领域。 Swin Transformer是基于Transformer的计算机视觉骨干网,在图像分类、目标检测、实例分割、语义分割等多项下游CV应用中取得了SOTA的性能。该项工作也获得了ICCV 2021顶会最佳论文奖。 本课程将手把手地教大家使用labelImg标注和使用Swin Transformer训练自己的数据集。  本课程将介绍Transformer及在CV领域的应用、Swin Transformer的原理。 课程以多目标检测(足球和梅西同时检测)为例进行Swin Transformer实战演示。 课程在Windows和Ubuntu系统上分别做项目演示。包括:安装软件环境、安装Pytorch、安装Swin-Transformer-Object-Detection、标注自己的数据集、准备自己的数据集(自动划分训练集和验证集)、数据集格式转换(Python脚本完成)、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计、日志分析。  相关课程: 《Transformer原理与代码精讲(PyTorch)》https://edu.csdn.net/course/detail/36697《Transformer原理与代码精讲(TensorFlow)》https://edu.csdn.net/course/detail/36699《ViT(Vision Transformer)原理与代码精讲》https://edu.csdn.net/course/detail/36719《DETR原理与代码精讲》https://edu.csdn.net/course/detail/36768《Swin Transformer实战目标检测:训练自己的数据集》https://edu.csdn.net/course/detail/36585《Swin Transformer实战实例分割:训练自己的数据集》https://edu.csdn.net/course/detail/36586《Swin Transformer原理与代码精讲》 https://download.csdn.net/course/detail/37045

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值