Roofline Model

Google之前发布了一篇关于TPU的文章论文《In-Datacenter Performance Analysis of a Tensor Processing Unit》,里面提到了一个Roofline模型,用来展示不同的算法在TPU上面的瓶颈。简单地做个记录。

Roofline模型,维基百科的定义如下:

The Roofline model is an intuitive visual performance model used to provide performance estimates of a given compute kernel or application running on multi-core, many-core, or accelerator processor architectures, by showing inherent hardware limitations, and potential benefit and priority of optimizations.

说白了就是一个可视化模型,用来评估应用在不同处理硬件上面的瓶颈和潜在优化方式。

从硬件层面来讲,影响计算速度有两个方面:1.处理器本身的计算能力;2.内存带宽(Bandwidth)

第一点很容易理解,因为GPU/CPU被生产出来后,它的最大计算能力是固定的,不管外部环境再怎么变化,最大计算能力也不会变了。因此我们希望做出来的硬件的计算能力越大越好!

而第二点内存带宽,同样也会成为处理器计算能力的瓶颈。假设某些算法对内存带宽需求很大,需要频繁地将内存里面的数据迁移进处理器,这需要耗费时间。哪怕你的计算能力无敌强,小到计算任何东西的时间接近于0,但是你还需要等数据进来才能计算,所以读取数据的能力成为了瓶颈。

算法对于内存带宽的需求通常用运算强度(operational intensity/arithmetic intensity)来表示,单位是 OPs/byte,指在算法中平均每读入单位数据,能支持多少次运算操作。运算强度越大,则表示单位数据能支持更多次运算,也就是说算法对于内存带宽的要求越低。

典型的 Roofline 曲线模型如下图所示,纵坐标是计算性能、横坐标是运算强度。Roofline 曲线(黑色实线)包含两部分:左边的上升区,以及右边的饱和区。当算法的运算强度较小时,曲线处于上升区,即计算性能实际被内存带宽所限制(memory-bound),有很多计算处理单元是闲置的。随着算法运算强度上升,即在相同数量的数据下算法可以完成更多运算,于是闲置的运算单元越来越少,这时候计算性能就会上升。然后,随着运算强度越来越高,闲置的计算单元越来越少,最后所有计算单元都被用完了,Roofline 曲线就进入了饱和区,此时运算强度再变大也没有更多计算单元可用了,性能被计算能力所限制(compute-bound) 。

在Google的论文中也比较了不同算法在Roofline Model上的位置。由图中可见,经典全联接神经网络(multi-layer perceptrons, MLP)和LSTM 算法的运算强度较低,所以被卡在了 roofline 模型的上升区,很容易就得出瓶颈在于内存带宽。而卷积神经网络模型,尤其是 CNN0,由于卷积神经网络中能实现卷积核复用,因此运算强度非常高,于是可以非常接近 TPU roofline 曲线的屋顶(86 TOPS)。值得注意的是CNN1 模型,虽然运算强度也很高,但是由于由于 CNN1 模型的特征深度较浅无法完全利用 TPU 的计算单元,无法到达Roofline。