计算平台的两个指标

1. 算力算力架构 算力pib_浮点运算
算力算力架构 算力pib_浮点运算_02:也称为计算平台的性能上限,指的是一个计算平台倾尽全力每秒钟所能完成的浮点运算数,单位是FLOP/s(floating-point operations per second),FLOPS它常被用来估算电脑的执行效能,尤其是在使用到大量浮点运算的科学计算领域中。

算力架构 算力pib_算力架构_03


算力架构 算力pib_浮点运算_04

2. 带宽上限算力架构 算力pib_GPU_05
带宽上限算力架构 算力pib_GPU_06:也即计算平台的带宽上限,指的是一个计算平台倾尽全力每秒所能完成的内存交换量,单位是Byte/s。

算力架构 算力pib_ROOFLINE_07


算力架构 算力pib_GPU_08

计算强度(密度)算力架构 算力pib_浮点运算_09:两个指标相除即可得到计算平台的计算强度上限。它描述的是在这个计算平台上,单位内存交换最多用来进行多少次计算。单位是FLOP/Byte。

算力架构 算力pib_ROOFLINE_10


举两个具体的例子,第一个是矩阵乘矩阵,矩阵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模型:

算力架构 算力pib_GPU_11


图中有一条折线,这个折线开始的时候是随着计算密度的增加而增加,最终会稳定在一个固定的performance上。这个意思是:当这个应用程序的计算密度大于一定值之后,将会变成一个受算术逻辑单元的计算量所限制的程序;而这个计算密度如果小于一定值,将会变成一个受存储器带宽所限制的程序。

也就是说:

算力架构 算力pib_ROOFLINE_12

计算瓶颈区域 Compute-Bound

不管模型的计算强度算力架构 算力pib_ROOFLINE_13有多大,它的理论性能P最大只能等于计算平台的算力算力架构 算力pib_浮点运算_02。当模型的计算强度算力架构 算力pib_ROOFLINE_13大于计算平台的计算强度上限算力架构 算力pib_浮点运算_09时,模型在当前计算平台处于 Compute-Bound状态,即模型的理论性能P受到计算平台算力算力架构 算力pib_浮点运算_02的限制,无法与计算强度算力架构 算力pib_ROOFLINE_13成正比。但这其实并不是一件坏事,因为从充分利用计算平台算力的角度上看,此时模型已经充分的利用了计算平台的全部算力。可见,计算平台的算力算力架构 算力pib_浮点运算_02越高,模型进入计算瓶颈区域后的理论性能P也就越大。

带宽瓶颈区域 Memory-Bound

当模型的计算强度算力架构 算力pib_ROOFLINE_13小于计算平台的计算强度上限算力架构 算力pib_浮点运算_09时,由于此时模型位于“房檐”区间,因此模型理论性能P的大小完全由计算平台的带宽上限算力架构 算力pib_GPU_06(房檐的斜率)以及模型自身的计算强度算力架构 算力pib_ROOFLINE_13所决定,因此这时候就称模型处于 Memory-Bound 状态。可见,在模型处于带宽瓶颈区间的前提下,计算平台的带宽算力架构 算力pib_GPU_06越大(房檐越陡),或者模型的计算强度算力架构 算力pib_ROOFLINE_13越大,模型的理论性能P可呈线性增长。

模型的两个指标:计算量与访存量

计算量

计算量:指的是输入单个样本(对于CNN而言就是一张图像),模型进行一次完整的前向传播所发生的浮点运算个数,也即模型的时间复杂度。单位是FLOPS。其中卷积层的计算量公式如下:

算力架构 算力pib_GPU_26

访存量

访存量:指的是输入单个样本,模型完成一次前向传播过程中所发生的内存交换总量,也即模型的空间复杂度。在理想情况下(即不考虑片上缓存),模型的访存量就是模型各层权重参数的内存占用(Kernel Mem)与每层所输出的特征图的内存占用(Output Mem)之和。单位是Byte。由于数据类型通常为float32 ,因此需要乘以四。

算力架构 算力pib_Memory_27

模型的计算强度 算力架构 算力pib_ROOFLINE_13

由计算量除以访存量就可以得到模型的计算强度,它表示此模型在计算过程中,每Byte内存交换到底用于进行多少次浮点运算。单位是FLOP/Byte。可以看到,模计算强度越大,其内存使用效率越高。

模型的理论性能算力架构 算力pib_浮点运算_02

即模型在计算平台上所能达到的每秒浮点运算次数(理论值)。单位是 FLOP/s。