本地AI硬件:内存、带宽与功耗如何配置
2024年12月17日,NVIDIA将其Jetson Orin Nano开发板的价格从499美元降至249美元,并为已售出的设备发布了软件更新。没有任何元件改变,但内存带宽从65 GB/s提高到了102 GB/s。据厂商的测量,80亿参数的Llama 3.1模型在其上的生成速度从每秒14个token提高到了19个。这一事件概括了决定本地AI硬件的规则:内存的大小和速度,先于计算能力。
语言模型是一个每写一个词就要重读一遍的文件
语言模型,即驱动ChatGPT或Mistral的Le Chat的那类软件,表现为一个包含数十亿个数字的文件。这些数字称为参数或权重:它们是训练期间调整出的数值,决定了模型如何把词串联起来。一个所谓“8B”的模型含有80亿个。
每个数字占用的空间取决于其精度。在16位下,也就是大多数模型发布时采用的格式,一个参数占两个字节。因此80亿个参数是160亿字节,约15 GiB(GiB是各类工具显示的二进制单位)。llama.cpp是一个广泛用于在普通机器上运行模型的开源运行引擎,其文档给出Llama 3.1 8B在该格式下为14.96 GiB。
要生成一个token,也就是一个词的片段,模型要读取几乎全部这些参数。然后为下一个token再重复一遍。因此,在回答显示的过程中,一个15 GiB的文件每秒被重读几十次。由此产生两个条件。文件必须整个放进一块高速内存中,否则机器要到磁盘上去取其余部分,速度就会崩溃。而且这块内存的带宽决定了回答的节奏。
容量:模型必须装得进的内存
一台常规PC有两种内存。内存(RAM)供中央处理器使用。显存(VRAM)焊接在显卡上,供图形处理器(GPU)使用。后者快得多,但更小也更贵。GeForce RTX 5090是NVIDIA最高端的消费级显卡,自2025年1月30日起发售,起价1 999美元,搭载32 GB的GDDR7显存。这是一个上限:更大的模型无法放进一块显卡。
另一些机器使用统一内存,即处理器和GPU共享同一块存储。苹果芯片就是如此。据苹果的技术规格,Mac Studio搭载M5 Max芯片最高可配置128 GB,搭载M5 Ultra最高可配置512 GB。NVIDIA的DGX Spark也是同样的原理,这是一台边长15厘米、重1.2公斤的设备,集成128 GB的LPDDR5X内存。NVIDIA称它可以运行参数多达2 000亿的模型。
一旦瞄准中等规模的模型,这个差距就变得决定性。一个700亿参数的模型,压缩到每个参数约4.9位,按700亿 × 4.9 ÷ 8计算,约重43 GB。它放不进RTX 5090的32 GB。但它能放进128 GB的统一内存,并为其余部分留出空间。
带宽:决定书写速度的因素
内存带宽是芯片读取其内存的速率,以每秒吉字节计。NVIDIA在其推理优化指南中(推理指运行已训练好的模型)解释说,文本生成受内存限制:大部分时间花在把权重和中间数据传送到计算单元上,而不是花在计算上。
由此可得一个简单的估算:每秒最大token数大致等于带宽除以模型的大小。Jetson Orin Nano Super可以用来验证这一点。4位的Llama 3.1 8B约重4.6 GB,而这块板卡的读取速率是102 GB/s,理论上限为每秒22个token。NVIDIA测得19.1个,为上限的87%。更新之前,在65 GB/s下,实测为14个。速度并没有完全跟随带宽(带宽多出57%,速度提高37%),但这条规则给出了正确的数量级。
厂商的规格表给出以下带宽。Jetson Orin Nano Super为102 GB/s,Jetson AGX Orin的32 GB和64 GB版本为204.8 GB/s。Jetson AGX Thor和DGX Spark均为273 GB/s。Mac Studio搭载M5 Max时,视配置为460或614 GB/s,搭载M5 Ultra为1.2 TB/s。RTX 5090高达1 792 GB/s,但只有32 GB。
这些数字解释了一个常见的失望。一台标称计算能力很强但内存很慢的机器,写起来很慢。反过来,一台计算能力一般而内存很快的机器,在对话中显得反应灵敏。
量化:每个参数用更少的位
如果模型的大小限制了速度,就可以把它缩小。量化是用更少的位来存储每个参数,用8位或4位而不是16位。原理有点像把照片压缩成JPEG:以精度的损失换取更小的文件。
llama.cpp的文档公布了Llama 3.1 8B的测量结果。在16位下,文件为14.96 GiB,生成速度为每秒29个token。在平均每个参数用8.5位的Q8_0格式下,文件为7.95 GiB,速度为每秒51个token。在平均4.9位的Q4_K_M格式下,文件降到4.58 GiB,速度升至每秒72个token。文件缩小为原来的三分之一左右(3.3倍),书写速度提高到2.5倍。而读取问题的速度略有下降,从每秒923降到822个token,因为这一阶段取决于计算,而解压缩增加了计算量。
质量损失是存在的。模型越小、压缩越强,损失越明显。接近4位的格式,如Q4_K_M,已成为本地部署中最常见的折中方案。降到2位或3位,可以在同一台机器上放进更大的模型,但错误更多,采用之前必须在自己的任务上进行测量。
读取问题与写出回答:两种不同的速度
模型处理的不是词,而是token,即几个字符的文本片段。在法语中,一个常见的词对应一到两个token。工作分两个阶段。预填充读取整个请求,包括问题和附带文档,并行处理各个token:它主要取决于计算能力。随后,生成逐个token地写出回答:它取决于带宽。
llama.cpp的贡献者发布的苹果芯片测量结果显示了这一差异。在16位的Llama 2 7B上,40个图形核心的M4 Max每秒读取923个token,写出32个。同配置的M5 Max读取3 158个,写出37个。读取提高了3.4倍,书写提高了17%。两款芯片之间,带宽从546升到614 GB/s,多了12%。书写跟随内存,读取跟随计算。
实际使用中,两个数字都重要。对于简短的问题,只有生成速度会被察觉,超过每秒十五个token左右,文本显示得比人阅读的速度还快。要总结一份50页的报告,估计约30 000个token,让人等待的是预填充:每秒900个token时,第一个词出现之前要等半分钟多一点,每秒3 000个token时则约十秒。
上下文同样占用内存
上下文是模型在某一时刻所考虑的文本量:问题、提供的文档、交流的历史。为了不在每个token上都重新计算一切,模型为每个已读的token保留中间结果。这就是键值缓存,即KV cache。
Hugging Face给出了公式和一个例子。对于16位的Llama 2 7B,每个token约占用0.5 MB的缓存,因此10 000个token接近5 GB,是模型大小的三分之一。NVIDIA的指南得出了同一数量级,4 096个token约2 GB。较新的模型通过在注意力头之间共享一部分数据来降低这项成本,这种技术称为分组查询注意力。按Llama 3.1 8B公布的参数(32层,8个维度为128的键值头),同一公式得出每个token约0.13 MB,即10 000个token为1.3 GB。最后这个数字是我们自己的计算。
这个缓存要乘以同时打开的对话数量。十个人各自处理一份10 000个token的文档,使用Llama 3.1 8B时,在模型的4.6 GB之外,还要占用约13 GB的缓存。一台8 GB的机器,能为一个人提供这个模型,却无法为一个团队提供。如Hugging Face所述,新近的运行引擎能够压缩这个缓存,但起步时的容量规划仍是这样。
CPU、GPU与NPU
CPU即中央处理器,是通用型的。它每次只执行少量运算,运行小模型很慢。GPU为图形渲染而设计,并行执行成千上万次相同的运算,这与神经网络的计算相吻合。如今绝大多数语言模型由它来执行。
NPU即神经网络处理单元,是专门处理神经网络运算的电路,设计上功耗很低。微软要求超过40 TOPS,即每秒40万亿次运算,计算机才能使用Copilot+ PC的名称。其文档指出,许多NPU只处理低精度整数,如INT8,模型必须经过转换才能在上面运行。NPU适合轻量而持续的任务,如实时翻译或视频会议中的背景虚化。对于语言模型,它仍受制于芯片其余部分的带宽。
因此,TOPS这个数字要谨慎解读。NVIDIA为Jetson Orin Nano Super标称67 TOPS,并注明这是“稀疏”TOPS,这种计算模式假定一部分运算可以跳过。在稠密模式下,这个数字降到33。两者都没有说明这块板卡写出一个回答的速度。
三种模型规模,多种机器
下面的估算应用了带宽除以模型大小的规则。这些是我们根据厂商规格表计算的理论上限。实际速度会低于此值:在Jetson上,它达到了上限的87%。
一个80亿参数、4位的模型,约4.6 GB,在所有提到的机器上都能放得下。Jetson Orin Nano Super有8 GB内存,功耗为7至25瓦,实测运行速度为每秒19个token,为上下文留出的余量很小。RTX 5090的上限接近每秒390个token。对一个人来说,嵌入式板卡就够了。对于多个用户同时使用,先不够的是内存,而不是速度。
一个200亿至350亿参数的模型,4位下重12至21 GB。它能放进RTX 5090,也能放进64 GB的Jetson AGX Orin。在后者上,带宽204.8 GB/s,一个20 GB的模型上限约为每秒10个token;在RTX 5090上,约为每秒90个。
一个700亿参数、4位的模型,约43 GB,放不进RTX 5090。在273 GB/s的DGX Spark上,其上限约为每秒6个token。在614 GB/s的Mac Studio M5 Max上,约为14个。在1.2 TB/s的M5 Ultra上,约为28个。容量决定能否加载模型,带宽决定用起来是否顺手。
功耗、发热与噪音
一台机器消耗的全部电能最终都变成热。RTX 5090的总图形功率为575瓦,NVIDIA要求搭载它的PC配备至少1 000瓦的电源。这与一台小型电暖器的数量级相当,其热量由风扇排出。在另一端,Jetson Orin Nano Super的工作功率为7至25瓦,Jetson AGX Orin为15至60瓦。DGX Spark的电源为240瓦,芯片为140瓦,NVIDIA标称运行噪音为35 dB(A)。苹果给出Mac Studio的最大持续功率为480瓦。
一年下来,差距可以计算出来。一台持续消耗60瓦的机器,每年约用电525 kWh(60瓦 × 8 760小时)。600瓦时,约为5 260 kWh。这些计算假定负载恒定,这高估了经常处于空闲状态的机器的实际耗电量,但它们给出了区分这两类机器的十倍因数。
噪音和发热决定了机器安装的位置。配备高端游戏显卡的PC,是为在通风房间里进行几个小时的使用而设计的。放进柜子里,它会降频自保,然后停机。Jetson模块是为机器人和工业设备设计的,功率范围由厂商确定,可长时间运行。这项标准在规格表上分量很轻,在运行两年之后却举足轻重。
用四个计算为机器定规格
方法分四步。先计算选定的一个或多个模型的大小:参数数量乘以每个参数的位数,再除以8。加上上下文缓存,乘以预期同时进行的对话数。把总量与可用内存比较,并为系统留出余量。最后用带宽除以模型大小,得出速度上限,再对照安装场所核对功耗和噪音。
以一个十人团队为例,他们想要一个300亿参数、4位的模型,用来处理10 000个token的文档。模型约重18 GB。缓存视架构而定,每个用户在2至5 GB之间,整个团队为20至50 GB。因此需要一台64至128 GB的机器,并且初步估算,至少需要300 GB/s的带宽,才能超过每秒15个token。这些数字都是估算;只有在目标机器上试验才能确认。
这就是HOMN为其设备定规格所采用的框架:从模型和用户数量出发,再推出内存、带宽和散热范围。一份遗漏内存容量或带宽的规格表,无法完成这个计算,无论标出多少TOPS。
在本地运行LLM需要多少内存?
模型的字节大小大致等于参数数量乘以每个参数的位数,再除以8。一个80亿参数的模型,16位下约重16 GB,4位下为4.6 GB。还要加上上下文缓存,它随文档长度和同时使用的用户数而增长。
对LLM来说,为什么内存带宽比计算能力更重要?
每写出一个token,模型都要重读内存中几乎全部参数。因此生成速度的上限是带宽除以模型大小。计算能力主要在读取长文档,即预填充时才重要。
什么是AI模型的量化?
就是用更少的位来存储参数,例如用4位而不是16位。据llama.cpp的文档,Llama 3.1 8B因此在测试机器上从14.96 GiB降到4.58 GiB,速度从每秒29个token升到72个。质量略有下降,小模型下降得更多。
带NPU的PC够用于企业本地AI吗?
NPU适合轻量任务,如转录,或供一个人使用的小模型。它与芯片的其余部分共享内存和带宽,这限制了语言模型的大小和速度。要为团队提供服务,内存容量和带宽比标称的TOPS更重要。