设备端 AI · 8 分钟阅读
语言模型如何装进手机
本地 AI 应用要占的存储空间多得出人意料,原因并不是臃肿。
弄清楚这些 GB 都去了哪里,也就明白了同一个模型为什么在新手机上很快、
在旧手机上很慢——以及文件名
Q3_K_S 究竟在告诉你什么。
模型就是一大堆数字
语言模型是一组学出来的参数,也就是权重。每个权重都是一个数字, 而它们有几十亿个。模型名字里的“2B”大致就是二十亿个参数。
以完整精度存储时,每个权重占 4 个字节。二十亿个权重、每个 4 字节, 大约就是 8 GB,而这还只是比较 小 的那一类模型。问题一句话就说完了: 文件之所以大,是因为数字太多,而且每一个都存得很精确。
量化:每个数字用更少的位
量化就是用更少的位来存每个权重。每个权重不用 32 位,改用 8 位、4 位或 3 位, 再给每一组权重配上缩放系数,让近似值尽量贴近原值。
体积的缩减大致是线性的:
- 32 位 ——2B 模型约 8 GB。完整精度,对手机极不友好。
- 8 位 ——约 2 GB。质量非常接近原始模型。
- 4 位 ——约 1.1 GB。通常的最佳平衡点。
- 3 位 ——约 800 MB。损失明显,但仍然可用。
- 2 位 ——还要更小,而质量下降得很厉害。
这是有损压缩,和 JPEG 一样。压得足够狠,你就会看到瑕疵; 在语言模型里,它表现为回答变含糊、开始重复,或者渐渐偏离问题。
量化并不是让模型均匀地变笨。它让模型变得不那么精确, 而不精确总是先出现在最难的输入上。
读懂文件名
像 Q4_K_M 或 Q3_K_S 这样的名字是一份配方,
而不是版本号:
- Q4 / Q3 ——大致表示每个权重用多少位。
- _K ——一种“k-quant”方案,它把位预算花得并不均匀,在模型最敏感的地方保留更多精度。
- _S, _M, _L ——同一方案下的小、中、大三档。越大保留的质量越多,占的字节也越多。
所以 Q3_K_S 就是小档的 3 位 k-quant:压缩得很激进,
当装得进设备比最后那几个百分点的质量更重要时,就选它。
GGUF:容器
GGUF 是一种文件格式,装着量化后的权重, 以及运行时需要的元数据——分词器、架构、提示模板。 一个文件就够,不需要再跟着一整个配置目录。
它对手机很重要,因为 GGUF 从设计上就是要被 内存映射的。运行时不会把 1.7 GB 一次性读进 RAM,而是把文件映射进自己的地址空间, 由操作系统按需把真正用到的部分调入。这就是为什么比手机空闲 RAM 更大的模型 仍然跑得动,也是为什么打开应用后的第一个回答比后面的慢——那些页还在读入。
为什么它会让手机发热
生成一个词,也就是一个 token,意味着让输入穿过那几十亿个参数。 然后为下一个 token 再来一遍。一百个词的回答,就是一百次这样的计算。
这是 CPU 或神经网络加速器上的持续运算,而这正是手机在散热上最吃力的负载。 设备一热就会降频,所以一段不间断的长生成会越跑越慢。 做得好的本地应用会控制节奏,把任务拉开间隔,让芯片有时间冷下来, 而不是把所有活儿一件接一件地排满。
为什么旧手机吃力
三个限制,每一个都很硬:
- 内存带宽。 每生成一个 token,都要把很大一部分权重读一遍。生成速度往往受限于内存读取的快慢,而不是算力本身。
- RAM。 内存映射有帮助,但本来就吃紧的设备会不停地换页,系统甚至可能直接把应用杀掉。
- 加速器。 较新的芯片有适合这类运算的硬件。较旧的只能退回通用核心,速度慢上好几倍。
这就是为什么本地 AI 应用会写明最低设备要求,而不是试图支持所有机型。 低于某条线,体验不是变差,而是根本没法用。
你做的这笔交换
手机大小的量化模型,在困难的推理上比不过庞大的云端模型。 但对范围明确的任务,比如这个词在这句话里是什么意思、把这个短语翻译一下, 它完全够用,而且带着云端模型给不了的三个特性:没有网络也能用、 每次使用都不花钱、文字从不离开设备。
这就是设备端 AI 的全部交易。你放弃了可能达到的最大模型, 换来隐私、离线可用,以及不按次计费。
ClickBook 是怎么做的
ClickBook 内置一个量化后的 GGUF 模型,通过 llama.cpp 在你的设备上运行。 在 iOS 上它随应用一起打包,所以没有任何东西需要下载。 进一步了解本地 AI 阅读器, 也可以 看看 ClickBook 是怎么工作的.