@changlan   Archives  About

理解机器学习系统性能: Roofline Model 简介

正值 Dave Patterson 与 John Hennessy 荣获今年的图灵奖,博客的第一篇文章就以 Williams、Waterman 和 Patterson 在 2008 年的工作 Roofline: An Insightful Visual Performance Model for Floating-Point Programs and Multicore Architectures 讲起。

概念

我们知道,一个计算任务 (小到矩阵乘法、大到神经网络的训练) 的性能表现,取决于任务本身的特性以及计算平台的指标。

计算平台的主要指标有两个:算力带宽。算力即每秒峰值浮点运算次数 (Peak Flops/sec);带宽即每秒峰值内存数据存取量 (Peak Memory Bandwidth),单位是 Byte/sec。

计算任务相应的主要指标则是运算量(单位是 Flops) 和访存量(单位是 Bytes)。

Roofline Model

给定一个计算任务和平台,我们最关心的指标是,任务在该平台上的每秒浮点运算次数 (Attainable Flops/sec)。如果不存在内存带宽的限制,那么任务的理想性能显然是计算平台的算力。 但是在很多情况下,内存访问会成为瓶颈,这时计算任务的性能就达不到平台的峰值算力了。

为了考虑访存对性能的影响,作者首先定义了 Operational Intensity (运算强度) 为运算量和访存量的比值 (Flops/byte),即单位内存访问用于多少次浮点计算。一个任务的运算强度越大,内存使用效率越高。

Roofline Model 提出了一个非常简单的模型来计算任务的每秒浮点运算次数:

Attainable Flops/sec = Min(Peak Flops/sec, Peak Memory Bandwidth * Operational Intensity)

如果以运算强度为横轴、每秒浮点运算次数为纵轴画图,我们可以得到一条与计算平台相关的折线,即所谓的 Roofline。算力决定屋顶的高度,带宽决定屋檐的斜率。所有在这个平台上运行的计算任务能够达到的性能都处于屋顶的下方。

分析

由图 1(a) 可见,「屋顶」把瓶颈划分为两个区域:

作者提出,Roofline Model 可以对如何优化当前计算任务的性能提供参考。我们可以把可能的优化手段分成两类:

在同一个平台上,计算任务的运算强度不同,其性能瓶颈的类型也不同。对于 Memory-bound 的任务,优化内存带宽更加有效;而对于 Compute-bound 的任务,则应该优化算力。

实例

以我的显卡 Geforce GTX 960 为例,内存带宽 112 GB/s,峰值算力 2300 GFlops/s,因此运算强度的上限是 20.05 Flops/B。

不同的 Convnet 在这个平台上的表现会如何呢?参考这个表格,我们先来看 AlexNet,可以算出它的运算强度约为 3 Flops/B,远远小于平台的上限。因此这个模型在平台上的受限于带宽,实际性能上限只能达到 ~330 GFlops,可以说是非常慢了。

再看另一个模型 VGG-VD-19,运算强度达到了可怕的 33 Flops/B,因此在理想情况下可以在平台上完全达到峰值算力。

总结

这篇文章介绍了 Roofline Model 的概念,以及如何利用 Roofline Model 来估算一个计算任务在特定平台上的性能上限。但是由于缓存以及其他因素的影响,系统的实际性能往往很难达到 Roofline 的上限。