经典思辨|PowerInfer-2:在内存受限的移动设备上运行大型语言模型

文摘   科技   2024-09-23 12:01   北京  
提要

本文是对SOSP’24 PowerInfer在移动设备上的扩展工作PowerInfer-2的介绍。本文介绍了PowerInfer-2,这是一个专为在智能手机上进行大规模语言模型(LLMs)高速推理而设计的框架,尤其适用于那些大小超过设备内存容量的模型。PowerInfer-2的核心在于利用智能手机中的异构计算、存储和输入输出(I/O)资源,通过将传统的矩阵计算分解为细粒度的神经元簇计算。具体而言,PowerInfer-2具备一个多态神经元引擎,可以根据大型语言模型推理的不同阶段调整计算策略。此外,它引入了分段神经元缓存和细粒度神经元簇级别的流水线技术,有效地最小化并掩盖了由I/O操作带来的开销。PowerInfer-2的实现与评估表明,其能够在两部智能手机上支持多种LLM模型,相比于最先进的框架,速度提高了最多29.2倍。

背景介绍
MPIWasm运行时基于Wasmer运行时实现,支持:(1)通过将基于MPI的HPC应用程序编译为Wasm来实现高性能执行;(2)通过零复制内存操作实现 MPI 调用的低开销;(3)支持高性能互连,例如Infiniband和Intel OmniPath;(4)通过在Wasm和主机MPI库间提供转换层使得开发人员无需了解目标 HPC 系统上存在的特定MPI库或网络互连。

为了保护用户隐私,在移动设备(如智能手机)上运行大型语言模型(LLM)已经成为了一项迫切需求。然而,智能手机的算力和内存都较为有限。对此,通常的解决措施有两种,一种是采用更加精炼紧密的小型语言模型,例如谷歌的Gemini Nano 3.25B;另一种是用NVMe存储作为交换,例如LLM in a flash。对于前者,由于大型语言模型存在尺度定律和涌现能力,小模型通常要承受潜在的生成质量损失;对于后者,移动设备的存储设备通常具有更低的带宽和单一的命令队列(通常意味着无法进行并行读写以最大化带宽),因此IO很容易成为整个系统的巨大瓶颈,从而极大拖慢运行速度。

图1:XPU计算性能和I/O吞吐量分析

框架设计
MPIWasm运行时基于Wasmer运行时实现,支持:(1)通过将基于MPI的HPC应用程序编译为Wasm来实现高性能执行;(2)通过零复制内存操作实现 MPI 调用的低开销;(3)支持高性能互连,例如Infiniband和Intel OmniPath;(4)通过在Wasm和主机MPI库间提供转换层使得开发人员无需了解目标 HPC 系统上存在的特定MPI库或网络互连。
为此,作者提出了Powerinfer2,首个能够在内存受限的设备上高速运行大型(超出当前可用内存大小,最大达到47B)的语言模型的推理框架。正如Powerinfer-1,Powerinfer-2同样利用了大型语言模型的内在的一个固有特征:动态稀疏激活性。该特征是指在每个推理迭代中,模型会根据自身的输入来决定权重的某一部分是否被使用。与前代不同,Powerinfer-2的关键挑战在于如何充分利用端侧设备的异构处理器(例如CPU的大小核心、GPU和NPU)。另一个重要挑战是由于缓存未命中而导致的不可避免的IO开销,即需要universal flash storage (UFS) 4.0存储设备中将数据搬移到内存。这两者都具有较大的权衡与调优空间。

如图1所示,首先,移动设备的SoC中有CPU、GPU和NPU,每个处理器的latency-FLOPs曲线都不同。CPU中,核心数量、大小核心的配置不同,曲线不同(值得注意的是CPU的算力比mobileGPU还要高);不同处理器的曲线也不相同,尤其是GPU、NPU等并行性较强的处理器,在FLOPs较低时常常会出现利用率不足的问题,即FLOPs降低,时延却无法随之降低。其次,不同的IO配置也会带来不同的吞吐。4KB的读写大小增长到64KB,读写性能(吞吐量,MB/s)增加了2倍以上(data range在4KB的读写的时候会有一定影响,再大则基本没有了)。另外,使用不同的CPU核心来进行IO也会对吞吐产生一定的影响。

其次,不同的IO配置也会带来不同的吞吐。4KB的读写大小增长到64KB,读写性能(吞吐量,MB/s)增加了2倍以上。另外,使用不同的CPU核心来进行IO也会对吞吐产生一定的影响。

图2:Powerinfer-2整体框架设计


为了解决以上挑战,Powerinfer-2的核心想法在于提出一种新的神经元簇(neuron cluster)抽象,如图2所示。这种神经元簇内可以包含一个矩阵中任意数量的神经元,而非1个或者全部神经元(一个神经元在这里指一个矩阵的一行或者列)。不同于以往的以矩阵为粒度的计算抽象需要对整个矩阵全部加载到内存中再进行计算,这种神经元簇的粒度允许更为灵活的计算-IO的overlap。与powerinfer等以神经元为粒度的计算不同,神经元簇的抽象允许以更加高的并行性来充分利用prefill阶段的密集计算的特性。

基于以上抽象,Powerinfer-2通过处理器和IO能力来选择最优的神经元簇划分和大小。在decode阶段,CPU负责计算,因此每个CPU处理的神经元簇比在prefill阶段由NPU计算的小很多。prefill阶段由于稀疏性较低,所有神经元形成一个矩阵,无需稀疏处理。在此阶段,CPU负责将不在内存中的权重加载到内存中,并将加载的权重从int4格式解量化为fp16格式。大核负责加载,解量化则由中核完成。由于是连续内存操作,这样可以充分利用带宽,IO和计算以重叠形式进行。

