在计算机领域,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,这里的数据搬运/访存量是巨大的

参考资料

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