在苹果硅片的电脑本地运行大模型的性能

lama.cpp允许你在自己的电脑上运行大型语言模型(LLM)。影响性能的关键因素包括CPU、GPU、RAM的大小与速度,以及所用的模型。这里是一个概览,帮助你决定应该选择哪种电脑和量化方式。特别强调这里说的是苹果硅片机Apple Silicon,因为它们支持大容量和高速度的RAM。
Georgi的创新使我们能够通过llama.cpp在本地运行LLM,并且功能不断增加。模型量化也很关键,因为它减小了存储需求。现在,我们可以使用多种技能和量化格式的LLM,例如在huggingface/theBloke上(请注意,要运行llama.cpp需要GGUF模型格式)。Georgi最近还开始了一个仅针对苹果硅片的性能统计比较,提供数据帮助我们在硬件选择和量化效果上做出决策。以下是我的一些主要观点,这些观点通过我的本地实验得到增强。
LLM的“回答”性能(为单个用户生成令牌)主要取决于:
a) 可用的RAM需大于模型的内存需求 — 参见huggingface上的模型说明。
在GPU上运行通常比在CPU上快得多,但具体快多少则取决于GPU和CPU的性能。
llama.cpp允许模型在GPU或仅CPU上运行。通过现代CPU的SIMD指令有所加速,并使用了较便宜的CPU内存。但是,GPU通常更快,例如,在我的M2 MacBook Air上运行llama-2 7B(Q4_K_S量化)的速度,在GPU上比CPU快约1.5倍。在我的M2 Max上,GPU的速度是CPU的2.5倍 — 但这里的GPU速度已经受到内存带宽的限制了。
对于Apple硅片的llama.cpp CPU推断,只使用P核心,不要使用E核心,只需使用参数-t <P核心数量>。如果你设置的-t参数超过了P核心的数量,会降低性能。
请注意,Intel/AMD的消费级CPU虽然有很好的SIMD指令,但它们的内存带宽通常最多或低于M2/M3的100GB/s。Apple的Pro/Max/Ultra提供了统一内存,通过增加内存总线宽度到256/512/1024位来提供更高的内存带宽。现代的NVIDIA/AMD GPU通常使用更高性能的快速RAM和宽总线组合,但这更昂贵、耗电,并需要在CPU和GPU RAM之间复制数据。
b) GPU的RAM速度可能比GPU的处理速度更重要,除非能够进行“批处理”,如在初始提示处理或训练时。显然,当生成单个令牌(不进行批处理时),强大的GPU更多是在等待缓存填充,而不是在进行计算(参见Andrej Karpathy的文章)。
因此,例如,宣称更快的M3 Pro(具有更快的GPU,但只有150GB/s的内存带宽)在Georgi的数据表中比M2 Pro(200GB/s)慢20%。
a)+b)表明,苹果硅片机器因其大容量/高速度RAM而对本地LLM很有吸引力。Ultra的带宽理论上只比NVIDIA 4090慢20%,即使Ultra的处理能力不到4090的三分之一。但它支持的RAM是4090的8倍,且仅消耗其十分之一的电力。
更新:Marcin Gomułkiewicz刚在Georgi的数据表中发布了PC + NVIDIA 4090的结果。对于令牌生成,4090比M2 Ultra(llama-2 7B FP16/Q4_0)快1.5倍/1.67倍。在GPU密集的提示处理中(类似于训练或完全批处理),4090快7倍。因此,4090非常适合任何RAM需求少于24GB的任务,并在任何需要计算的任务上都比苹果硅片更出色。
c) 量化quantization压缩减少了RAM使用,并通常提供了额外的速度,这是因为b)。但是,增加的压缩稍微降低了结果的准确性。因此,这是速度与准确性之间的权衡。此外,像“K”量化这样的现代量化方法可能优于旧的“_0”和“_1”。请参见huggingface的模型说明,了解尺寸和准确性之间最佳权衡的信息。
量化还需要更多的计算,并且这样更好地利用了受内存带宽限制的GPU。然而,对于高度量化的模型,内存带宽和GPU性能的提升不再是线性的。
在实际使用中,我的M2 Max(38核GPU,400GB/s RAM)对于llama-2 7B Q4_K_S量化,比我的M2(10核CPU,100GB/s RAM)快3倍。这并不是只因为GPU/带宽所暗示的4倍,这是对于非量化但更慢的FP16模型的情况。将Max升级到Ultra,对于Q4_0量化,性能提升只有1.5倍,而不是2倍(基于Georgi的数据)。
CPU量化的说明:尽管Apple Silicon也为Pro/Max/Ultra提供了更高带宽的内存,但CPU无法充分利用这一点。我的M2 Max在6核CPU模式下运行llama-2 7B Q4_K_S令牌生成最快。增加CPU核心有助于提高提示处理速度,但奇怪的是,甚至降低了响应生成速度。M2 Max CPU与M2的性能提升是1.5倍(6核CPU对比4核),而不是内存带宽所暗示的4倍。如果你只进行CPU推断,请仔细测试在你的使用场景中如何设置-t参数。
虽然这只是我第一篇文章的另一个视角,但我希望它能为你提供一些额外的见解。我目前正在研究两个更多的主题:1)如何为AI/开发工作保护Apple Silicon机器;2)与Apple Silicon相比,使用llama.cpp对PC+4090进行一些基准测试。欢迎提供反馈!
Source: https://medium.com/@andreask_75652/llama-cpp-performance-apple-silicon-051241dd6eae