在decode阶段,如图3所示,计算的稀疏性很高,因此使用CPU效果更好。每个神经元簇由一个CPU核计算,同时有一个额外的核负责IO。这些操作同样可以重叠进行。即使attention层没有表现出稀疏性,powerinfer-2依然使用CPU处理。CPU首先读取attention模块的权重,并进行计算,然后运行predictor决定后续权重矩阵的激活情况。如果神经元不在内存中,CPU会从磁盘重新加载这些数据。


图 3: 预填充阶段和解码阶段的两种计算工作流程。(a) 预填充阶段采用以NPU为核心的工作流程,NPU负责计算,CPU负责准备工作;(b) 解码阶段采用以CPU为核心的工作流程,仅使用CPU核心来利用稀疏激活。


在缓存策略上,powerinfer2提出了分段缓存策略,将内存划分为多个区域,每个区域有特定的预取和驱逐策略。attention权重全部保留在内存中,而FFN权重则采用LRU策略管理,使用双队列维护最容易被激活的权重。同时,powerinfer-2根据UFS的I/O特性进行了细粒度优化。I/O的最小单位是entry/bundle(通常是gate/up/down三个神经元组成),这些神经元共享一个激活控制机制。与LLM in a flash不同,powerinfer-2因为LRU策略的存在,连续激活模式较少。一个bundle的激活概率为80%左右。


对于量化模型,作者通过随机读写最大化I/O带宽。4比特量化模型的一个entry占用7.5KB,而UFS执行4K读写时更快,因此bundle会分为两个4KB来读写。基于神经元集群的抽象,powerinfer2采用了细粒度的流水线设计,最小化了I/O延迟。与传统矩阵层面的抽象不同,这种设计减少了计算中的气泡。举例来说,4个CPU核心负责计算,1个负责IO。在矩阵为粒度的情况下,IO时间大于计算时间,导致气泡产生。而在powerinfer2的流水线中,内存中的神经元无需等待整个矩阵加载完毕就能提前计算,从而减少延迟。


最后,为了适应不同的模型、SoC和用户指定的资源限制,powerinfer2对系统开销进行了建模,并采用SMT求解器Z3进行离线求解,得出最优配置方案。

实验评估
MPIWasm运行时基于Wasmer运行时实现,支持:(1)通过将基于MPI的HPC应用程序编译为Wasm来实现高性能执行;(2)通过零复制内存操作实现 MPI 调用的低开销;(3)支持高性能互连,例如Infiniband和Intel OmniPath;(4)通过在Wasm和主机MPI库间提供转换层使得开发人员无需了解目标 HPC 系统上存在的特定MPI库或网络互连。

Powerinfer2在Powerinfer1的基础上增加了12,000行C++代码实现。作者选用了高端智能手机一加12和中端智能手机一加Ace2进行测试。测试模型包括Mistral-7B、Llama-7B/13B和Mixtral-47B,且通过微调进一步增强了模型的稀疏性。实验中,作者将Powerinfer2与三个常见的端侧LLM推理框架进行了对比,分别为llama.cpp、LLM in a Flash和MLC-LLM。

图4:PowerInfer-2、llama.cpp和LLMFlash的解码速度对比

在decode速度测试中,实验设定了50%的内存约束,即一半的参数可以保留在内存中。对于MoE模型,由于内存不足,75%的参数被完全offload到磁盘。相比baseline,Powerinfer2的decode速度提升了最高达29.2倍。

图5在offloading场景下,PowerInfer-2、llama.cpp和LLMFlash在提示长度为128和512个token时的预填充速度对比

图6:在OnePlus 12上TurboSparse-Mixtral-47B模型预填充阶段,提示长度为128和512个token时的计算和顺序I/O时间对比。

如图5,对于prefill速度,powerinfer2获得了最高9.36倍的速度提升。该提升主要得益于利用了SoC中的NPU的强大的密集计算的吞吐。值得注意的是,如图6所示,预填充阶段主要是计算密集型操作,权重可以提前预取,计算完成后即释放。因此,在整个过程中,内存的容量和带宽都不会构成瓶颈。
总结
MPIWasm运行时基于Wasmer运行时实现,支持:(1)通过将基于MPI的HPC应用程序编译为Wasm来实现高性能执行;(2)通过零复制内存操作实现 MPI 调用的低开销;(3)支持高性能互连,例如Infiniband和Intel OmniPath;(4)通过在Wasm和主机MPI库间提供转换层使得开发人员无需了解目标 HPC 系统上存在的特定MPI库或网络互连。

Powerinfer2是一个在内存受限的端侧设备上实现高速运行大语言模型的框架。其核心创新在于利用智能手机的异构资源,将矩阵计算转化为更易管理的神经元集群。多款智能手机的评测结果显示,Powerinfer2相比基线系统最高可提升29倍的性能。此外,该框架也是首个能够在智能手机上高效运行超大规模语言模型(如47B)的系统。

编辑:尹望嵩

原文作者:Zhenliang Xue*, Yixin Song*, Zeyu Mi , Le Chen, Yubin Xia, and Haibo Chen

数据空间技术与系统
数据空间技术与系统全国重点实验室面向国家数据空间建设的中长期战略需求和重大任务,开展数联网基础软件与数据空间操作系统的技术体系、标准规范、核心系统、试验环境、应用示范与开源生态等重点任务研究。
 最新文章