大家好啊,我是董董灿。

今天开端,增加第一个专栏,作为AI推理加快的专栏,主要写一写在神经网络推理进程中的一些加快方法。

先从核算机底层原理说起。先说几个基础概念。

核算机存储和核算的别离

第一是核算机。这儿说的核算机是广义上的核算机,也便是说具有核算能力的硬件设备(核算的机器)都算。小到某个芯片系统,大到智能手环、手机、电脑乃至服务器,都归到核算机的范畴。

第二是核算。这儿要说的核算,指一切的核算,包含科学核算——比方用核算器算一些数,包含音频编解码——比方手机麦克风对咱们说话音频的调制解调处理,包含视频流——比方看电影时一帧帧图像的解码等等。一切芯片需要处理的核算使命,都包含在核算这一概念中。

第三是存储。这儿说的存储,泛指核算机中一切能存储数据硬件。包含咱们熟知的硬盘、U盘、手机内存、手机运存、GPU显存(显卡容量),也包含处理器(CPU或其他芯片)内部的片上存储或L1/L2缓存等。

在说清楚这3个概念之后,那么,核算机的核算和存储,就好比——

咱们在厨房煮饭,厨房里的冰箱便是存储器,冰箱里的菜便是希望处理的数据,而洗菜、切菜、炒菜都归于核算使命,整个厨房便是核算机。

冯诺依曼架构

不论是笔记本,还是手机,还是智能手表智能手环,内部的程序运行机制都是一样的,都绕不开一个闻名的核算系统,大家可能听过,叫做冯诺依曼系统。

冯诺依曼是二战时期闻名的核算机科学家,他开创性的提出了核算机的冯诺依曼架构,其间最为人津津乐道的,是数据存储和核算的别离。

在任何一台核算机中,存储数据的硬件叫做存储器,担任逻辑核算的叫做运算器。除此之外还有控制器,输入输出(IO)等。

神经网络推理加速入门——计算和存储的分离

存储和核算别离便是,存储器只担任存储数据,核算单元只担任核算数据,然后将核算出来的成果再存回存储器。

有没有发现,咱们在做核算(洗菜)之前,需要将数据(菜)从冰箱里拿出来,放在洗菜池里来洗(核算)。这个将菜从冰箱里拿出来的进程,叫做数据的转移。

而在芯片的整个运算进程中,数据的转移的时刻开支是避免不了的,乃至有时会占据绝对的大头。

举个比如——

咱们知道卷积运算是一种核算密集型的算法。也便是大量的时刻开支都耗费在了卷积的乘法和加法上(乘累加,Multiply-accumulator,MAC单元)。但是,如果芯片的片上存储很小,而神经网络中的一张图片又很大,一张图片的数据是无法在一次核算中悉数放在片上存储的。

神经网络推理加速入门——计算和存储的分离

那么这个时分,自然而然会想到将图片拆分红好几份进行核算。

然而,卷积要求的是将一切输入通道进行累加和。如果在通道上进行了数据拆分,那么每次核算的都是不完全的成果(部分和)。这个时分,这些中间成果都要找个当地放。

放哪里?

最常见的便是放在片外存储上(对于GPU来说,可能就把这些临时数据放在DDR上,也便是咱们常说的显存上,因为显存一般都比较大,大概16GB,肯定能的下)。

如此一来,寄存数据的冰箱可能就不是厨房里的冰箱了,而是客厅里的大冰柜,将数据从厨房搬到客厅的大冰柜临时存起来,这个进程的数据转移开支是很大的。

也因此,GPU乃至许多ASIC芯片,在进行芯片设计时,都会想办法加大DDR的带宽,通过多路DDR访存乃至运用HBM来提高带宽,以下降数据转移带来的额定开支。

神经网络推理加速入门——计算和存储的分离

总结一下

在现有经典的核算机核算架构中,比方冯诺依曼架构中,核算和存储是别离的。这也就导致了核算机在完结运算使命时,需要不断地从存储器中转移数据到核算单元中,然后完结核算。

这种架构也导致了核算指令和IO指令(数据转移)的独立,从而衍生出指令流水线。(这个后边会慢慢介绍)。除此之外,既然核算和存储是别离的,为了避免剩余的转移开支,那咱们把核算和存储放在一同不就行了么?

咱们直接在冰箱里洗菜煮饭不就完了?

可以,现在比较前沿的近存芯片、或许存算一体芯片便是基于这个主意来设计实现的,后边也会逐步涉及一些存算一体技术进行AI推理加快的,敬请期待。

本文为原创文章,请勿转载,如有转载需求请于作者联系。