【计算机系统】从Roofline Model到大模型性能分析总结
摘要:Roofline模型是分析计算平台性能上限的理论工具,通过计算强度(计算量/访存量)划分两种瓶颈:当计算强度低于平台最大值时为memory-bound(受带宽限制),高于时为compute-bound(受算力限制)。在大模型推理中,prefill阶段因大规模矩阵运算多为compute-bound,而decoding阶段因频繁读取KV cache多为memory-bound。该模型仅反映平台理
在计算机领域,Roofline model、compute-bound、memory-bound这些词一定经常听到,今天来梳理一下相关的知识点以及对应的优化方向。
关键术语说明
这里有几个关键术语的定义:
- 计算量(compute):输入单个样本,推理模型时的浮点计算量(FLOPs),也是模型的时间复杂度
- 访存量(memory):输入单个样本,推理模型时的内存交换总量(Bytes),也是模型的空间复杂度(数据类型为float32时,需要乘以4)
- 模型的计算强度 I I I:也就是上面的compute/memory(FLOPs/Bytes)
- 平台/机器能达到的最大算力 π \pi π:是其性能上限,描述每秒能完成的浮点计算(FLOPS/s)
- 平台/机器能达到的最大带宽 β \beta β:描述每秒能完成的内存交换量(Bytes/s)
- 平台/机器能达到的最大计算强度 I m a x = π / β I_{max}=\pi/\beta Imax=π/β:描述单位内存交换最多用来进行多少计算(FLOPs/Bytes)
Roofline Model建模
Roofline model要解决的核心问题是: 模型(给定计算量和访存量)在一个计算平台的限制下(给定算力和带宽),模型到底能达到多快的浮点计算速度(理论性能上限)。
下图是经典的roofline model图,分为左右两个区域:
- 左边红色:带宽决定了红线的斜率【memory-bound】
- 右边绿色:算力决定了绿线的高度【compute-bound】

两个区域分别有两种不同的瓶颈情况,左边是卡带宽,右边是卡算力:
Memory-bound: 当横坐标计算强度 I I I小于平台最大计算强度 I m a x I_{max} Imax时,模型理论性能
的大小由平台的带宽上限 (斜率)以及模型自身的计算强度(横坐标)所决定,说明平台带宽
越大(越陡),或者模型的计算强度越大,模型理论性能线性上升。
Compute-bound: 当横坐标计算强度 I I I超过平台最大计算强度 I m a x I_{max} Imax时,其理论最大性能达到平台最大算力 π \pi π,从而受到限制不再上升,也说明模型已经充分利用了平台100%的资源。
对两种bound简单的理解方式: memory-bound是“数据搬不过来”,访存时间>计算时间,计算单元会因为数据未及时到达而空闲等待,造成资源浪费;compete-bound是“数据算不过来”,计算时间>访存时间。
注意: roofline model这个图是由计算平台本身决定的,和模型无关!比如A100和H100就有不同的roofline model。模型可以决定横坐标在哪里,通过计算量除以访存量得到。 但并不是说算出来横坐标就能对应到roofline model的边界(线上),各种复杂因素都会影响实际性能(例如,cache的大小受限、矩阵乘GEMM的实现方式、存在调度依赖、计算和通信pipeline存在bubble、算力用不满等),导致无法达到roofline model的边界上。
注意: 这里说的memory都是访存量(内存交换量),而不是存储!存储通常用storage来表示,但是这里讨论得较少,因为一般来说模型都是可以存得下。

举个直观的例子
对于GPU 1080Ti,算力 π = 11.3 T F L O P s / s \pi=11.3~TFLOPs/s π=11.3 TFLOPs/s,带宽 β = 484 G B / s \beta=484~GB/s β=484 GB/s,因此平台最大计算强度 I m a x = π / β = 23.3 F L O P s / B y t e s I_{max}=\pi/\beta=23.3~FLOPs/Bytes Imax=π/β=23.3 FLOPs/Bytes。
根据具体模型的计算量除以访存量,可以得到VGG16的计算强度为 I V = 25 F L O P s / B y t e s I_V=25~FLOPs/Bytes IV=25 FLOPs/Bytes,MobileNet的计算强度为 I M = 7 F L O P s / B y t e s I_M=7~FLOPs/Bytes IM=7 FLOPs/Bytes。
放在roofline model图上的位置(理想情况,实际上到不了边界),可以看到MobileNet是memory-bound,在1080Ti上的理论最大性能只有 3.3 T F L O P / s 3.3~TFLOP/s 3.3 TFLOP/s;而VGG16则是compute-bound,完全利用了1080Ti的全部算力,达到 11.3 T F L O P / s 11.3~TFLOP/s 11.3 TFLOP/s。
换句话说,对比之下VGG16在1080Ti上每秒钟可以进行的浮点运算数是MobileNet的3倍。

另外,看到一篇博客里分析到:MobileNet因为参数量很小,所以往往部署在边端设备,这些设备往往计算强度上限 I m a x I_{max} Imax就很低,甚至小于MobileNet的计算强度。因此,MobileNet就能到compute-bound的位置,更充分地利用到计算平台的算力。
因此可以感受到,模型选择以及计算平台的选择,是一个相辅相成的事情,不能单一考虑。
Roofline model指导优化方向
因为我不是专门做这个方向的,这里简单总结下可能的优化方向:
位于compute-bound区域:
1)提升计算平台算力,提高roofline model的屋顶高度;2)采用加速/压缩的算法优化模型,从而降低模型本身需要的算力。
位于memory-bound区域:
1)提升平台的带宽,增大roofline model的屋檐斜率;2)采用片上memory/片上cache融合等方案,获得更大带宽;3)采用多算子多步骤的融合/权重复用优化,减少数据搬运;4)提升模型的计算强度,往横坐标的右边走。
大模型性能分析
大模型推理分为两个阶段:1)prefill(将所有token全部喂给模型,得到KV cache,输出1个token);2)decoding(将单个token喂给模型,更新KV cache,输出1个token)。
先说结论:prefill阶段通常是计算密集型(compute-bound),而decode阶段则是访存密集型(memory-bound)。
然后逐一分析两个阶段:
- Prefill是一次性地并行处理整个输入序列,涉及到大规模矩阵乘法,所以往往对算力的要求很高
- Decoding是以自回归的方式每次只输入1个token,生成1个token,所以往往对算力的要求更低。但是每次生成token都必须读取完整的、不断增长的KV cache,这里的数据搬运/访存量是巨大的
参考资料
更多推荐

所有评论(0)