大型语言模型的推理演算
kv 缓存 (kv cache) 解释了在推理过程中缓存自注意力向量所带来的性能优化效果,以及可能导致的权衡(tradeoff)以及容量成本问题。 容量(capacity)考虑了kv缓存的存储成本以及模型权重的存储成本之间的联系,并解释了容量大小对模型性能的影响。 模型并行可帮助我们理解张量并行,以明确通信成本。 时延计算需要从其他概念中获得理解,并创建用于确定推理速度底线(floorline)的方程。 批大小(batch size)对性能的影响以及最优批大小为多少。 通过transformer blocks执行flops(每秒浮点运算次数)计数操作,可以识别对flops速度有实质性贡献的操作。 中间内存成本涵盖了激活(即激活函数的输出结果)占用额外内存,以及一些真实基准测试中的内存带宽成本。 对比真实基准测试是指将计算出的内容与英伟达 FasterTransformer基准测试结果进行对比,并确定其中的差异。
kv 缓存
矩阵乘法(matmul)中的浮点运算次数为多少?
矩阵-向量(matrix-vector)乘法的计算公式是,其中,。对于矩阵-矩阵(matrix-matrix)乘法,计算公式是 ,其中,。因子十分重要,因为它反映了矩阵乘法中由乘法和加法组成的组合方式,即“乘法(1)-加法(2) 操作组合”。更多内容见讲义(lecture notes)。
Flops vs 内存有界性(Boundedness)
英伟达使用了数学带宽这个术语,我觉得这个术语真的很可爱。从技术上讲,这种描述存在于每个内核中,但可以抽象为操作组。
Flops vs 内存有界性是Transformer推理和深度学习优化的常见问题。为了完成所需计算,通常需要加载权重,加载过程会占用内存带宽。假设通过加载权重已经得到了很好的优化,那么我们可以在加载权重的同时开始计算。
在这种情况下,flop bound意味着一段时间内存中没有任何数据传输;memory bound则意味着没有进行任何计算操作。
英伟达使用数学带宽(math bandwidth)来描述该情况,我觉得相当有意思。从技术上讲,这种划分通常是指每个内核(kernel)中的计算量受限,但也可以指这些操作组的计算量受限,将每一组视为抽象意义上的单元。
容量
模型并行
时延计算
Batch sizes
Flops计算
从所有参数的matmul操作来看,我们的flops运算为2*P次。
中间内存成本
GPU内核融合(Fusion)
GPU 以“内核”为单位执行操作。内核融合意味着2个内核可以融合为一个,这样我们就可以在内存中重复利用负载,减少冗余负载和存储。例如,一个乘加(multiply-add)是一个内核。但是如果一个乘加有两个内核,一个内核负责加载+加法+存储,另一个内核负责加载+乘法+存储。内核融合以后,我们可以运行加载+加法+乘法+存储,以简化步骤。
实际基准对比
在这里我应该将内存宽带(mem bandwidth)设置为1.555,而不是1.5。
练习
扫描二维码添加小助手微信
关于我们
微信扫码关注该文公众号作者
戳这里提交新闻线索和高质量文章给我们。
来源: qq
点击查看作者最近其他文章