存根 PowerInfer:使用消费级 GPU 提供快速大型语言模型 - Unite.AI
关注我们.

人工智能

PowerInfer:使用消费级 GPU 提供快速大型语言模型

mm
更新 on

由于其卓越的内容创建能力,生成式大语言模型现在处于人工智能革命的最前沿,并不断努力增强其生成能力。然而,尽管进步很快,这些模型仍然需要大量的计算能力和资源。这主要是因为它们由数千亿个参数组成。此外,为了平稳运行,生成式人工智能模型依赖于数千个 GPU,从而导致运营成本高昂。高操作要求是生成式人工智能模型尚未有效部署在个人级设备上的一个关键原因。

在本文中,我们将讨论 PowerInfer,这是一种高速 LLM 推理引擎,专为由单个消费级 GPU 驱动的标准计算机而设计。 PowerInfer 框架旨在利用 LLM 推理中固有的高度局部性,其特征是神经元激活中的幂律分布。这意味着在任何给定时间,一小部分“热”神经元在输入过程中始终处于活动状态,而其余的“冷”神经元则根据特定输入或要求激活。这种方法使 PowerInfer 框架能够降低生成式 AI 产生所需输出所需的计算能力。

我们将详细深入研究 PowerInfer 框架,探索其方法论、流程和实际应用结果。让我们开始。

PowerInfer:具有消费级 GPU 的快速大型语言模型

生成大型语言模型,例如 ChatGPT 和 DALL-E,以复杂的生成和自然语言处理任务而闻名。由于其高计算要求,这些模型通常部署在具有高级 GPU 的数据中心中。对如此高计算能力的需求限制了它们在数据中心的部署,这凸显了在个人计算机等更易于访问的本地平台上部署大型语言模型的必要性。

提高大型语言模型的可访问性可以降低推理和内容生成成本,增强数据隐私并允许模型定制。此外,虽然数据中心部署优先考虑高吞吐量, 本地 法学硕士部署 由于批量较小,可以专注于低延迟。

然而,由于其大量的内存需求,在本地设备上部署这些模型会带来重大挑战。大型语言模型充当自回归转换器,逐个生成文本标记,每个标记都需要访问包含数千亿个参数的整个模型。这需要大量高端 GPU 来生成低延迟输出。此外,本地部署通常按顺序处理各个请求,从而限制了并行处理的潜力。

为了解决生成式人工智能框架的复杂内存需求,现有解决方案采用模型卸载和压缩等方法。蒸馏、修剪和量化等技术减少了模型大小,但对于个人计算机中的标准级 GPU 来说仍然太大。模型卸载在 CPU 和 GPU 之间的 Transformer 层对模型进行分区,允许跨 CPU 和 GPU 内存进行分布式层处理。然而,这种方法受到缓慢的 PCIe 互连和 CPU 有限的计算能力的限制,导致推理延迟较高。

PowerInference框架认为LLM推理特性与硬件结构的不匹配是LLM推理中内存问题的主要原因。理想情况下,频繁访问的数据应存储在高带宽、有限容量的 GPU 中,而不频繁访问的数据应存储在低带宽、高容量的 CPU 中。然而,每次LLM推理迭代的参数量较大,使得单个GPU的工作集太大,导致局部性利用效率低下。

大型语言模型中的推理过程表现出高度的局部性,每次迭代都会激活有限数量的神经元。 PowerInference 框架旨在通过使用 GPU 管理少量热神经元,同时 CPU 处理冷神经元来利用这一局部性。它预选并预加载 GPU 中的热神经元,并在运行时识别激活的神经元。这种方法最大限度地减少了昂贵的 PCIe 数据传输,允许 GPU 和 CPU 独立处理分配给它们的神经元。

然而,在本地设备上部署法学硕士面临着障碍。在线预测器对于识别活跃神经元至关重要,会消耗大量 GPU 内存。 PowerInfer 框架使用自适应方法为具有较高激活偏度和稀疏度的层构建小型预测器,在保持准确性的同时减小尺寸。此外, 法学硕士框架 需要专门的稀疏算子。 PowerInfer 框架采用神经元感知稀疏运算符,直接与神经元通信,从而无需进行特定的稀疏格式转换。

最后,在 CPU 和 GPU 之间以最佳方式放置激活的神经元具有挑战性。 PowerInfer 框架使用离线阶段来创建神经元放置策略,测量每个神经元对 LLM 推理结果的影响并将其构建为整数线性问题。

架构和方法论

下图详细阐述了 PowerInfer 框架的架构,由管道中的离线和在线组件组成。 

由于观察到不同地区的局部特性存在差异 大型语言模型,离线组件描述了 LLM 框架的激活稀疏性,使其能够区分热神经元和冷神经元。另一方面,在离线阶段,两种类型的神经元被推理引擎加载到CPU和GPU中,从而在运行时以低延迟服务LLM请求。 

离线阶段:策略求解器和法学硕士分析器

在离线阶段,LLM 分析器组件使用从通用数据集派生的请求来从推理过程收集激活数据。第一步,它监视框架中所有层的神经元的激活,然后使用策略求解器组件将神经元分类为热神经元或冷神经元。策略求解器的主要目标是将更频繁激活的神经元分配给 GPU 层,同时将剩余的神经元分配给 CPU 层。在第二阶段,策略求解器组件使用神经元影响指标和硬件规格来平衡各层之间的工作负载,并利用整数线性规划最大化 GPU 对神经元的影响指标。 

在线阶段:Neuron Aware LLM 推理引擎

