Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用AMP的PyTorch模型更快,内存效率更高

使用AMP的PyTorch模型更快,内存效率更高

作者头像
代码医生工作室
发布于 2020-03-11 06:32:50
发布于 2020-03-11 06:32:50
2.5K00
代码可运行
举报
文章被收录于专栏:相约机器人相约机器人
运行总次数:0
代码可运行

作者 | Rahul Agarwal

来源 | Medium

编辑 | 代码医生团队

您是否知道反向传播算法是Geoffrey Hinton 在1986年的《自然》杂志上提出的?

同样,卷积网络由Yann le cun于1998年首次提出进行数字分类,他使用了单个卷积层。直到2012年下半年,Alexnet才通过使用多个卷积层在imagenet上实现最先进的技术来推广Convnets。

那么,是什么让他们现在而不是以前如此著名?

只有在拥有大量计算资源的情况下,才能实验并充分利用深度学习在最近的全部潜力。

但是是否充分利用了计算资源?可以做得更好吗?

这篇文章是关于利用Tensor核心和自动混合精度来更快地训练深度学习网络的。

什么是张量核心?

根据NVIDIA网站:

NVIDIA Turing和Volta GPU由Tensor Cores提供支持,Tensor Cores是一项革命性技术,可提供开创性的AI性能。Tensor Core可以加速AI核心的大型矩阵运算,并在单个运算中执行混合精度矩阵乘法和累加计算。在一个NVIDIA GPU中并行运行数百个Tensor Core,这可以极大地提高吞吐量和效率

简单地说; 它们是专门用于特定类型矩阵运算的专用内核。

可以将两个FP16矩阵相乘并将其添加到FP16 / FP32矩阵中,从而得到FP16 / FP32矩阵。Tensor内核支持混合精度数学,即输入为半精度(FP16),输出为全精度(FP32)。上面的操作对于许多深度学习任务具有内在的价值,并且Tensor内核为该操作提供了专用的硬件。

现在,使用FP16和FP32主要有两个好处。

  1. FP16需要较少的内存,因此更易于训练和部署大型神经网络。它还减少了数据移动。
  2. 使用Tensor Core,数学运算的运行速度大大降低了精度。NVIDIA提供的Volta GPU的确切数量是:FP16中为125 TFlops,而FP32中为15.7 TFlops(加速8倍)

但是也有缺点。从FP32转到FP16时,必然会降低精度。

FP32与FP16:FP32具有八个指数位和23个小数位,而FP16具有五个指数位和十个小数位。

但是需要FP32吗?

FP16实际上可以很好地表示大多数权重和渐变。因此,拥有存储和使用FP32所需的所有这些额外位只是浪费。

那么如何使用Tensor Core?

检查了Titan RTX GPU是否具有576张量内核以及4,608个NVIDIA CUDA内核。但是如何使用这些张量核心?

坦白地说,NVIDIA可以轻松地将Tensor内核与自动混合精度一起使用,并提供了几行代码。需要在代码中做两件事:

1.FP32所需的操作(如Softmax)被分配给FP32,而FP16可以完成的操作(如Conv)被自动分配给FP16。

2.使用损耗定标保留较小的梯度值。梯度值可能超出FP16的范围。在这种情况下,将对梯度值进行缩放,使其落在FP16范围内。

如果还不了解背景细节,那也可以。代码实现相对简单。

使用PyTorch进行混合精度训练:

从PyTorch中的基本网络开始。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 to in range(500):
   y_pred = model(x)
   loss = torch.nn.functional.mse_loss(y_pred, y)
   optimizer.zero_grad()
   loss.backward()
   optimizer.step()

要利用自动混合精度训练的优势,首先需要安装apex库。只需在终端中运行以下命令。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ git clone https://github.com/NVIDIA/apex
$ cd apex
$ pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./

然后只需在神经网络代码中添加几行即可利用自动混合精度(AMP)。在下面加粗了以下几行:

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 to in range(500):

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()

在这里可以看到初始化模型,amp.也可以通过使用指定的损失比例amp.scale_loss

标杆管理

可以使用这个很棒的存储库对放大器的性能进行基准测试,该存储库对CIFAR数据集上的VGG16模型进行基准测试。只需要更改几行代码即可为我们工作。可以在此处找到修改后的版本。要自己运行基准测试代码,可能需要:

https://github.com/znxlwm/pytorch-apex-experiment

https://github.com/MLWhiz/data_science_blogs/tree/master/amp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
git clone https://github.com/MLWhiz/data_science_blogs
cd data_science_blogs/amp/pytorch-apex-experiment/
python run_benchmark.py
python make_plot.py --GPU 'RTX' --method 'FP32' 'FP16' 'amp' --batch 128 256 512 1024 2048

这将在主目录中为您填充以下图形:

