Apple统一内存适合运行LLM?理想很丰满,现实很骨感

自从大语言模型开始流行以来,一直在AI领域深耕细作的NVIDIA直接获得了大量订单,导致产品供不应求,人们也一直在寻找更便宜的方案。这给了我们评估许多其它方案的机会,例如我前些时尝试搭建的W7900方案就是一个可行的替代。

碰巧的是,Apple刚好在LLM大火的时间点前后接连发布M1 / M2 Ultra,最大带来了128 / 192 GB且带宽高达800 GB/s的内存。考虑到本地运行LLM最大的瓶颈是显存容量和显存带宽,两者似乎是一拍即合,在数码媒体的渲染下创造了多个类似“Mac Studio > 6 * RTX 4090”的名场面。

事实真的是如此吗?经过实际测试,我发现尽管Apple Silicon可以将超大显存装进常规轻薄笔记本电脑,但在运行LLM方面存在各种妥协,使得苹果平台并没有比NVIDIA方案的性价比更高。

devil’s in the details

本文我们使用一组实测数据来介绍目前的现状。

测试硬件如下:

  • Apple Mac Mini (M4 Pro)
    • 14 CPU核心
    • 20 GPU核心
    • 16 ANE核心
    • LPDDR5x-8533 256bit 64 GB内存
    • 1 TB闪存
  • NVIDIA RTX A6000
  • NVIDIA RTX 6000 Ada
  • AMD Radeon Pro W7900 Dual Slot

注意:由于M4 Pro与其它这些专业独显并不处于同一性能区间(专业独显的显存带宽大约是它的3倍),因此真正进行对比时更多是用它来推测拟合M4 Max乃至Ultra的性能特性,评价Apple GPU这一体系在PC独显面前的整体竞争力,而非仅仅局限于M4 Pro这一个芯片的表现。

为了方便跨硬件平台获得更多数据进行对比,本文依然使用llama.cpp进行测试,基于相同commit/版本进行。AMD平台会打补丁为flash attention启用WMMA(采用与NVIDIA GPU的nvcuda::wmma相同的代码路径)以充分利用RDNA3的矩阵单元。

Apple MLX、NVIDIA TensorRT-LLM、AMD主推的vLLM等均可在相似的条件下获得显著更好的性能,但由于测试环境、运行参数、生成内容的差异较大,公平的测试与对比会变得比较麻烦。除了因为跨平台对比数据方便之外,llama.cpp本身也是众多流行的客户端LLM工具普遍选择的后端,因此具备一定的实际意义。

模型方面,则是选取iq4_xs量化的llama 3.1 70B。相比于q4_0,iq4_xs体积更小,生成质量更好,代价是对GPU计算的负载更高。根据llama.cpp的项目说明内容,iq4_xs在Apple GPU上有较为严重的性能问题,但经过我的实测,在M3、M4等新GPU架构的平台上,其推理性能相比于q4_0只有非常轻微的损失(5%),因此本次主要使用它来进行对比。

文本生成的性能是目前主要的关注点,我们使用llama-bench测试生成不同长度的文本。

测试命令 llama-bench -m ~/models/llama3.1-70b-iq4.gguf -ngl 999 -fa 1 -n 128,256,512,1024 -p 0

在这里,虽然M4 Pro的性能不及旗舰级专业卡这样的重量级选手,但其完全可以充分发挥273 GB/s的带宽,获得不逊于竞品的推理效率。此外,上述4个同为≥ 48 GB显存容量的方案里,从正规渠道购买M4 Pro的价格不到2万人民币,W7900DS大约2.5-3万,RTX A6000的价格3万多,RTX 6000 Ada更是高达5万。作为能运行70B LLM的方案,Mac的门槛可以算是非常低了。

可以预期的是M4 Max乃至Ultra会有更加优秀的性能表现(2-4倍范围内),甚至有机会超越相当一部分顶级的独立显卡。参考M2时期Mac Studio的定价,M4 Max/Ultra搭配64 GB内存的价格预期分别为略高于两万和略高于三万元人民币,作为理论性能达到2-4倍的方案,相比同为64 GB内存的Mac Mini来说甚至还会更具有性价比。

这也是数码媒体最近这段时间针对M4的评测展示的主要数据。但是数码媒体很少有真正展示全部数据和背后诸多细节的。大多数都是展示好看的数据,或者观众们想看到的数据。接下来,我们进入本文的正题:讨论Apple GPU当前运行LLM的几个主要问题。

GPU Matrix吞吐

显存的容量和带宽是LLM的主要关注点,但LLM并非任何情况下都是显存为王,Matrix吞吐也并非完全没有价值。这主要体现在prompt processing (prefill)性能、高并发性能以及推测解码三个方面。

Prompt processing 性能

