AI算力的发展与TOPS(Tera Operations Per Second)紧密相关。TOPS是衡量芯片每秒能执行的基本操作次数的单位,通常用于评估AI芯片性能,特别是在处理大量整数或定点运算任务时
。随着AI技术进步,对算力的需求不断增加,TOPS作为衡量AI芯片算力的关键指标,其数值的增长反映了AI算力的发展水平。TOPS的提高意味着AI芯片能更快地处理数据,对于需要实时响应的应用场景,如自动驾驶,具有重要意义
TOPS的定义是非常明确的,代表每秒运行多少条指令(instruction,汇编或机器码的一行, 一般是32位2进制数)。
以CPU为例,一般CPU的频率,比如3GHz,代表一秒钟能输入一组流水线3 billion条指令。比如现在的ARM大核,都是4发射(可以理解为有并行的四组执行流水线,其实不止,但每周期只会最多选择4个开始执行),最高理论TOPS,即为3*4=12GOPS。
还没有完,因为arm的数据寄存器是32位的,所以一条arm指令可以做1次int32的加法,如果是int8,理论上一条指令可以做四次加法。所以,对于int8,最高理论算力为12*4=48GOPS。
乘法和加法又不一样,因为一个int32的乘法,理论上(虽然很多情况下实际没有)最多可以拆成4*4=16个int8的乘法(不增加运算器的前提下),这时最高算力为12*16=192GOPS≈0.2TOPS,(int8)。
至于其他指令,则没有int8还是int32的区别,都是12GOPS.
结论1,多少算力,是和具体运行什么指令相关的。
一般的程序,不全是乘法运算(NPU对应乘加运算),这部分会严重偏离理论算力。除此之外,还有一个重大的问题,就是运算器是不是满负荷运转。一般而言,远远不是,原因包括:cache miss,流水线冒险,无法并行 等等。
结论2,乘加的指令和数据如果没有准备好,运算单元就会空闲回到NPU。
NPU的算力大部分来自于tensor core,也就是只有矩阵乘法计算才能享受到理论算力,对应的是卷积和MLP和矩阵乘法算子。其他算子都和理论峰值算力没有关系。nVidia的理论峰值算力,在tensor-core执行Fused Multiply–accumulate指令时达到,它把这一条指令算成两条指令(所以叫fused),对应了一次乘法和加法。
但大家都知道,一个乘法器需要的资源远超过加法器,这么算还算有良心。
另外,nvidia的理论峰值算力,没有把cuda-core的算力叠加上来,这也很有良心,不然可以增长40%。因为tensor-core全力运行的时候,cuda-core是不能工作的。NPU对于卷积更容易达到理论算力,因为卷积的数据复用好于MLP。
大核,一条指令的计算量大,对指令吞吐能力要求变低。小核,指令来不及准备好,会成为导致运算单元空闲的瓶颈。
数据分为权重和输入流。最理想的情况是一个网络的权重一次能加载完毕,但一般片上的ram没有那么大。如果一次可以容得下两层权重,通过流水,可以至少保证有下一层的权重处于ready状态,不会让乘加单元等待。
问题出在全连接层,它的权重非常多,一般而言会遇到存储墙,所以全连接层的计算效率会比卷积下降几倍。
输入流,对于CV来讲,就是图片,比如一次推理需要加载7张图片。需要做到从输入到网络输出写回,没有瓶颈,管路各处粗细相等。各种缓存和流水机制都需要仔细设计。上一层网络输出的中间结果,一般不用写回主存,而是直接去和已经加载好的新权重去做加乘。这时,我们会发现,一个网络:如果,刚开始加载一帧输入流 然后加载各层权重 然后写回最终结果。它和主存的通信带宽,可以通过 (一帧输入+各层权重+一帧输出) * 帧率 算出来。
如果用one-model(多输入共享backbone),加载权重的时间比重会变小,降低存储带宽需求。(7V能降低50%以上,所以基本上现在所有方案都是one-model)
如果中间结果要写回,比如某些运算要交给CPU(如reshape等),会增加存储带宽需求。
(增加一次写回增加30%)一般一个CNN网络,运算卷积占用的时间为1/3,MLP运算占用1/3,其他1/3。综合考虑各种损失,平均算力能达到峰值的25%是正常的。
对一些设计不佳的NPU来讲,乘加之外的运算效率极低,或者只能交给CPU去做,那平均算力达到峰值的5%也是正常的。
这些运算时间上的巨大差异,都和算力多少没关系。而如果其他设计不变,只是增加乘加单元,即使算力增长100倍,时间也只能节省1/3。所以算力的增长,要和cache的增长,带宽的增长,标量与向量计算能力的增长相匹配。
-对此,您有什么看法见解?-
-欢迎在评论区留言探讨和分享。-