设备端 AI · 8 分钟阅读

语言模型如何装进手机

本地 AI 应用要占的存储空间多得出人意料,原因并不是臃肿。 弄清楚这些 GB 都去了哪里,也就明白了同一个模型为什么在新手机上很快、 在旧手机上很慢——以及文件名 Q3_K_S 究竟在告诉你什么。

模型就是一大堆数字

语言模型是一组学出来的参数,也就是权重。每个权重都是一个数字, 而它们有几十亿个。模型名字里的“2B”大致就是二十亿个参数。

以完整精度存储时,每个权重占 4 个字节。二十亿个权重、每个 4 字节, 大约就是 8 GB,而这还只是比较 的那一类模型。问题一句话就说完了: 文件之所以大,是因为数字太多,而且每一个都存得很精确。

量化:每个数字用更少的位

量化就是用更少的位来存每个权重。每个权重不用 32 位,改用 8 位、4 位或 3 位, 再给每一组权重配上缩放系数,让近似值尽量贴近原值。

体积的缩减大致是线性的:

这是有损压缩,和 JPEG 一样。压得足够狠,你就会看到瑕疵; 在语言模型里,它表现为回答变含糊、开始重复,或者渐渐偏离问题。

量化并不是让模型均匀地变笨。它让模型变得不那么精确, 而不精确总是先出现在最难的输入上。

读懂文件名

Q4_K_MQ3_K_S 这样的名字是一份配方, 而不是版本号:

所以 Q3_K_S 就是小档的 3 位 k-quant:压缩得很激进, 当装得进设备比最后那几个百分点的质量更重要时,就选它。

GGUF:容器

GGUF 是一种文件格式,装着量化后的权重, 以及运行时需要的元数据——分词器、架构、提示模板。 一个文件就够,不需要再跟着一整个配置目录。

它对手机很重要,因为 GGUF 从设计上就是要被 内存映射的。运行时不会把 1.7 GB 一次性读进 RAM,而是把文件映射进自己的地址空间, 由操作系统按需把真正用到的部分调入。这就是为什么比手机空闲 RAM 更大的模型 仍然跑得动,也是为什么打开应用后的第一个回答比后面的慢——那些页还在读入。

为什么它会让手机发热

生成一个词,也就是一个 token,意味着让输入穿过那几十亿个参数。 然后为下一个 token 再来一遍。一百个词的回答,就是一百次这样的计算。

这是 CPU 或神经网络加速器上的持续运算,而这正是手机在散热上最吃力的负载。 设备一热就会降频,所以一段不间断的长生成会越跑越慢。 做得好的本地应用会控制节奏,把任务拉开间隔,让芯片有时间冷下来, 而不是把所有活儿一件接一件地排满。

为什么旧手机吃力

三个限制,每一个都很硬:

这就是为什么本地 AI 应用会写明最低设备要求,而不是试图支持所有机型。 低于某条线,体验不是变差,而是根本没法用。

你做的这笔交换

手机大小的量化模型,在困难的推理上比不过庞大的云端模型。 但对范围明确的任务,比如这个词在这句话里是什么意思、把这个短语翻译一下, 它完全够用,而且带着云端模型给不了的三个特性:没有网络也能用、 每次使用都不花钱、文字从不离开设备。

这就是设备端 AI 的全部交易。你放弃了可能达到的最大模型, 换来隐私、离线可用,以及不按次计费。

ClickBook 是怎么做的

ClickBook 内置一个量化后的 GGUF 模型,通过 llama.cpp 在你的设备上运行。 在 iOS 上它随应用一起打包,所以没有任何东西需要下载。 进一步了解本地 AI 阅读器, 也可以 看看 ClickBook 是怎么工作的.