Prompt processing (prefill)是处理用户输入的阶段,也就是用户输入的内容越长,这一阶段所需要的时间越久。如果你使用LLM主要是用于长文总结内容翻译等输入内容较长的应用场景,那么prefill性能才是最需要关注的。此外,在较长的对话中,如果没有开启prompt caching,则每次都需要将此前完整的对话上下文作为prompt输入处理(好在llama.cpp的server只需要简单patch就可以默认启用caching)。

此前在W7900的文章中我提到过AMD GPU在这方面性能不佳的问题,那么Apple GPU在这个场景下的表现如何呢?

测试命令 llama-bench -m ~/models/llama3.1-70b-iq4.gguf -ngl 999 -fa 1 -n 0 -p 64,128,256,512

经过测试我们可以发现,Apple Silicon在这方面的性能非常惨淡,即便我们按照4倍规模带来4倍性能的理想预期计算M4 Ultra的性能(~160 token/s),它也只能达到W7900的一半,RTX A6000的三分之一,RTX 6000 Ada的五分之一。

这个性能数字并不难理解,长期以来Apple在AI方面的策略更多偏向NPU而非GPU,其GPU并没有NVIDIA那样成熟的Matrix/Tensor单元来大幅度提升矩阵计算性能,因此核心数相同的情况下矩阵运算吞吐存在数倍的纸面参数差距。另一方面,Apple Silicon在这项测试里的能效表现也相对平庸,仅仅GPU核心就需要消耗30W左右的功耗,而竞品普遍是10倍甚至20倍以上性能却仅仅只有300W的整卡功耗

高并发性能

前面的两项测试更多的是针对单人使用的场景,但LLM在实际使用中并非只有这么简单,事实上可以非常高效率的批量处理,或将一个API endpoint共享给局域网里的其他人使用。

Prefill的总性能通常不会随着batch size上升而提升,因此我们的测试以decode/text generation性能为主。

测试命令 llama-batched-bench -ngl 999 -m ~/models/llama3.1-70b-iq4.gguf -fa -npl 1,2,4,6,8,10,12 -npp 512 -ntg 128 -c 16384

可以看出,NVIDIA GPU在并发超过10之后依然有非常显著的性能提升,且单个用户的性能未发生明显下降;AMD则可以将总性能上升的趋势维持到4并发左右,不过在此范围内的单用户性能也会出现显著下降;Apple GPU在并发数为2-4的情况下不仅得不到任何明显的性能提升,反而连总性能都会下降。哪怕将并发数量提高到12,相比竞品也是毫无优势可言。

产生这样一个结果的原因也是显而易见的,在decode阶段,单个请求的性能与带宽相关,但高并发的性能瓶颈则重新回到了Matrix吞吐。事实上,如果我们比较各个GPU在最高并发下的性能差异,则可发现它们的比例非常接近GPU的matrix理论吞吐比例。

推测解码 (speculative decoding)

如果你说前面的prompt processing性能影响场景比较少,而高并发性能对本地单用户场景来说可能感知不强,那么我们把单用户、text generation性能放在第一位,推测解码是对这个场景而言提升最大的技术。它本质上是在用算力换带宽,使用一个较小的draft model推理预测一个较大的target model的输出。

llama.cpp去年新增了这一功能,虽然目前尚未被整合到benchmark等程序里,但提供了一个较为方便的命令行工具作为sample。我们使用以下命令运行llama 3.1 70B q4_0量化模型,使用llama 3.1 8B q4_0模型作为它的draft model,并挑选推测准确率相近的两组数据进行比较:

llama-speculative -m ~/models/llama3.1-70b-q4_0.gguf -md ~/models/llama3.1-8b-q4_0.gguf -p "Tell me some details of the United States history, starting from its independence." -e -ngl 999 -ngld 999 -t 16 -n 512 --draft 8 --sampling-seq k,m,t -fa -ctk q8_0 -ctv q8_0

Apple M4 Pro

encoded   16 tokens in    1.042 seconds, speed:   15.360 t/s
decoded  520 tokens in   73.608 seconds, speed:    7.064 t/s

accept: 77.604%

Radeon Pro W7900 Dual Slot

encoded   16 tokens in    0.166 seconds, speed:   96.202 t/s
decoded  517 tokens in   19.943 seconds, speed:   25.924 t/s

accept: 78.345%

作为对比,使用 llama-cli 与相同70B q4_0模型、参数进行测试,M4 Pro与W7900的decode性能分别为6.01 t/s与15.29 t/s,也就是二者通过推测解码分别获得17%和80%的提升。由于NVIDIA GPU的Matrix吞吐更强,其在相近的条件下理论上获得的提升更大(由于个人时间限制没有实际测试)。


除了性能之外,Apple平台还有一些其它的问题进一步削弱它的实际竞争力。

容量与带宽不匹配

如果说游戏显卡的显存容量与带宽不匹配是因为显存太小,那么Mac则是正好相反。它的内存容量过大,以至于如果是专门为了LLM而选购,每款SKU的最高配置并没有什么价值。

