23年12月来自上交大的论文“PowerInfer: Fast Large Language Model Serving with a Consumer-grade GPU”。
PowerInfer是一款在单个消费级 GPU 个人计算机 (PC) 上运行的高速大语言模型 (LLM) 推理引擎。PowerInfer 设计的关键是利用 LLM 推理固有的高局部性,其特点是神经元激活呈幂律分布。这种分布表明,一小部分神经元(称为热神经元)在不同输入之间持续激活,而大多数冷神经元则根据特定输入而变化。据此 PowerInfer 设计 GPU-CPU 混合推理引擎:热-激活神经元预加载到 GPU 上以便快速访问,而冷-激活神经元在 CPU 上计算,从而显著减少 GPU 内存需求和 CPU-GPU 数据传输。PowerInfer 进一步集成自适应预测器和神经元-觉察稀疏算子,优化了神经元激活效率和计算稀疏性。评估表明,PowerInfer 在单个 NVIDIA RTX 4090 GPU 上对各种 LLM(包括 OPT-175B)的平均tokens生成率为 13.20 个tokens/秒,峰值为 29.08 个tokens/秒,仅比顶级服务器级 A100 GPU 低 18%。这显著优于 llama.cpp,最高可达 11.69 倍,同时保持模型精度。
在消费级 GPU 上部署 LLM 面临着巨大的挑战,因为它们需要大量的内存。LLM 通常用作自回归 Transformer,按顺序逐个生成文本tokens,每个token都需要访问由数千亿个参数组成的整个模型。因此,推理过程从根本上受到 GPU 内存容量的限制。这种限制在本地部署中尤其严重,因为本地部署中单个请求的处理(通常一次只处理一个)[6] 几乎没有并行处理的机会。
解决此类内存问题的现有方法包括模型压缩和卸载。量化 [12, 46]、蒸馏 [48] 和修剪 [23] 等压缩技术可以减小模型大小。然而,即使是深度压缩的模型对于消费级 GPU 来说仍然太大。例如,一个具有 4 位精度的 OPT-66B 模型需要大约 40GB 内存才能加载其参数 [20],甚至超过 NVIDIA RTX 4090 等高端 GPU 的容量。模型卸载在 Transformer 层级别将模型划分到 GPU 和 CPU 之间 [3, 14, 37]。像 llama.cpp [14] 这样最先进的系统将层分布在 CPU 和 GPU 内存之间,利用两者进行推理,从而减少所需的 GPU 资源。然而,这种方法受到 PCIe 互连速度慢和 CPU 计算能力有限的阻碍,导致推理延迟高。
LLM 推理中内存问题的关键原因是硬件架构与 LLM 推理特性之间的局部性不匹配(locality mismatch)。当前的硬件架构采用针对数据局部性(data locality)优化的内存层次结构设计。理想情况下,小型、频繁访问的工作集应存储在 GPU 中,GPU 提供更高的内存带宽但容量有限。相反,较大、不常访问的数据更适合 CPU,CPU 提供更广泛的内存容量但带宽较低。然而,每次 LLM 推理迭代所需的大量参数导致工作集对于单个 GPU 来说太大,从而阻碍了有效的局部性利用。
LLM 推理固有地表现出高度局部性。具体而言,在每次推理迭代期间,只有有限数量的神经元被激活,从而显著影响 token 推理的结果。这些特定于输入的激活可以在运行时准确预测。例如,在 OPT 模型中,激活图中不到 10% 的元素是非零的,这些元素在运行时的预测准确率超过 93% [21]。值得注意的是,LLM 中的神经元激活遵循斜幂律分布:一小部分神经元始终对各种输入中大多数激活(超过 80%)做出贡献(热激活),而大多数神经元参与剩余的激活,这些激活根据运行时的输入确定(冷激活)。
LLM 推理是一种自回归模型,它根据之前的tokens生成每个token。如图所示,该过程从提示(例如“我喜欢阅读(I love reading)”)开始,分为两个阶段:首先,提示阶段输出初始token(“OSDI”),然后生成阶段按