点击上方“AI派”,关注公众号,选择加“星标“或“置顶”

导读

只需要添加几行代码,就可以得到更快速,更省显存的PyTorch模型。

你知道吗,在1986年Geoffrey Hinton就在Nature论文中给出了反向传播算法?

此外,卷积网络最早是由Yann le cun在1998年提出的,用于数字分类,他使用了一个卷积层。但是直到2012年晚些时候,Alexnet才通过使用多个卷积层来实现最先进的imagenet。

那么,是什么让他们现在如此出名,而不是之前呢?

只有在我们拥有大量计算资源的情况下,我们才能够在最近的过去试验和充分利用深度学习的潜力。

但是,我们是否已经足够好地使用了我们的计算资源呢?我们能做得更好吗?

这篇文章的主要内容是关于如何利用Tensor Cores和自动混合精度更快地训练深度学习网络

什么是Tensor Cores?

根据NVIDIA的网站:

NVIDIA Turing和Volta GPUs都是由Tensor Cores驱动的,这是一项革命性的技术,提供了突破性的AI性能。Tensor Cores可以加速AI核心的大矩阵运算,在一次运算中就可以完成混合精度的矩阵乘法和累加运算。在一个NVIDIA GPU上有数百个Tensor Cores并行运行,这大大提高了吞吐量和效率。

简单地说,它们是专门的cores,非常适合特定类型的矩阵操作

我们可以将两个FP16矩阵相乘,并将其添加到一个FP16/FP32矩阵中,从而得到一个FP16/FP32矩阵。Tensor cores支持混合精度数学,即以半精度(FP16)进行输入,以全精度(FP32)进行输出。上述类型的操作对许多深度学习任务具有内在价值,而Tensor cores为这种操作提供了专门的硬件。

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

  1. FP16需要更少的内存,因此更容易训练和部署大型神经网络。它还只需要较少的数据移动。
  2. 数学运算在降低精度的Tensor cores运行得更快。NVIDIA给出的Volta GPU的确切数字是:FP16的125 TFlops vs FP32的15.7 TFlops(8倍加速)。

但也有缺点。当我们从FP32转到FP16时,我们需要降低精度。

FP32 vs FP16: FP32 有8个指数位和23个分数位,而FP16有5个指数位和10个分数位。

但是FP32真的有必要吗?

实际上,FP16可以很好地表示大多数权重和梯度。所以存储和使用FP32是很浪费的。

那么,我们如何使用Tensor Cores?

我检查了一下我的Titan RTX GPU有576个tensor cores和4608个NVIDIA CUDA核心。但是我如何使用这些tensor cores呢?

坦白地说,NVIDIA用几行代码就能提供自动混合精度,因此使用tensor cores很简单。我们需要在代码中做两件事:

  1. 需要用到FP32的运算比如Softmax之类的就分配用FP32,而Conv之类的操作可以用FP16的则被自动分配用FP16。

  1. 使用损失缩放 为了保留小的梯度值。梯度值可能落在FP16的范围之外。在这种情况下,梯度值被缩放,使它们落在FP16范围内。

如果你还不了解背景细节也没关系,代码实现相对简单

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

让我们从PyTorch中的一个基本网络开始。

N, D_in, D_out = 64, 1024, 512x = 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库。只需在终端中运行以下命令。

$ 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 ampN, D_in, D_out = 64, 1024, 512x = 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.initialize初始化了我们的模型。我们还使用amp.scale_loss来指定损失缩放。

基准测试

我们可以通过使用这个git仓库:https://github.com/znxlwm/pytoring-apex-experiment来对amp的性能进行基准测试,它在CIFAR数据集上对VGG16模型进行基准测试。我只需要修改几行代码就可以了。你可以在这里找到修改后的版本:https://github.com/MLWhiz/data_science_blogs/tree/master/amp。要运行自己的基准代码,你需要:

git clone https://github.com/MLWhiz/data_science_blogscd data_science_blogs/amp/pytorch-apex-experiment/python run_benchmark.pypython make_plot.py --GPU 'RTX' --method 'FP32' 'FP16' 'amp' --batch 128 256 512 1024 2048

这会在home目录中生成下面的图:

在这里,我使用不同的精度和批大小设置训练了同一个模型的多个实例。我们可以看到,从FP32到amp,内存需求减少,而精度保持大致相同。时间也会减少,但不会减少那么多。这可能是由于数据集或模型太简单。

根据NVIDIA给出的基准测试,AMP比标准的FP32快3倍左右,如下图所示

在单精度和自动混合精度两种精度下,加速比为固定周期训练的时间比。—END—文末福利各位猿们,还在为记不住API发愁吗,哈哈哈,最近发现了国外大师整理了一份Python代码速查表和Pycharm快捷键sheet,火爆国外,这里分享给大家。这个是一份Python代码速查表

下面的宝藏图片是2张(windows && Mac)高清的PyCharm快捷键一览图

怎样获取呢?可以添加我们的AI派团队的程序媛姐姐

一定要备注【高清图】

?????

➕我们的程序媛小姐姐微信要记得备注【高清图】