例如,本文测试的Mac Mini M4 Pro顶配可以选择64 GB内存,但是实际上运行37 GB的70B q4模型的性能就已经较为缓慢,5-6 token/s的性能使用体验不佳。因此,实际更适合选择的是每256bit位宽至多配置32 GB内存运行30B左右的模型。当然,如果是打算运行MoE模型,这个问题则会好不少,虽然目前好用且刚好适合这个容量的开源MoE模型并不多,对Apple Silicon平台的支持也不够成熟。

对于普通用户而言,同一台机器后台还要运行大量其它软件和游戏等,也可以认为没有太大顾虑。

扩展性缺失

很多人喜欢拿游戏显卡显存小、专业卡显存贵来论证Mac提供相对便宜的大容量显存是多么有利于LLM,但事实上这种说法忽略了LLM支持多卡推理且对互联要求不高的事实。

目前京东在售的RTX 3090涡轮卡的价格大约在6500元左右,两个3090涡轮卡再加上一个支持PCIe拆分的主板,全套配下来整机还没有一台64 GB内存+1TB硬盘的Mac Mini贵(考虑到Mac Mini需要一部分内存来跑系统等等),却有48 GB显存、每张卡3倍于M4 Pro的带宽和超过M4 Pro 10倍的算力可用。依照目前M2 Ultra + 128 GB内存的售价,未来M4 Ultra + 128 GB内存也大概率会超过4卡RTX 3090全平台的价格。

除此之外需要考虑的是,在PC平台搭建这样的LLM系统,可以先从单GPU开始评估较小的模型是否能满足自己的需求,如果不够则继续再加几张卡解决。根据此前在W7900文章里针对A/N卡的多卡测试,加卡还能带来一些性能提升。但购买Mac则是一锤子买卖,想要扩展内存只能将旧机器卖了重新再买一台,或者想办法折腾RPC后端这类并不是太可靠、性能也比较一般的多机分布式推理方案。


总结

综上所述,虽然Apple Silicon表面上从纯粹、原始的单用户LLM decode吞吐来看可以与独显方案一战,但深入体验后则会发现背后更多的是表现平平的数字,以及在多个方面相当大的取舍。不可否认的是,如果是将M4 Pro/Max作为笔记本处理器评价,则有着实至名归的“最强LLM笔记本”称号,这是Apple Silicon目前的独家特色,没有任何竞品。但在这之外,如果你希望在固定地点搭建LLM PC、服务器,并且对空间限制不敏感,其实很难再找到Apple Silicon的亮点。

当然,这并不是说Apple GPU未来的版本不能通过加入更高吞吐的matrix单元解决这些问题并成为非常优秀的LLM推理方案,但未来是未来,至少本代硬件目前的性能平庸之处难以被忽视。

展望未来,Apple有自己的MLX框架,有算力足够强的NPU和带宽足够高的CPU/GPU,未来如果结合NPU与GPU来做端侧异构推测解码,是否能完美翻身,走出一条自己的特色路线呢?在我看来硬件理论基础已经具备,但软件和模型支持显然还有待完善。

Apple统一内存适合运行LLM?理想很丰满,现实很骨感》有11个想法

    1. David Huang 文章作者

      游戏卡可以买便宜显卡上多卡推理,性能和价格都比专业卡要强不少。2*24G 384bit也算是一个平衡容量和性能的甜点了。

      回复
  1. Jack

    我用 M1 macbook air 运行 LLM 的体验,和博主的类似。

    我发现它的 prefill 性能非常糟糕,以至于如果我们真的跑当前很多开源模型所支持的 100k 上下文的推理,光 prefill 就得花十几甚至几十分钟,已经没有实用价值了。

    真的严肃的 LLM 内部或者对外的商业应用,还是得用 Nvidia 或者 AMD 的显卡。

    回复
    1. David Huang 文章作者

      可以跑,用MLX能做到q4量化速度勉强可用的程度。只不过专门买来跑LLM的性价比是不存在的,更适合已经对Mac有需求,有其他用途的情况下顺便跑一跑,尤其是笔记本。

      回复
  2. karl.zhu

    这个问题在我组多卡平台的时候也遇到了,闲鱼上p40 24g因为大显存价格比去年翻了一番,实际上溢价严重,llm考虑单位显存的算力。

    回复
    1. David Huang 文章作者

      llama-bench -m ~/models/qwen2.5-14b-iq4.gguf -ngl 999 -fa 1 -t 10 -mmp 0
      | model | test | t/s |
      | ------------------------------ | ----: | -------------: |
      | qwen2 ?B IQ4_XS - 4.25 bpw | pp512 | 232.53 ± 0.12 |
      | qwen2 ?B IQ4_XS - 4.25 bpw | tg128 | 25.04 ± 0.07 |

      build: af148c93 (4077)

      这个级别的模型非常可用

      回复
  3. winston

    感谢博主的测试研究,打消了我采购 Mac Mini M4 Pro 64G 高配的念头。前面下了预订,取消了。因为确实没什么用,光有内存(显存),算力严重不够。

    回复

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注