有资源网yoqq.cn
 
 
查看: 5965|回复: 0

工程之道:旷视天元框架亚线性显存优化技能剖析

[复制链接]

该用户从未签到

290

主题

290

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2020-5-8 08:40:24 | 显示全部楼层 |阅读模式
呆板之心发布
旷视研究院
基于梯度查抄点的亚线性显存优化方法 [1] 由于较高的盘算/显存性价比受到关注。MegEngine 颠末工程扩展和优化,发展出一套行之有用的增强版亚线性显存优化技能,既可在盘算存储资源受限的条件下,轻松练习更深的模子,又可利用更大 batch size,进一步提拔模子性能,稳固 batchwise 算子。利用 MegEngine 练习 ResNet18/ResNet50,显存占用分别最高低落 23%/40%;在更大的 Bert 模子上,降幅更是高达 75%,而额外的盘算开销险些稳定。
优化-免费yoqq工程之道:旷视天元框架亚线性显存优化技能剖析yoqq资源(1)
深度神经网络练习是一件复杂的事变,它表现为模子的时间复杂度和空间复杂度,分别对应着盘算和内存;而练习时内存占用题目是漂泊在深度学习社区上空的一块乌云,怎样拨云见日,最大低落神经网络练习的内存占用,是一个绕不开的课题。
GPU 显卡等硬件为深度学习提供了必须的算力,但硬件自身有限的存储,限定了可练习模子的尺寸,尤其是大型深度网络,由此诞生出一系列相干技能,好比亚线性显存优化、梯度累加、混淆精度练习、分布式练习,举行 GPU 显存优化。
此中,亚线性显存优化方法 [1] 由于较高的盘算/显存性价比备受关注;旷视基于此,颠末工程扩展和优化,发展出增强版的 MegEngine 亚线性显存优化技能,轻松把大模子乃至超大模子装进显存,也可以毫无压力利用大 batch 练习模子。
这里将围绕着深度学习框架 MegEngine 亚线性显存优化技能的工程实现和实行数据,从技能配景、原理、利用、预测等多个方面举行初次深入解读。
配景
在深度学习范畴中,随着练习数据的增长,必要相应增长模子的尺寸和复杂度,举行模子「扩容」;而 ResNet [2] 等技能的出如今算法层面扫清了练习深度模子的停滞。不停增长的数据和连续创新的算法给深度学习框架带来了新挑衅,可否在模子练习时有用使用有限的盘算存储资源,尤其是淘汰 GPU 显存占用,是评估深度学习框架性能的紧张指标。
在盘算存储资源肯定的环境下,深度学习框架有几种低落显存占用的常用方法,其示比方下:
通过符合的梯度界说,让算子的梯度盘算不再依靠于前向盘算作为输入,从而 in-place 地完成算子的前向盘算,好比 Sigmoid、Relu 等;
在生命周期没有重迭的算子之间共享显存;
通过额外的盘算淘汰显存占用,好比使用梯度查抄点重新盘算中心效果的亚线性显存优化方法 [1];
通过额外的数据传输淘汰显存占用,好比把临时不消的数据从 GPU 互换到 CPU,必要时再从 CPU 互换返来。
上述显存优化技能在 MegEngine 中皆有差别水平的实现,这里重点讨论基于梯度查抄点的亚线性显存优化技能。
原理
一个神经网络模子所占用的显存空间大要分为两个方面:1)模子自己的参数,2)模子练习暂时占用的空间,包罗参数的梯度、特性图等。此中最大占比是 2)中以特性图情势存在的中心效果,好比,从示例 [1] 可知,根据实现的差别,从 70% 到 90% 以上的显存用来存储特性图。
这里的练习过程又可分为前向盘算,反向盘算和优化叁个方面,此中前向盘算的中心效果最占显存,另有反向盘算的梯度。第 1)方面模子自身的参数内存占用最小。
MegEngine 增强版亚线性显存优化技能鉴戒了 [1] 的方法,尤其实用于盘算存储资源受限的环境,好比一张英伟达 2080Ti,只有 11G 的显存;而更贵的 Tesla V100,最大显存也只有 32G。
优化-免费yoqq工程之道:旷视天元框架亚线性显存优化技能剖析yoqq资源(2)
图 1:亚线性显存优化原理,此中 (b) 生存了 Relu 效果,现实中 Relu 效果可用 in-place 盘算
图 1(a) 给出了卷积神经网络的根本单位,它由 Conv-BN-Relu 构成。可以看到,反向盘算梯度的过程依靠于前向盘算获取的中心效果,一个网络必要生存的中心效果与其巨细成正比,即显存复杂度为 O(n)。
本质上,亚线性显存优化方法是以时间换空间,以盘算换显存,如图 1(b) 所示,它的算法原理如下:
选取神经网络中 k 个查抄点,从而把网络分成 k 个 block,必要留意的是,初始输入也作为一个查抄点;前向盘算过程中只生存查抄点处的中心效果;
反向盘算梯度的过程中,起首从相应查抄点出发,重新盘算单个 block 必要的中心效果,然后盘算 block 内部各个 block 的梯度;差别 block 的中心效果盘算共享显存。
这种方法有着显着的长处,即大幅低落了模子的空间复杂度,同时缺点是增长了额外的盘算:
显存占用从 O(n) 酿成 O(n/k)+ O(k),O(n/k) 代表盘算单个节点必要的显存,O(k) 代表 k 个查抄点必要的显存,取 k=sqrt(n),O(n/k)+ O(k)~O(sqrt(n)),可以看到显存占用从线性酿成了亚线性;
由于在反向梯度的盘算过程中必要从查抄点规复中心效果,团体必要额外实行一次前向盘算。
工程
在 [1] 的底子上,MegEngine 联合自身实践,做了工程扩展和优化,把亚线性显存优化方法扩展至恣意的盘算图,并联合别的常见的显存优化方法,发展出一套行之有用的增强版亚线性显存优化技能。
亚线性优化方法接纳简朴的网格搜刮(grid search)选择查抄点,MegEngine 在此底子上增长遗传算法,接纳界限移动、块归并、块分裂等计谋,实现更细粒度的优化,进一步低落了显存占用。
如图 2 所示,接纳型号为 2080Ti 的 GPU 练习 ResNet50,分别借助基准、亚线性、亚线性+遗传算法叁种显存优化计谋,对比了可利用的最大 batch size。仅利用亚线性优化,batch size 从 133 增至 211,是基准的 1.6x;而利用亚线性+遗传算法团结优化,batch size 进一步增至 262,较基准提拔 2x。
优化-免费yoqq工程之道:旷视天元框架亚线性显存优化技能剖析yoqq资源(3)
图 2:叁种显存优化方法优化 batch size 的对比:ResNet50
通过选定同一模子、给定 batch size,可以更好地观察遗传算法优化显存占用的环境。如图 3 所示,随着迭代次数的增长,遗传算法渐渐收敛显存占用,并在第 5 次迭代之后到达一个较稳固的状态。
优化-免费yoqq工程之道:旷视天元框架亚线性显存优化技能剖析yoqq资源(4)
图 3:遗传算法收敛表示图
别的,MegEngine 亚线性优化技能通过工程改良,不再范围于简朴的链状布局和同质盘算节点, 可用于恣意的盘算图,盘算节点也可异质,从而拓展了技能的实用场景;并可共同上述显存优化方法,进一步低落模子的显存占用。
实行
MegEngine 基于亚线性显存技能开展了相干实行,这里固定 batch size=64,在 ResNet18 和 ResNet50 两个模子上,观察模子练习时的显存占用和盘算时间。
如图 4 所示,相较于基准实现,利用 MegEngine 亚线性显存技能练习 ResNet18 时,显存占用低落 32%,盘算时间增长 24%;在较大的 ReNet50 上,显存占用低落 40%,盘算时间增长 25%。同时颠末理论分析可知,模子越大,亚线性显存优化的结果越显着,额外的盘算时间则险些稳定。
优化-免费yoqq工程之道:旷视天元框架亚线性显存优化技能剖析yoqq资源(5)
图 4:MegEngine 亚线性优化技能实行显存/时间对比:ReNet18/ReNet50
在更大模子 Bert 上实行数据表明,借助 MegEngine 亚线性显存技能,显存占用最高低落 75%,而盘算时间仅增长 23%,这与理论分析相同等。有爱好的同砚可前去 MegEngine ModeHub 试手更多模子实行:http://megengine.org.cn/model-hub/。
利用
MegEngine 官网提供了亚线性显存优化技能的利用文档。当你的 GPU 显存有限,苦于无法练习较深、较大的神经网络模子,大概无法利用大 batch 进一步提拔深度神经网络的性能,抑或想要使 batchwise 算子更加稳固,那么,MegEngine 亚线性显存优化技能正是你必要的办理方案。
上手 MegEngine 亚线性优化技能非常便捷,无需手动设定梯度查抄点,通过几个简朴的参数,轻松控制遗传算法的搜刮计谋。详细利用时,在 MegEngine 静态图接口中调用 SublinearMemoryConfig 设置 trace 的参数 sublinear_memory_config,即可打开亚线性显存优化:
from megengine.jit import trace, SublinearMemoryConfig
config = SublinearMemoryConfig()
@trace(symbolic=True, sublinear_memory_config=config)def train_func(data, label, *, net, optimizer): ...
MegEngine 在编译盘算图和练习模子时,虽有少量的额外时间开销,但会显着缓解显存不敷题目。下面以 ResNet50 为例,阐明 MegEngine 可有用突破显存瓶颈,练习 batch size 从 100 最高增至 200:
import osfrom multiprocessing import Process
def train_resnet_demo(batch_size, enable_sublinear, genetic_nr_iter=0): import megengine as mge import megengine.functional as F import megengine.hub as hub import megengine.optimizer as optim from megengine.jit import trace, SublinearMemoryConfig import numpy as np
print( "Run with batch_size={}, enable_sublinear={}, genetic_nr_iter={}".format( batch_size, enable_sublinear, genetic_nr_iter ) ) # 利用GPU运行这个例子 assert mge.is_cuda_available(), "Please run with GPU" try: # 我们从 megengine hub 中加载一个 resnet50 模子。 resnet = hub.load("megengine/models", "resnet50")
optimizer = optim.SGD(resnet.parameters(), lr=0.1,)
config = None if enable_sublinear: config = SublinearMemoryConfig(genetic_nr_iter=genetic_nr_iter)
@trace(symbolic=True, sublinear_memory_config=config) def train_func(data, label, *, net, optimizer): pred = net(data) loss = F.cross_entropy_with_softmax(pred, label) optimizer.backward(loss)
resnet.train() for i in range(10): batch_data = np.random.randn(batch_size, 3, 224, 224).astype(np.float32) batch_label = np.random.randint(1000, size=(batch_size,)).astype(np.int32) optimizer.zero_grad() train_func(batch_data, batch_label, net=resnet, optimizer=optimizer) optimizer.step() except: print("Failed") return
print("Sucess")
# 以下示例效果在2080Ti GPU运行得到,显存容量为 11 GB
# 不利用亚线性内存优化,答应的batch_size最大为 100 左右p = Process(target=train_resnet_demo, args=(100, False))p.start()p.join()# 报错显存不敷p = Process(target=train_resnet_demo, args=(200, False))p.start()p.join()
# 利用亚线性内存优化,答应的batch_size最大为 200 左右p = Process(target=train_resnet_demo, args=(200, True, 20))p.start()p.join()
预测
如上所述,MegEngine 的亚线性显存优化技能通过额外做一次前向盘算,即可到达 O(sqrt(n)) 的空间复杂度。假如答应做更多次的前向盘算,对整个网络递归地调用亚线性显存算法,有望在时间复杂度为 O(n log n) 的环境下,到达 O(log n) 的空间复杂度。
更进一步,MegEngine 还将探索亚线性显存优化技能与数据并行/模子并行、混淆精度练习的组合利用题目,以期得到更佳的集成结果。末了,在 RNN 以及 GNN、Transformer 等其他范例网络上的利用题目,也是 MegEngine 将来的一个探索方向。
接待访问
MegEngine GitHub:http://github.com/MegEngine
MegEngine 官网:http://megengine.org.cn
MegEngine ModelHub:http://megengine.org.cn/model-hub/
参考文献
1.Chen, T., Xu, B., Zhang, C., & Guestrin, C. (2016). Training deep nets with sublinear memory cost. arXiv preprint arXiv:1604.06174.
2.He, K., Zhang, X., Ren, S., & Sun, J. (2016). Deep residual learning for image recognition. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 770-778).










您现在利用的是【试用版】,许多功能受到限定!!假如试用此插件之后满足,对您产生了资助,请购买正式版支持一下辛劳的开辟者,插件的连续发展离不开正式版用户的支持,良好的应用得益于您的捐助,点击下面的链接去Discuz官方应用中央购买正式版永世授权


https://addon.dismall.com/?@csdn123com_todaynews.plugin
正式版后续更新升级免费,一次购买,终身利用!

有资源网- 版权声明 1、本主题所有言论和图片纯属会员个人意见,与有资源网立场无关。
2、本站所有主题由该帖子作者发表,该帖子作者有资源网享有帖子相关版权。
3、有资源网管理员和版主有权不事先通知发贴者而删除本文。
4、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者 有资源网的同意。
有资源网是一个网络技术交流、游戏交流、娱乐休闲的温馨家园.提供网络最新it资讯、热门电影电视剧、破解软件工具下载_技术和娱乐性的综合型大论坛论资源网
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

快速回复 返回顶部 返回列表