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

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

导读

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

e20e4fc1cd8e4532b83a7cedb7e5d5eb.png

你知道吗,在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,非常适合特定类型的矩阵操作

fb441df9bc991d4c75702020c8b3d64c.png

我们可以将两个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时,我们需要降低精度。

cb3b6a8e51737bc78b3c9b48cdd7efed.png

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。

0590184436b84ecf9728ae7566b9eed2.png

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

2d440a921b9388eb4778b96c253e4f52.png

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

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

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

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库。只需在终端中运行以下命令。

$ 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.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_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

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

806a68a4fadc28026c7ba98437f53b1e.png

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

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

d47a619efbcb1e728f883c8ebc9db434.png

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

29f1ac6e656cbfc5ae1a4806ed405382.png

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

e585f0f07455359d3b96f651f7959a15.png

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

一定要备注【高清图】

?????

d38ebc9720a2a266e9ec585eccbf7655.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

引入静态变量_Common Lisp变量的一些事情

Lisp-1 vs Lisp-2[1]Scheme的求值模型非常简单:只是用一个名字空间,所有表达式中相应位置的值应该是明确的。Common Lisp和Scheme最大的不同是,函数名字空间和数据的名字空间是分离的。操作函数名字空间的语句包括,defun&#xff…

JobTracker和TaskTracker

转载:http://blog.csdn.net/keda8997110/article/details/8348705 ----------------------------------------------------------------------------------------- JobTracker和TaskTracker JobTracker 对应于 NameNode TaskTracker 对应于 DataNode DataNode 和Na…

c理c利用计算机怎么弹,通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的...

通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的计算机的工作方式:现代计算机的基本体系结构都是采用冯诺依曼结构,冯诺依曼的设计思想最重要之处是"存储程序"的这个概念。计算机的工作过程,就是执行程序的…

Linux安装MySQL的两种方法

原文链接:http://blog.csdn.net/superchanon/article/details/8546254 --------------------------------------------------------------------------------------- 1. 运行平台:CentOS 6.3 x86_64,基本等同于RHEL 6.3 2. 安装…

jenkins 手动执行_想知道如何用Jenkins自动执行Python脚本输出测试报告?

前言在用python做自动化测试时,我们写好代码,然后需要执行才能得到测试报告,这时我们可以通过 Jenkins 来进一步完成自动化工作。借助Jenkins,我们可以结合 Git/SVN 自动拉取代码,可以设置定时构建,接着就可…

VR 影院,约吗?

世界第一家 VR 影院已经开张,朋友,去不? 世界第一家 VR 影院正式开张 (无大屏的 VR 电影院) 在被称为 VR 元年的 2016 年,越来越多的人加入了这个新兴的领域,各种传统应用也在被 VR 包装之后以…

redis cluster 分布式锁_关于分布式锁原理的一些学习与思考redis分布式锁,zookeeper分布式锁...

首先分布式锁和我们平常讲到的锁原理基本一样,目的就是确保,在多个线程并发时,只有一个线程在同一刻操作这个业务或者说方法、变量。在一个进程中,也就是一个jvm 或者说应用中,我们很容易去处理控制,在jdk …

会计行业被计算机取代马云,会计人:为什么我神烦“人工智能取代说”?

原标题:会计人:为什么我神烦“人工智能取代说”?原创来源:学会计有方法从财会机器人诞生到马云的无人商店,全行业掀起了一股“人工智能取代说”的热潮。有些财会朋友在一轮又一轮的信息轰炸下,倍感压力&…

mysql5.6允许远程服务器访问数据库

创建一个mysql用户,并设置可以远程访问 grant usage on *.* to fredlocalhost identified by fred;//创建用户fred密码ferdselect host,user,password from mysql.user where userfred;//查看记录 grant all privileges on *.* to fred%identified by fred;//设置可以远程访问…

sp烘焙流程_小手雷-PBR材质流程(一)——(基本材质)

小手雷-PBR材质流程(一)Substance Painter生存手册经过了12个章节的讲解后,已经完结了(。・ω・。)相信大家经过了生存手册这一基础教程过后,对Substance Painter这款软件已经有了比较坚实的基础了,…

MyBatis-进阶2

typeHandler typeHandler有什么用? 你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandle…

python中 r是什么意思_python中rb含义理解

Python文件读写的几种模式: r,rb,w,wb 那么在读写文件时,有无b标识的的主要区别在哪里呢? 文件使用方式标识 r:默认值,表示从文件读取数据 w:表示要向文件写入数据,并截断以前的内容 a:表示要向文件写入数据&#xff0…

哈佛大学计算机生物科学,生命科学专业

【出国留学网】昨日,泰晤士报公布了最新版2018年世界大学生命科学排名,哈佛大学位列第一。本文是关于世界各国大学在本次生命科学排名中的具体表现,供你选校参考。The 2018 Times Higher Education World University Rankings’ table for li…

怎样呵护友谊_呵护真正的友情,助力漫长的人生

友情,即友谊,是指朋友和朋友之间的感情。它是一种很美妙的东西,可以让你在失落的时候变得高兴起来,可以让你走出苦海,去迎接新的人生。它就像一种你无法说出又可以感到快乐无比的东西。只有拥有真正朋友的人&#xff0…

【Day41】Python之路——AJAX

什么是AJAX AJAX Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。 优点: 不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行 同源…

LINUX重启MYSQL的命令

原文:http://blog.csdn.net/liuyong0818/article/details/5693336 ------------------------原文有错误,本文转载时已修改--------- 如何启动/停止/重启MySQL 一、启动方式 1、使用 service 启动:service mysql start 2、使用 mysql 脚…

html css子标签,HTML+CSS系列:CSS选择器(标签、ID、类、通配符、后代、子元素、并集、伪类)...

一.标签选择器Documenth1 {color: red;}h2{color: green;}Hello World!Hello World!Hello !Hello !二.类选择器Document.box {color: green;}.box1 {font-size: 26px;}Hello World!Hello World!三.ID选择器Document#box{color: green;}Hello World!四.通配符选择器Document*{ma…

aes离线解密工具_如何在Python中解密OpenSSL AES加密文件?

OpenSSL为AES加密提供了一种流行的(但不安全 - 见下文!)命令行界面:openssl aes-256-cbc -salt -in filename -out filename.encPython以PyCrypto包的形式支持AES,但它只提供工具。如何使用Python / PyCrypto解密使用OpenSSL加密的文件&#…

什么是Hive

Hive 是建立在 Hadoop 上的数据仓库基础构架。 它提供了一系列的工具,可以用来进行数据提取转化加载(ETL ),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。 Hive 定义了简单的类 SQL 查询语言&#xff0c…

VUE-搜索过滤器

VUE非常实用的搜索过滤&#xff0c;喜欢点个赞哦 废话不多说&#xff0c;先来看看效果 1 引入vue <script src"https://cdn.jsdelivr.net/npm/vue"></script>2 HTML <div id"app"><input v-modelsearch /><ul v-if"search…