pycharm运行模型时怎么设置权重?_使用AMP和Tensor Cores得到更快速,更节省内存的PyTorch模型...相关推荐

  1. 解决:pycharm运行程序时在Python console窗口中运行 һ����ң�������1�����

    解决:pycharm运行程序时在Python c 问题: 在pycharm中右键点击run运行程序,发现没有打开run窗口运行,而是在Python console窗口中运行的. 解决方法: 打开菜单栏 ...

  2. Intel发布神经网络压缩库Distiller:快速利用前沿算法压缩PyTorch模型

    Intel发布神经网络压缩库Distiller:快速利用前沿算法压缩PyTorch模型 原文:https://blog.csdn.net/u011808673/article/details/8079 ...

  3. ios相机内存_邱哥教你iPhone优化照片占用空间,节省内存

    大家好,我是苹果店邱哥,对于小内存"丐"版的iphone用户,最纠结的就是内存使用了,如果正巧你还是一个拍照拍视频爱好者,最基础的内存肯定不够用,那么如何在不删除照片与视频的前提下 ...

  4. pycharm 敲代码时的效果插件_精选Pycharm里6大神器插件

    原标题:精选Pycharm里6大神器插件 上次写了一篇关于Sublime的精品插件推荐,有小伙伴提议再来一篇Pycharm的主题.相比Sublime,Pycharm要强大许多,而且是专为python设 ...

  5. pycharm 运行程序时提示错误信息:ModuleNotFoundError: No module named 'pytest' 解决方法

    如图,运行程序test_同时调用两个摄像头运行识别程序并画框.py时报错: 解决方法,将文件名中含有test_改成其他名字,改成test-同时调用两个摄像头运行识别程序并画框.py能正常运行了: 具体 ...

  6. android studio运行手机时出错怎么解决_小程序 android ios h5解决方案

    你现在开发android,ios,小程序用什么工具,怎么开发的?还在单个端的开发吗?今天我们主要讨论的是一次开发多端使用的技术,也是这两年比较流行的开发方向.现在的终端太多了,app两个端androi ...

  7. pycharm运行程序时在Python console窗口中运行

    问题:在pycharm中点击run运行程序,发现没有打开run窗口,而是打开的Python console窗口. 解决方法:打开菜单栏run->edit configurations,把下图中的 ...

  8. pycharm运行程序时看不到任何结果显示

    原因是用程序选择了console来运行,取消console方法如下: Run->Edit Configurations 取消run with python console的勾

  9. 基于深度学习模型的花卉图像分类代码_华为不止有鸿蒙!教你快速入门华为免编程深度学习神器ModelArts...

    引言: 本文介绍利用华为ModelArts进行深度学习的图像分类任务,不用一行代码. 今年8月9日,在华为史上规模最大的开发者大会上,华为正式发布全球首个基于微内核的全场景分布式OS--鸿蒙操作系统( ...

最新文章

  1. 用OpenGL进行曲线、曲面的绘制
  2. ubuntu下apache rewrite的设置
  3. xp改mac地址linux,局域网络必备-mac地址修改
  4. linux io映射,【原创】Linux 文件系统移植全解密以linux-2.6.35内核源码为例说明一下IO静态映射的过程...
  5. POJ 2353 DP
  6. Inclavare Containers:云原生机密计算的未来
  7. 高性能开发,别点,发际线要紧!
  8. jquery ui仿腾讯web qq界面desktop酷炫特效
  9. 钢琴块2电脑版_云上钢琴学生端电脑版|云上钢琴学生端 V2.3.1 最新PC版 下载_当下软件园...
  10. ue4如何恢复初始状态_UnrealEngine4初始化流程
  11. C# MysqlHelper 执行reader时,遇到致命错误或者超时
  12. Windows10桌面美化——打造简洁高效美观桌面
  13. Android编译时技术(二)ASM 基础使用之代码生成
  14. JavaFx之Ikonli图标库大全(十五)
  15. ts80x服务器系统,Lenovo ThinkServer TS80X 塔式服务器
  16. STL inserter
  17. 音乐外链生成 html,音乐外链生成工具V2.1 支持14个音乐网站外链提取转换
  18. android远程控制灯光,11款可用手机远程控制的智能灯
  19. 怎样操作微信可节省大量内存空间
  20. 消息重试框架 Spring-Retry 和 Guava-Retry,这个框架有点意思

热门文章

  1. spring AbstractBeanDefinition创建bean类型是动态代理类的方式
  2. poj 2226 Muddy Fields(合理建图+二分匹配)
  3. Xctf练习sql注入--supersqli
  4. duino例程 stm32_stm32duino
  5. 3 5的二维数组C语言程序,C语言及程序设计提高例程-33 二维数组元素的引用
  6. jq输出文本_如何用 Linux 命令行工具解析和格式化输出 JSON | Linux 中国
  7. 深入java核心_Java核心(五)深入理解BIO、NIO、AIO
  8. 结束 txt进程_Python多进程抓取拉钩网十万数据
  9. arma模型_Eviews经典案例 | 初学者必看!ARMA模型精讲
  10. html form callback,Promise异步编程模式总结初始化Promise对象统一错误处理PromisifyfromCallbackMongoose Promisify...