一、背景
image.png深度学习的参数越来越多,图中标注已经存在17 billion的参数,现代内存装不下,显存更装不下。也许分布式是个解决方案,但是在单机场景下就真的没有办法了吗?
不,不是这样的。
我们要知道,传统的DRAM其实单机上64GB已经是非常大了,再加上GPU的12GB,也就70GB左右的存储量,这个存储量实在是太吝啬了。恰巧,最近Optan DC的NVDIMM流行了起来,我们可以看一下具体的NVDIMM的Style:
image.png很显然,可以直接直接扩展内存,可以被CPU直接访问;最重要的是,容量大,价格低,性能还不算太慢。
不过直接用NVDIMM作为扩展又不太行,毕竟DNN要求高速训练,太慢了影响太大。
image.png所以要合理设计一些方案去利用部分DRAM+NVDIMM达到既能扩展存储量,性能又不怎么损失的效果。
怎么做呢?
二、AutoTM整体设计
所以要根据DNN的特性设计一些优化方案。在介绍优化方案前,我们可以看看一些NVDIMM的性能情况:
image.pngimage.png
总体来说,第一个图是NVDIMM与DRAM的性能比;第二个图是DRAM与NVDIMM的转移性能比。
我们在来看一个AutoTM的整体性能对比:
image.png全在PMM上是最差的,全在DRAM上是最好的,NUMA指DRAM+PMM,但是用CPU优先使用DRAM(就是不做优化)。
由图可知,AutoTM还是很nice的。
下一步就要看看怎么利用NVDIMM做优化了:
image.png我们的目标是更快更大;如何做呢?要使得Tensor在DRAM与PMM中转移,并用最优的方案转移;策略呢?先进行一些DNN基本信息的测量,然后使用整数线性规划来做。
具体来说:
1 Kernel Profiling阶段
测量DNN的一些Tensor大小,位置,并且one by one的去尝试把Tensor摆放到哪些位置,并测量相关操作的执行时间(不同位置对应不同的操作执行时间)
image.png我们的目标就是得到如下图:
image.png具体怎么算呢?
image.png首先要算每个kernel的执行时间ρk
(上图),并加上数据转移时间Mt(下图)。
并且给一个DRAM的限定条件:即我们需要给一个初始DRAM,并且使得我们的决策要在门限以下才阔以。
(这里插播一些课外话,就是说文章当中给的函数相对复杂一些,考虑的稍微细致一些,不过为了便于理解这里放这些宏观的公式就可以了,害算了,我还是把论文里面的公式也提一下吧,论文写的不是很清楚害得我看了老半天才看懂,也算记录一下吧。。。)
不扣细节的话直接跳过就好
公式(3)代表tensor真正执行时所在的地方:
image.png比如我图中红色框出来的地方,因为黑色实线是真正流程,所以对于K2来说,我的t1是在DRAM中被访问的,所以这个(3)公式代表1;对于K5的话,t1在PMM中被执行,所以代表0 。
对于(4)来说,表示我数据Tensor在当前K执行完后,被转移到哪个位置。
image.png比如图中K2的话,数据被转移到PMM中,所以为0;当K4执行完后,数据被转移到PMM中所以为0;
image.png对于这个DRAM限定公式来说,每一个K都会限定一下,并且加号两遍分别对应当前K输入的Tensor以及当前K用不到的Tensor(但是又必须存在DRAM中)。
而里面的IO以及L是没有交集的,简单来说如果这个Tensor是输入或者输出的,那么就不属于L,反之亦可。
好了跳到这里就行了。
了解了这些限定公式之后,就可以看看实验。
三、实验
配置:
image.png- PMM与DRAM容量配比:
性能有目共睹。
- 价格对比(右边bar)
- 计算时间
最后这个方案还被引入到了GPU+DRAM中,不过其实这种方案相关论文比较多,所以很难评判这篇文章的好坏,就是代码太难读了,用的Julia,我的个乖乖,套用一句日本悬疑剧的一句台词:oh my Julia!
,希望我后期能把这个代码啃掉。
记录比较草率,大致过了一下这个文章。会续更。
网友评论