在这里,使用各种精度和批处理大小设置训练了同一模型的多个实例。可以看到,从FP32到安培,内存需求降低了,而精度却保持大致相同。时间也会减少,但不会减少那么多。这可能归因于简单的数据集或简单的模型。

根据NVIDIA提供的基准,自动混合精度的运行速度比标准FP32型号快3倍,如下所示。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 相约机器人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
拿什么拯救我的 4G 显卡
随着深度学习快速发展,同时伴随着模型参数的爆炸式增长,对显卡的显存容量提出了越来越高的要求,如何在单卡小容量显卡上面训练模型是一直以来大家关心的问题。
OpenMMLab 官方账号
2022/01/18
7380
拿什么拯救我的 4G 显卡
大模型成本优化实战:从分布式训练到量化剪枝,轻松降低AI计算开销
随着大模型(如GPT、BERT等)在自然语言处理、计算机视觉等领域的广泛应用,其训练、推理和部署成本成为了制约大规模应用的主要瓶颈。高性能计算资源(如GPU、TPU)的昂贵成本使得许多企业和研究机构难以负担。本文探讨了通过分布式训练、量化、剪枝等技术手段降低大模型成本的优化方案,并提供了可运行的示例代码模块,帮助读者在实际项目中应用这些技术。
Swift社区
2025/03/01
1440
大模型成本优化实战:从分布式训练到量化剪枝,轻松降低AI计算开销
使用FP8加速PyTorch训练的两种方法总结
在PyTorch中,FP8(8-bit 浮点数)是一个较新的数据类型,用于实现高效的神经网络训练和推理。它主要被设计来降低模型运行时的内存占用,并加快计算速度,同时尽量保持训练和推理的准确性。虽然PyTorch官方在标准发布中尚未全面支持FP8,但是在2.2版本中PyTorch已经包含了对FP8的“有限支持”并且出现了2个新的变量类型,torch.float8_e4m3fn和 torch.float8_e5m2 ,而H100也支持这种类型,所以这篇文章我们就来介绍如何使用FP8来提高训练效率
deephub
2024/06/03
7370
使用FP8加速PyTorch训练的两种方法总结
Pytorch 神经网络nn模块
文章目录 1. nn模块 2. torch.optim 优化器 3. 自定义nn模块 4. 权重共享 参考 http://pytorch123.com/ 1. nn模块 import torch N, D_in, Hidden_size, D_out = 64, 1000, 100, 10 torch.nn.Sequential 建立模型,跟 keras 很像 x = torch.randn(N, D_in) y = torch.randn(N, D_out) model = torch.nn.Sequ
Michael阿明
2021/02/19
3480
Pytorch 神经网络nn模块
如何更快地训练Vision Transformer
近期MetaAI发布了一篇博客,关于如何显著提升Vision Transformer的训练效率。
BBuf
2022/05/27
1.1K0
如何更快地训练Vision Transformer
为什么说神经网络可以逼近任意函数?
本文主要介绍神经网络万能逼近理论,并且通过PyTorch展示了两个案例来说明神经网络的函数逼近功能。
deephub
2020/07/24
1.4K0
为什么说神经网络可以逼近任意函数?
深度学习与CV教程(8) | 常见深度学习框架介绍
本系列为 斯坦福CS231n 《深度学习与计算机视觉(Deep Learning for Computer Vision)》的全套学习笔记,对应的课程视频可以在 这里 查看。更多资料获取方式见文末。
ShowMeAI
2022/06/03
1.4K0
深度学习与CV教程(8) | 常见深度学习框架介绍
让PyTorch训练速度更快,你需要掌握这17种方法
近日,Reddit 上一个帖子热度爆表。主题内容是关于怎样加速 PyTorch 训练。原文作者是来自苏黎世联邦理工学院的计算机科学硕士生 LORENZ KUHN,文章向我们介绍了在使用 PyTorch 训练深度模型时最省力、最有效的 17 种方法。
机器之心
2021/01/20
5660
2023 年了,大模型训练还要不要用 PyTorch 的 FSDP ?
ChatGPT 掀起的大模型训练浪潮让不少同学都对训练大模型跃跃欲试,在找训练 baseline 的时候肯定发现大模型训练的 codebase 更倾向于用 DeepSpeed(MMEngine v0.8.0 也已经支持拉,一键切换,肥肠方便!) 、ColossalAI (MMEngine 下个版本也会支持!) 等大模型训练框架,而鲜有问津 PyTorch 原生的 FSDP (FullyShardedDataParallel)。这到底是为啥嘞?是 FSDP 不够节省显存?训练速度太慢?还是说不好用?请耐心看完这篇文章,相信一定会有所收获。
OpenMMLab 官方账号
2023/08/21
3.9K0
2023 年了,大模型训练还要不要用 PyTorch 的 FSDP ?
使用FP8加速PyTorch训练的两种方法总结
我们定义了一个Vision Transformer (ViT)支持的分类模型(使用流行的timm Python包版本0.9.10)以及一个随机生成的数据集。我们选择了ViT-Huge的有6.32亿个参数的最大的模型,这样可以演示FP8的效果。
数据派THU
2024/05/30
3020
使用FP8加速PyTorch训练的两种方法总结
PyTorch深度学习模型训练加速指南2021
简要介绍在PyTorch中加速深度学习模型训练的一些最小改动、影响最大的方法。我既喜欢效率又喜欢ML,所以我想我也可以把它写下来。
AI算法与图像处理
2021/01/20
1.4K0
PyTorch深度学习模型训练加速指南2021
如何用更少的内存训练你的PyTorch模型?深度学习GPU内存优化策略总结
在训练大规模深度学习模型时,GPU 内存往往成为关键瓶颈,尤其是面对大型语言模型(LLM)和视觉 Transformer 等现代架构时。由于大多数研究者和开发者难以获得配备海量 GPU 内存的高端计算集群,掌握高效的内存优化技术至关重要。本文将系统介绍多种优化策略,这些方法在组合应用的情况下,可将训练过程中的内存占用降低近 20 倍,而不会影响模型性能和预测精度。此外,大多数技术可以相互结合,以进一步提升内存效率。
CoovallyAIHub
2025/03/06
1880
如何用更少的内存训练你的PyTorch模型?深度学习GPU内存优化策略总结
优化PyTorch速度和内存效率的技巧汇总
深度学习模型的训练/推理过程涉及很多步骤。在有限的时间和资源条件下,每个迭代的速度越快,整个模型的预测性能就越快。我收集了几个PyTorch技巧,以最大化内存使用效率和最小化运行时间。为了更好地利用这些技巧,我们还需要理解它们如何以及为什么有效。
炼丹笔记
2022/10/27
2.5K0
优化PyTorch速度和内存效率的技巧汇总
【他山之石】适合PyTorch小白的官网教程:Learning PyTorch With Examples
“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。
马上科普尚尚
2020/12/03
5700
【他山之石】适合PyTorch小白的官网教程:Learning PyTorch With Examples
训练提速60%!只需5行代码,PyTorch 1.6即将原生支持自动混合精度训练。
PyTorch 1.6 nightly增加了一个子模块 amp ,支持自动混合精度训练。值得期待。来看看性能如何,相比Nvidia Apex 有哪些优势?
McGL
2020/09/03
1.2K0
PyTorch专栏(四):小试牛刀
【磐创AI 导读】:本篇文章讲解了PyTorch专栏的第三章中的PyTorch小试牛刀。查看专栏历史文章,请点击下方蓝色字体进入相应链接阅读。查看关于本专栏的介绍:PyTorch专栏开篇。想要更多电子杂志的机器学习,深度学习资源,大家欢迎点击上方蓝字关注我们的公众号:磐创AI。
磐创AI
2019/09/09
1.4K0
PyTorch专栏(四):小试牛刀
CUDA Out of Memory :CUDA内存不足的完美解决方法
大家好,我是默语。今天我们要讨论的是深度学习和GPU编程中非常常见的问题——CUDA内存不足。这类问题常见于使用TensorFlow、PyTorch等深度学习框架时,由于处理大规模数据集或模型超出GPU显存导致内存溢出。本文将详细介绍CUDA内存不足的常见原因、解决方案,并附带代码示例,帮助你在实践中有效避免和解决这一问题。
默 语
2024/11/22
3.4K0
DeepSeek开源周 Day02:从DeepEP开源趋势重新审视大模型Infra
今天DeepSeek开源周第二天,开放了DeepEP仓库,属实看了下源码,和昨天FlashMLA一样,C++权重(包括CUDA)还是占据了绝对部分,作为调包侠的我,看到之后望而却步,想看原理或者实现也是完全看不懂了!
致Great
2025/02/26
1760
DeepSeek开源周 Day02:从DeepEP开源趋势重新审视大模型Infra
比较CPU和GPU中的矩阵计算
GPU 计算与 CPU 相比能够快多少?在本文中,我将使用 Python 和 PyTorch 线性变换函数对其进行测试。
deephub
2022/11/11
1.6K0
比较CPU和GPU中的矩阵计算
优化Pytorch模型训练的小技巧
在本文中,我将描述并展示4种不同的Pytorch训练技巧的代码,这些技巧是我个人发现的,用于改进我的深度学习模型的训练。
deephub
2021/03/29
1.8K0
优化Pytorch模型训练的小技巧
推荐阅读
相关推荐
拿什么拯救我的 4G 显卡
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验