在本地机器上运行AI(LLM推理)正变得越来越流行,尤其是在使用更新、更强大的7到700亿参数的模型时。本地LLM有助于解决一些隐私/GDPR(欧盟的GDPR法规)问题,并更好地控制实验成本。然而,人们普遍认为,本地LLM需要GPU来加速,或使用NPU来降低能耗——因为仅靠CPU确实太慢了,但最先进的AI软件是否真的必须使用GPU呢?
在我们讨论这个问题之前,我们需要讲一些基本的前提知识。
LLM推理的瓶颈是什么?LLM推理过程包括两个部分——首先分析提示(简称PP),然后逐字生成LLM响应(简称TG)。
LLM 推理的提示可能很长,可能包含多个部分——例如系统提示和用户提示,或者在检索增强生成(RAG)的情况下,这是本地 AI 的一个主要用例,因为你不希望将专有知识放到线上。提示可能由一系列知识片段组成,这些片段被系统提示和用户查询所包围。
LLM-Inference 是为每个新的输入令牌进行大量的复杂数学运算计算。每次计算都会考虑到到目前为止的所有输入令牌(其中包括所有先前的输出令牌作为下一个输入令牌的依据)以及模型的所有参数(数十亿个)。比如大规模的矩阵乘法。
这就意味着,对于每一次计算运行,模型需要将它所有的数十亿个参数加载到处理单元(如CPU或GPU/NPU)中。现代芯片通常具有片上缓存来加速这一过程,但由于缓存容量通常只有兆字节而不是千兆字节,它们无法缓存数十亿个参数——因此除了快速处理外,我们还需要配备非常快速的内存。
所以,在现代计算机上进行令牌生成(拥有足够的计算速度),内存带宽是主要瓶颈。NVIDIA GPU 不仅处理速度快,而且其内存带宽非常高(例如,RTX 4090 拥有 24GB 内存和约 1TB/s 的带宽)。苹果硅通过使用更宽的内存来解决这个问题——M1、M2 及后续型号拥有 128 位和 100–120GB/s 的带宽(新的 Copilot+ PC 类似),M1 Ultra 和 M2 Ultra 将其翻倍至 256 位和 200–273GB/s,M1 Max 和 M2 Max 再次翻倍至 512 位和 400–546GB/s,而 M1 Ultra 和 M2 Ultra 再次将其翻倍至 1024 位和 800GB/s(速度几乎与 NVIDIA RTX 4090 相当)。
你需要将所有大语言模型的参数和一些额外开销放入“硬件”的内存中(对于专用GPU是VRAM,而对于集成的GPU、CPU或NPU则是统一内存)。苹果芯片的一大优势在于,其较大的内存(最多可达128GB/192GB)相比NVIDIA的更便宜。
在处理提示时(以及大型语言模型的训练和微调),计算可以分批次进行。这减少了内存读取传输的需求,计算速度就会成为主要瓶颈。此时,例如NVIDIA和AMD的GPU,以及苹果M2 Max/Ultra同样表现出色,但如果提示相对简短,这个问题就不那么明显。
TLDR: 在生成每个响应标记时,大语言模型(LLM)需要加载所有参数(通常以GBytes为单位)到处理单元中。一个较快的处理器(如GPU/NPU,或者具有向量指令的现代CPU)比其内存(RAM)还要快,所有参数都存储在内存中。因此,内存带宽通常是生成标记的限制或瓶颈。但对于处理较长的提示(例如使用RAG)或训练/微调模型来说,计算能力(如GPU速度)仍然至关重要。
更大的模型总是更好,不是吗?嗯,这得看情况!我们发现,在推理过程中内存带宽至关重要,你需要把这些参数都塞进快速内存里,但是快速内存的容量有限且价格昂贵。
量化是一种关键的创新,通过减少计算中的精度来降低内存大小的需求,因此需要为参数存储较少的数字。通过量化,你可以在更少的内存中存储更大的模型。尽管量化计算有时会稍微增加一些负担,但在给定参数数量的情况下,令牌生成速度会更快——因为你需要向处理器推送较少的字节。但你会损失一些精度——例如,将16位(FP16)量化到4位(Q4_0)可以减少大小72%,提高TG速度160%,但仅降低了约5%的准确性(例如,在Wiki2困惑度下,使用LLaMa-2模型(llama.cpp,M2 Ultra)测试:更多信息见此讨论[1])。
[1] https://github.com/ggerganov/llama.cpp/discussions/2094
Llama.cpp 提供了一个关于不同量化和苹果芯片硬件处理速度的对比(注意:PP 关联 GPU 性能,TG 关联内存带宽)。
量化精度还可以通过微调量化算法(例如使用名为iQant的方法)进一步提高——通过这种方法,您可以更精细地调整精度,从而更准确地存储关键数据。这样您不仅有Q4_0(原始的Q4),还有Q4_K_S、Q4_K_M等多种选择。
还有一个新的超快1.58Bit(1.58Bit)/三值(-1/0/+1作为值)/BitNet(BitNet)量化方法。这需要对模型进行特殊的微调过程。我还没有试过这些模型的准确性和困惑度。
依我来看,llama.cpp github-repository 在支持最新量化技术和CPU/GPU加速方法方面处于前沿技术。
摘要: 大规模语言模型的量化减小了模型的大小,提升了运行速度,仅稍微影响了一点质量。目前被认为最佳的量化是 Q5 或 Q4。通过这些方式,您可以选择高参数模型的好处,将其适应到您的 RAM 内存中,而不会牺牲太多性能质量。
一个LLM会话可能由多个提示和响应组成,这些信息共同构成了LLM交互的上下文——例如,用于澄清或增强初始问题。会话中的所有标记都需要适应特定于模型和AI软件的上下文限制。如果会话超出上下文限制,之前的信息就会被遗忘。从技术角度看,模型会缓存会话中每个提示或响应的处理结果(包括所谓的KV缓存)。随着上下文大小的增加,这会消耗大量内存,且需要快速内存,因为处理每个新标记时都需要使用先前的完整缓存。
TDLR: 小心长上下文需要大量的高速内存——例如,128k 上下文的 LLaMa-65B 需要大约 17GB 的 KV 缓存。
NPU(或苹果公司的ANE)是计算机中的专用部件,用于运行AI——主要通过其特殊硬件来减少能耗。尽管数据中心也有NPU,但我在这里主要讨论的是笔记本电脑、平板电脑和智能手机中的NPU,它们可以像能耗较大的GPU一样提供节能加速。理论上,它们听起来非常有趣,然而,它们的主要缺点是需要特殊的编程。
在GPU编程方面,有NVIDIA的CUDA、Apple的Metal,或者像Vulkan这样的供应商中立的API。尽管它们仍然相当复杂,但这些工具已经存在了很多年,并且也可以扩展。
不过,每个NPU供应商都有专有的API,这些API通常功能有限、没有详细说明且难以扩展。这也是为什么它们通常仅被特定供应商的AI软件(如Windows、iOS/macOS)使用。常用的AI软件(ollama、llama.cpp、LM-Studio等)使用CPU或GPU。即使是苹果自家友好的开源MLX AI框架也只能在苹果的GPU上运行,而不能在ANE上运行。依然分散多变的NPU市场也是造成这种情况的原因。
简而言之: 虽然微软和苹果大力推广他们的Copilot+ NPUs / ANE,但实际上这些产品并不能真正用来运行你自己的本地LLM。
现代的CPU核心可以一次执行多个加法/乘法/等运算。对于基于arm的CPU,如苹果的硅芯,这些运算由NEON单元处理,Snapdragon X/8 Plus/Elite这些也支持同样的指令。此外,最新的Intel/AMD芯片同样提供了类似的功能。
有时候你的GPU不被某些AI软件支持——比如ollama或LM Studio在Snapdragon X平台上。因此你可能需要切换到CPU运行。
此外,容器(如 Docker、Podman 等软件提供)和虚拟机(如 VMware、Parallels、Hyper-V、Proxmox、QEMU 等软件提供)在隔离应用程序以增强安全隔离并减少安装开销方面非常出色。它们非常适合用来运行和试验最新的 AI 软件,而无需立即让计算机暴露于不必要的恶意软件感染风险中。但是,容器和虚拟机的问题在于,它们不支持集成 GPU/NPU 的硬件虚拟化——例如在 Mac 机或大多数配备集成 GPU/NPU 的 PC 上。
许多现代AI软件,例如ollama、LM-Studio……都是基于llama.cpp作为后端技术。在我看来,llama.cpp团队在提供广泛的GPU和CPU优化代码方面处于前沿,尤其在量化后的模型上表现出色。请注意:llama.cpp几乎总是有更好的CPU优化效果。这些版本几乎每天都在变化,提供了不同的运行速度。需要注意的是——速度有时会暂时下降,有时旧版本会更快。
最近,微软/T-MAC团队在github(也在将其整合到llama.cpp中)展示了,通过他们最新的算法和低比特量化(Q2-Q4),CPU可以比GPU/NPU更快(不过我认为,也是在相同的带宽下)。作为软件人,我的个人看法是:我喜欢专用且快速的硬件,但如果你将硬件专业化得太过了,有时可能赶不上软件创新的步伐。这是其中一个例子,即“CPU比集成的GPU/NPU还要快”。
在CPU上运行同样也更省电,比在GPU上运行。
TLDR: 对于使用集成显卡的PC,你很可能会不得不在CPU上运行AI。同样地,如果你在Mac的容器/虚拟机中运行AI,。llama.cpp 团队(其代码被ollama,LM-studio 等项目使用)正在努力提高这种配置下的性能。
如果你能容忍2到4位LLM量化精度,可以使用基于llama.cpp的AI(如ollama、LM-Studio…),并且你有快速的RAM,你就可以很容易地仅用CPU运行你的AI。在这样的情况下,对于拥有足够计算能力的PC来说,这可能比在它的GPU/NPU上运行还要快。
如果你有一台带有M1芯片的Mac,需要运行容器或虚拟机,你也必须只用CPU来运行。
附注:对于苹果硅芯片(Apple Silicon),你可以用 Podman 容器运行 AI 应用,这些容器带有其实验性的基于 Vulkan 的 GPU 支持功能,但这种方法仍然慢得多,比只用 CPU 运行时要慢(你可以查看我之前在 medium.com 上发表的文章,我这周重新测试了,仍然太慢)。