大家好啊,我是董董灿。
计算机冯诺依曼架构下一个特点,就是存储和计算分离,这会带来一个问题,那就是计算机有时会遇到存储墙,也就是存储带宽不够导致的性能下降。
如果说流水技术可以为此破局,那么其实还有一个打破冯诺依曼架构的桎梏,将存储和计算过程结合起来。
它是怎么做的呢
还是先从一个例子说起。假设我要做个炒鸡蛋。正常的话我有以下步骤:
- 把鸡蛋从冰箱里拿出来
- 拿着鸡蛋从冰箱走到灶台
- 在灶台开火,开始炒鸡蛋
这个过程是经典的冯诺依曼架构中的流程。
这里面有一个弊端就是:数据(鸡蛋)需要从存储器(冰箱)中 load(拿)到计算单元(锅)中,然后进行计算(炒鸡蛋)。我们知道,load数据的过程是耗时的,尤其是数据量比较大的情况下。
比方需要炒1000个鸡蛋,一个锅肯定炒不下,需要多次拿鸡蛋,多次炒。
并且拿鸡蛋的速度取决于从冰箱走到灶台的速度,这里就是存储器到计算单元之间的总线带宽,带宽越大,速度越快。
但无论带宽多大,只要是这种架构,总是会有耗时,并且带宽是不可能很大的。
在这个时候,会出现一种极端情况,厨师炒鸡蛋的速度很快,可能1秒钟就炒完了,而从冰箱里拿鸡蛋到灶台,遇到个手脚不灵活的人,可能需要3秒钟。
不论多长时间,只要大于炒鸡蛋的时间,厨师就得等着鸡蛋过来。这个时候就是说,计算单元在空闲,性能瓶颈在带宽,程序打到了存储墙。
所谓存储墙,就是由于存储的数据需要load,但是load的时间很长,像是有一面墙在那里,导致计算单元空闲的情况。
为了解决这个问题,就有人提出,既然这样,那为什么不能把计算单元和存储单元放在一起呢?反正芯片都是人设计的嘛,放在一起就不需要来回搬运数据了啊。
比如,直接把锅做的特别大,大到可以放下1000个鸡蛋,或者说直接在冰箱里面炒鸡蛋,不用来回拿鸡蛋,这样不香么?
别说,还真香。
存——指的是存储器。
算——指的是计算单元。
两者合为一体,将计算单元和存储单元设计到一起,减少甚至消除数据的搬运。就这一点技术,就能使AI计算的性能得到飞一般的提升。
应用场景
在AI领域,最有效的场景便是,存储器的内存足够大,可以放得下整个神经网络的权值参数。
举个例子,resnet50的权值参数大概为24MB,AlexNet的权值参数大概为59M,而VGG-16大概有130M的参数量大小。
假设一个芯片的容量为40M,那么很明显resnet50的所有参数都可以全部放进存储器,这样在做模型推理的时候,只需要把 feature map(也就是图片,比如人脸识别时,拍摄的人脸照片)加载进内存就能推理出结果了。
相反,VGG-16由于权值参数太多,无法一次全部加载完成,仍然需要分多次加载。并且每次加载都是需要耗时的,此时,存算技术对VGG-16带来的性能提升肯定没有Resnet50高。
因此,在模型参数小于存储容量的场景下,其性能优势十分明显,可以说,这个时候,没有任何多余的数据搬运操作。
因此,存储过程和计算过程结合起来,对于整个神经网络的推理加速,其性能提升是很大的。
本文作者原创,转载请联系作者,请勿随意转载