一旦离线阶段成功执行,框架就会继续执行在线阶段。在该过程的第三步中,在线引擎根据离线策略求解器的输出,在处理用户请求之前将热神经元和冷神经元分配给各自的处理单元。在运行时期间,在步骤 4 中,在线引擎通过创建 CPU 和 GPU 执行器(即在 CPU 端运行的线程)来管理 GPU-CPU 计算。然后,引擎预测激活的神经元并继续跳过未激活的神经元。然后激活的神经元被预加载到 GPU 中进行处理。同时,CPU计算并传输其神经元的结果以与GPU集成。在线引擎能够专注于矩阵内的单个神经元行和列,因为它在 CPU 和 GPU 上使用稀疏神经元感知运算符。 

自适应稀疏预测器

PowerInfer 框架中的在线推理引擎减少计算负载的主要概念是,它只处理预测将被激活的神经元。传统上,在每个 Transformer 层中,框架利用两个不同的预测器来预测 MLP 和自注意力块中神经元的激活,因此推理计算仅限于预测为活动的神经元。然而,由于资源数量有限,很难平衡模型大小和预测精度,因此很难为本地部署设计有效的预测器。由于框架经常部署这些预测器来预测活动神经元,因此需要将它们存储在 GPU 中以实现更快的访问。然而,框架通常会部署大量的预测器,占用大量内存,甚至是存储 LLM 参数所需的预测器。 

此外,预测变量的大小通常由两个因素决定:LLM 层的内部偏度和稀疏度。 

为了优化这些因素,PowerInfer 框架对 Transformer 层中的每个预测器使用迭代训练方法,但没有固定大小。在该训练方法的第一步中,基于模型的稀疏性轮廓建立基线模型的大小,并通过考虑内部激活偏度来迭代调整模型的大小以保持准确性。 

神经元放置和管理

如前所述,当离线策略求解器组件确定神经元放置策略时,在线推理引擎组件根据生成的策略将模型加载到 GPU 和 CPU 内存中。对于可能有也可能没有多个权重矩阵的每一层,PowerInfer 框架根据神经元是否热激活将每个神经元分配给 CPU 或 GPU。确保按照确定的序列准确计算分段神经元对于获得精确的结果至关重要。为了解决这个问题,PowerInfer 框架生成两个神经元表:一个位于 GPU 中,另一个位于 CPU 内存中,每个表将各个神经元与其在矩阵中的原始位置相关联。 

神经元感知算子

考虑到在大型语言模型中观察到的激活稀疏性,不活动的神经元及其权重可以通过矩阵乘法运算绕过,从而需要使用稀疏运算符。 PowerInfer 框架没有采用具有多种限制的稀疏运算符,而是采用神经元感知运算符,直接在 GPU 和 CPU 上计算激活的神经元及其权重,无需在运行时转换为密集格式。神经元感知算子与传统的稀疏算子不同,因为它们关注单个矩阵内的各个行和列向量,而不是关注整个矩阵。 

神经元放置策略

为了利用 CPU 和 GPU 的计算能力,PowerInfer 框架中的离线组件会生成一个放置策略,在将神经元分配到 CPU 或 GPU 层时指导框架。策略求解器生成此策略,并控制每层内的神经元放置,这有助于确定各个处理单元的计算工作量。在生成放置策略时,策略求解器组件会考虑不同的因素,包括每个神经元的激活频率、通信开销以及每个处理单元的带宽和内存大小等计算能力。 

结果与实施

为了展示 PowerInfer 框架在不同硬件配置的设备上的泛化能力,实验在两台不同的个人计算机上进行:一台配备 Intel i9-13900K 处理器、NVIDIA RTX 4090 GPU 和 192 GB 主机内存,另一台则运行于 Intel i7-12700K 处理器、NVIDIA RTX 2080Ti GPU 和 64 GB 主机内存。 

PowerInfer 框架的端到端性能与批次大小为 1 和默认部署设置的 llama.cpp 进行了比较。然后,考虑到在现实世界对话输入和输出中观察到的长度变化,该框架从 ChatGPT 和 Alpaca 数据集中对提示进行采样。下图展示了不同模型的生成速度。 

可以看出,PowerInfer 框架每秒生成 8.32 个令牌,最高可达每秒生成 16 个令牌,从而大幅优于 llama.cpp 框架。此外,随着输出令牌数量的增加,PowerInfer 框架的性能也会提高,因为生成阶段会显着影响整体推理时间。 

此外,从上图中可以看出,PowerInfer 框架在低端 PC 上的性能优于 llama.cpp 框架,峰值生成率为每秒 7 个令牌,平均令牌生成速度为每秒 5 个令牌。 

上图展示了两个框架的 GPU 和 CPU 之间的神经元负载分布。可以看出,PowerInfer 框架显着增加了 GPU 的神经元负载份额,从 20% 增加到 70%。 

上图对比了两种框架在两台不同规格的PC上的性能。可以看出,与 llama.cpp 框架相比,PowerInfer 框架始终提供较高的输出令牌生成速度。 

最后的思考

在本文中,我们讨论了 PowerInfer,这是一种高速 LLM 推理引擎,适用于由单个消费级 GP 驱动的标准计算机。 PowerInfer 框架的核心是尝试利用 LLM 中的高度局部性固有推理,这是一种以神经元激活幂律分布为特征的方法。 PowerInfer 框架是一个专为大型语言模型设计的快速干扰系统,它利用自适应预测器和神经元感知算子来激活神经元和计算稀疏性。 

“职业工程师,心灵作家”。 Kunal 是一位技术作家,对人工智能和机器学习有着深厚的热爱和理解,致力于通过他引人入胜且信息丰富的文档来简化这些领域的复杂概念。