Pytorch 中的 torch.cuda.amp.GradScaler()

1 amp 模块的作用

  1. amp : 全称为 Automatic mixed precision,自动混合精度,可以在神经网络推理过程中,针对不同的层,采用不同的数据精度进行计算,从而实现节省显存和加快速度的目的

  1. 自动预示着Tensor的dtype类型会自动变化,也就是框架按需自动调整tensor的dtype

混合精度预示着有不止一种精度的Tensor :

  • torch.FloatTensor(浮点型 32位)(torch默认的tensor精度类型是torch.FloatTensor)

  • torch.HalfTensor(半精度浮点型 16位)

2 使用自动混合精度 (amp) 的原因

torch.HalfTensor:

  • torch.HalfTensor的优势就是存储小、计算快、更好的利用CUDA设备的Tensor Core。因此训练的时候可以减少显存的占用(可以增加batchsize了),同时训练速度更快

  • torch.HalfTensor的劣势就是:数值范围小(更容易Overflow / Underflow)、舍入误差(Rounding Error,导致一些微小的梯度信息达不到16bit精度的最低分辨率,从而丢失)

3 解决方案

当有优势的时候就用torch.HalfTensor,而为了消除torch.HalfTensor的劣势,有两种解决方案:

  • 梯度scale,这正是上一小节中提到的torch.cuda.amp.GradScaler,通过放大loss的值来防止梯度消失underflow(这只是BP的时候传递梯度信息使用,真正更新权重的时候还是要把放大的梯度再unscale回去);

  • 回落到torch.FloatTensor,这就是混合一词的由来。那怎么知道什么时候用torch.FloatTensor,什么时候用半精度浮点型呢?这是PyTorch框架决定的,AMP上下文中,一些常用的操作中tensor会被自动转化为半精度浮点型的torch.HalfTensor(如:conv1d、conv2d、conv3d、linear、prelu等)

4 GradScaler()

在训练最开始之前使用amp.GradScaler实例化一个GradScaler对象

# Initialize the gradient scaler
scaler = amp.GradScaler()

  • 9
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: torch.cuda.amp.gradscaler是PyTorch的一个自动混合精度工具,用于在训练神经网络时自动调整梯度的缩放因子,以提高训练速度和准确性。它可以自动选择合适的精度级别,并在必要时自动缩放梯度。 ### 回答2: torch.cuda.amp.gradscaler是一个混合精度训练框架的一个核心组件,它可以自动实现精度提升和缩放因子自动调整。该组件的作用是控制梯度缩放,并自动将浮点数参数拆分成更小的块以适应Tensor Core的运算能力,以提高训练速度和效率。 gradscaler主要包含两个主要的方法scale_loss和unscale_。scale_loss方法用来缩放梯度以减少梯度消失和梯度爆炸的问题,而unscale_方法则用来反向缩放梯度以保持它们的正确性。 使用gradscaler组件的时候,一般按照如下步骤完成代码: 1.创建GradScaler实例,该实例用于管理梯度缩放。 2.创建一个优化器实例,并将GradScaler实例传给优化器。 3.按照正常的训练流程计算损失,将损失传递给GradScaler实例的scale_loss方法,以进行梯度缩放。 4.调用optim.step()来优化模型。 5.调用应用程序自己的验证逻辑来评估模型的性能,如果性能不够理想,则返回1。 6.如果评估的性能达到了预期,则调用GradScaler实例的unscale_方法来反向缩放梯度。 7.按照原始的优化器方法来更新模型的权重并重置梯度缩放器。 gradscaler的出现,大大简化了混合精度训练的流程,且有效减少了训练过程梯度的计算量和内存使用。同时,gradscaler也为机器学习的高效推理和训练提供了更好的支持。 ### 回答3: torch.cuda.amp.gradscaler是PyTorch的一种混精度训练工具,用于通过半精度浮点数(FP16)和混合精度计算(FP32和FP16的组合)来加速和优化深度学习模型的训练过程。该工具能够使用GPU硬件加速模型训练,并且在保持模型精度的同时,显著减少模型训练的时间和内存使用。 torch.cuda.amp.gradscaler可以将所有的操作转换为半精度浮点数,并在训练过程自动缩放数值范围,以在不丢失精度的情况下提高计算速度。该工具使用的自动缩放技术可以根据梯度值的变化动态地确定缩放因子,从而最小化精度损失,并防止梯度爆炸或梯度消失的问题。 在使用torch.cuda.amp.gradscaler时,可以通过with语句将混合精度训练上下文管理器包装在模型训练循环,以启用混合精度训练: ```python from torch.cuda.amp import GradScaler, autocast scaler = GradScaler() for input, target in training_data: with autocast(): output = model(input) loss = loss_fn(output, target) # Scales the loss, and calls backward() on the scaled loss to create scaled gradients scaler.scale(loss).backward() # Unscales gradients and calls or skips optimizer.step() as necessary scaler.step(optimizer) scaler.update() ``` 在这里,autocast()上下文管理器将转换所有在其计算的参数和梯度为半精度浮点数,并使用GradScaler进行自动缩放。然后,可以对缩放后的梯度进行反向传播、更新模型参数、更新缩放因子等操作,以完成混合精度训练。 总之,torch.cuda.amp.gradscaler是一种可以通过半精度浮点数和混合精度计算的方式加速深度学习模型训练的工具,可以轻松地与PyTorch模型进行结合,并在保持精度的同时显著加快训练速度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值