提出了一种基于预测(prediction based)的DNN执行模型,无精度损失。主要预测做法是在计算时对I或W的高低位拆分,利用高位预测,利用低位计算。
- USPE:统一的串行PE,解决了高低位宽度不同的问题,减小面积开销
- scale-out Design:我的理解是探索合适的复用方法,既能有比较大的利用率,又能使得memory access不是瓶颈。
图1:理论上可以跳过的0。我对此表示疑惑,我认为这层能跳过的output就是下层的input,不存在跳out更好的情况。而且跳out还有预测的代价。
Contributions:
- 观察到了跳过输出的机会
- 提出了two stage,prediction based执行方案(其实也就是跳过output)
- 提出了USPE,是为了支持上面的预测方式
- 提出了scale-out design方式,是为了最大化吞吐量(方案:优化dataflow-改变数据复用模式;pre-fetch/out-of-order填满操作)
基本方案:两步,第一步预测,第二步执行剩下的操作。
单纯的mapping方式会产生空闲。
乘加应该支持prediction和execution两个stage,但是bit数不同:改用串行乘法器。改造一下就是右端的USPE-统一的串行PE,可以同时用于两个stage,不需要额外的面积开销了。
表格:把input拆成高低位还是把weight拆成高低位?
拆input–计算量小-CONV
拆weight–权重访存少-FC
Fig8:拆过之后的speed up 和memory问题
纵坐标:MAC_prediction/MAC_execution
Prediction stage时的mapping方式:横排PL个输入,竖排PO个权重,OS,一个PE管一个输出点。
但是!在execution stage,EON(有效输出神经元)是随机分配的!
(1)数据复用最高的方案:与Prediction一样,但是utilization特别低
(2)Utilization最高的方案:每个PE的输入和权重都是单独的。但是访存压力特别大。
做一个折衷吧!但是,是保留weight sharing还是保留input sharing呢?
图11是一个例子,这个例子针对的是max_pooling。图(b)是按照原始方案来的,图(c)是按照只有weight sharing的方式来的。需要两个cycle才能填满上面和下面,因为broadcast有限。但是也正好需要两个cycle才能算完,所以就OK!
下面是具体分析:
(1)CONV:通道方向的EON数目差不多,而通道方向=input相同,所以咱们选择input sharing,但是kernel是可以随便放进来的。每行是同样的input-同一个通道-不同行的计算时间差不多(因为不同通道的EON差不多)。
(2)Max_pooling:每个面上都是25%个有效点!所以选择weight sharing。
访存怎么解决?两个(原文中是三个)步骤
- Ping-Pong Buffering:交替loading
- 根据Table信息进行assignment
要注意,assignment的时间和loading的时间要小于计算时间(execution的bit数),可惜这里没怎么看懂。