计算平台的两个指标
1. 算力
算力:也称为计算平台的性能上限,指的是一个计算平台倾尽全力每秒钟所能完成的浮点运算数,单位是FLOP/s(floating-point operations per second),FLOPS它常被用来估算电脑的执行效能,尤其是在使用到大量浮点运算的科学计算领域中。
2. 带宽上限
带宽上限:也即计算平台的带宽上限,指的是一个计算平台倾尽全力每秒所能完成的内存交换量,单位是Byte/s。
计算强度(密度):两个指标相除即可得到计算平台的计算强度上限。它描述的是在这个计算平台上,单位内存交换最多用来进行多少次计算。单位是FLOP/Byte。
举两个具体的例子,第一个是矩阵乘矩阵,矩阵C等于A乘B,而A跟B分别是一千乘一千的矩阵。假设 存储和计算都是用float 32位来表示,这样一个计算将会做1000 乘1000乘1000的浮点乘加,也 就是2G FLOPS的运算。我们要读取A和B,然后计算出来C,把它写回去,最少的存储器访问就是三个矩阵的大小,也就是12个MB。另外一个是矩阵乘向量,也就是矩阵A乘向量B,等于向量C,这时候维度还是1000的情况下,它的计算量就是1000乘1000的浮点乘加,也就是2M。而存储器访问的话最少大约是1000乘于1000个浮点数,也就是4MB。可以明显地看到上面乘矩阵的操作,它的计算量是2G,访存量是12M,那么它的这个计算量除以访存量,也就是刚刚提到的计算密度,大概是200左右。下面这个矩阵和向量中,它的计算量是2M,访存量是4M,那它的计算量除以访存量大约就只有0.5,显然这两个就是非常不同的程序。将算力作为y轴代表性能P,计算强度作为x轴,即可得到Roofline模型:
图中有一条折线,这个折线开始的时候是随着计算密度的增加而增加,最终会稳定在一个固定的performance上。这个意思是:当这个应用程序的计算密度大于一定值之后,将会变成一个受算术逻辑单元的计算量所限制的程序;而这个计算密度如果小于一定值,将会变成一个受存储器带宽所限制的程序。
也就是说:
计算瓶颈区域 Compute-Bound
不管模型的计算强度有多大,它的理论性能P最大只能等于计算平台的算力。当模型的计算强度大于计算平台的计算强度上限时,模型在当前计算平台处于 Compute-Bound状态,即模型的理论性能P受到计算平台算力的限制,无法与计算强度成正比。但这其实并不是一件坏事,因为从充分利用计算平台算力的角度上看,此时模型已经充分的利用了计算平台的全部算力。可见,计算平台的算力越高,模型进入计算瓶颈区域后的理论性能P也就越大。
带宽瓶颈区域 Memory-Bound
当模型的计算强度小于计算平台的计算强度上限时,由于此时模型位于“房檐”区间,因此模型理论性能P的大小完全由计算平台的带宽上限(房檐的斜率)以及模型自身的计算强度所决定,因此这时候就称模型处于 Memory-Bound 状态。可见,在模型处于带宽瓶颈区间的前提下,计算平台的带宽越大(房檐越陡),或者模型的计算强度越大,模型的理论性能P可呈线性增长。
模型的两个指标:计算量与访存量
计算量
计算量:指的是输入单个样本(对于CNN而言就是一张图像),模型进行一次完整的前向传播所发生的浮点运算个数,也即模型的时间复杂度。单位是FLOPS。其中卷积层的计算量公式如下:
访存量
访存量:指的是输入单个样本,模型完成一次前向传播过程中所发生的内存交换总量,也即模型的空间复杂度。在理想情况下(即不考虑片上缓存),模型的访存量就是模型各层权重参数的内存占用(Kernel Mem)与每层所输出的特征图的内存占用(Output Mem)之和。单位是Byte。由于数据类型通常为float32 ,因此需要乘以四。
模型的计算强度
由计算量除以访存量就可以得到模型的计算强度,它表示此模型在计算过程中,每Byte内存交换到底用于进行多少次浮点运算。单位是FLOP/Byte。可以看到,模计算强度越大,其内存使用效率越高。
模型的理论性能
即模型在计算平台上所能达到的每秒浮点运算次数(理论值)。单位是 FLOP/s。