Llama-Mobile:面向视觉语言模型的高效 2.7 比特量化 Llama-Mobile: Efficient 2.7-Bit Quantization of VLMs
自蒸馏QAT与S3D8格式将11B VLM压至3.7GB,Arm CPU手机端高效推理
前置知识
模型量化与 bits per parameter(bpp)
把神经网络权重从 16-bit 浮点(如 bfloat16)映射到更少比特表示的技术,通常配合缩放因子(逐通道或逐块的 scale)把浮点范围映射到整数网格或码本。bpp(bits per parameter)衡量平均存储密度:Llama 3.2 11B Vision 以 bfloat16 存储占 21.3 GB(16 bpp),压到 2.68 bpp 后仅约 3.7 GB。
全文围绕 bpp 与数值格式展开,理解「压缩率-精度-速度」三角权衡是读懂一切实验图表的前提。
量化感知训练(QAT)与直通估计器(STE)
QAT 在训练的前向传播中模拟量化效应(前向使用 $\hat{\theta}_S = Q(\theta_S)$),反向传播时由于量化算子不可导,用直通估计器把梯度近似原样穿过 $Q$,使权重在目标低位宽下被协同优化。与之相对的 PTQ(后训练量化)只在训练完成后做校准,资源省但低位宽下精度差。本文学习率还按位数缩放:$\eta = 2^{-(b+14)}$。
QAT 是本文的核心训练程序,论文用「direct casting vs GPTQ vs QAT」三条曲线论证了低位宽下 QAT 不可替代。
知识蒸馏与 KL 散度
让 student(量化模型)复刻 teacher(原 bfloat16 模型)行为的训练方式:对同一输入,两者各自给出词表上的下一个 token 分布 $p_T^{(t)}$、$p_S^{(t)}$,用 $D_{KL}(p_T^{(t)} \| p_S^{(t)})$ 度量差异并在生成的回答 token 上逐步求和取平均。相比仅用硬标签,蒸馏传递了 teacher 的完整输出分布信息。
本文「无原始训练数据也能做 QAT」的关键机制:蒸馏目标不是人工标注,而是 teacher 自己生成的回答序列。
向量量化与 Lloyd-Max 质心
向量量化(VQ)把一组值(这里是 3 个权重组成的向量)整体映射到码本中欧氏距离最近的质心,比逐值的标量量化有更好的率失真权衡。Lloyd-Max 算法是迭代拟合最优质心的经典方法(k-means 的连续版本),本文用 k-means++ 初始化,对通道缩放后权重的绝对值拟出 32 个质心。
S3D8 格式的核心就是这 32 个绝对值质心加符号位,理解 VQ 才能明白它为何在 2.68 bpp 上比标量格式好这么多。
GPTQ
一种逐列处理权重矩阵的后训练量化算法:量化一列后,用逆 Hessian 矩阵把该列产生的量化误差按最小二乘意义传播补偿到尚未量化的列上。只需几百条校准样本、无需重新训练,是 PTQ 的代表性强基线。本文作者自研了覆盖 VLM 全部线性层(含视觉编码器与交叉注意力)的 GPTQ 实现,而开源库通常只量化文本解码器。
GPTQ 是论文的主要对照:用它对比 direct casting 和 QAT,把「格式带来的收益」与「训练程序带来的收益」解耦。
Arm SIMD 与 TBL 查找表指令
Arm CPU 的 NEON 向量指令可对 16 字节寄存器并行运算。TBL 指令支持以 6-bit 索引从最多 64 字节的表中并行查值;dotprod/i8mm 扩展提供 INT8 点积加速。S3D8 的解码正是:用 5 条逻辑指令(AND/SHR/EOR)从每个字节构造 3 个查找索引,TBL 直接查出带符号的 INT8 权重,再走整型点积。
S3D8 的位排布与质心数量完全是围绕这些硬件指令反推设计的,不了解 TBL 就无法理解「格式即硬件协同设计」这一贡献。
研究动机
多模态大模型(VLM)如 Llama 3.2 11B Vision Instruct、Gemma 3、Qwen3-VL 能力强但体积庞大:Llama 3.2 11B Vision 以 bfloat16 存储需要 21.3 GB,远超手机等移动设备的内存上限(Pixel 8a 仅 8 GB LPDDR5X),无法直接端侧部署。量化是标准解法,但论文实验显示现实很残酷:直接舍入(direct casting)到每参数 3.5 bit 以下模型质量会严重崩塌;强 PTQ 基线 GPTQ 虽能改善,但在 sub-3-bit 区间仍然不行——2.7 bpp 下 INT 格式加 GPTQ 的平均任务分仅 0.018(原模型 0.744)。理论上最有效的量化感知训练(QAT)又高度依赖训练数据分布,而对 Llama 这类闭源训练的指令微调模型,原始预训练数据和训练配方根本拿不到。多模态场景还多一层困难:常见的图文 caption 对只能提供「描述图像」的短监督,无法覆盖指令跟随、问答和长文生成行为;直接在下游基准上微调又有过拟合和评测泄漏的风险。
本文的目标是本文要在两个现实约束下同时达成极限压缩与可用性:第一,不访问模型原始训练数据和训练配置,只利用公开权重本身(这是部署方拿到开源模型时的真实处境);第二,压缩后的格式必须能在 Arm CPU(手机与服务器)上高效执行,而不是「存得小、跑不动」。具体量化目标:把 Llama 3.2 11B Vision Instruct 压到每参数约 2.7 bit,权重总体积约 3.7 GB,激活用 8-bit,并在 VQAv2、ChartQA、DocVQA、AI2D 四个标准视觉问答任务上保持接近原模型的平均性能。同时交付一条完整流水线:合成数据生成、量化感知训练、S3D8 打包格式、以及 Linux/Android 上的 Arm CPU C++ 推理实现,全部开源。
与已有工作不同的是,独特切入角度有两点。其一是数据:与其借用外部指令数据集(风格与原模型不匹配、可能引入分布偏移),不如让模型「自己教自己」——用原模型在 ImageNet 这类与评测任务无关的通用图像上自问自答,把 teacher 的生成结果作为蒸馏目标,再通过系统性的 prompt 随机采样注入多样性,构造与原模型行为一致的合成多模态训练集。这把 LLM-QAT 一类的 data-free 蒸馏思路第一次系统地推广到多模态设定。其二是格式:以往工作把数值格式(INT、MXFP、NVFP4、DeepSeek 的 2D 块缩放)当作给定输入再写内核适配,本文反过来把格式当作硬件协同设计的对象——围绕 Arm SIMD 的 64 项 TBL 查找指令和 i8mm 点积指令,反推出 S3D8 这个「3 个权重塞进 1 字节」的符号因子化向量量化格式,让存储布局与 SIMD 解码路径一一对应。此外作者还自研覆盖 VLM 全部线性层的 GPTQ 实现,使格式对比在统一条件下进行。
核心方法
直觉上,这篇论文做的事可以概括为:让量化模型模仿原模型,教材由原模型自己编写,笔记本格式为 Arm CPU 量身定制。技术路线分三步。第一步,合成数据生成:从 ImageNet 训练集(1,281,167 张自然图像)采样图片,为每张图随机拼装一个通用视觉理解问题,以温度 0.6、top_p 0.9 让 bfloat16 原模型(teacher)生成至多 512 token 的回答,得到训练三元组 $(I, x, y)$——图像、prompt、teacher 回答。第二步,量化感知训练:量化模型(student)前向使用 $\hat{\theta}_S = Q(\theta_S)$,在回答 token 上最小化逐 token 蒸馏损失 $$\mathcal{L}_{KD}(I,x,y) = \frac{1}{|y|}\sum_{t=1}^{|y|} D_{KL}\left(p_T^{(t)} \| p_S^{(t)}\right),$$ 梯度经直通估计器穿过量化算子。第三步,移动部署:把训练好的权重按 S3D8 格式打包——每 3 个输出通道的权重共享一个 5-bit 质心索引,每个权重另有 1 个符号位,合计 8 bit 装 3 个权重;解码时用 Arm SIMD 的 TBL 指令查表直接还原为 INT8,再用 i8mm/dotprod 做整型点积。整条流水线不接触任何下游评测数据或基准专用 prompt。
核心创新一:自生成数据的多模态 QAT。与 LLM-QAT 等已有 data-free 蒸馏不同,多模态没有「大规模通用预训练语料」的对应物可借用,短 caption 又教不会长回答和指令跟随;本文方案是让 teacher 在随机 prompt 下自由生成回答作为蒸馏目标,多样性由三层机制保证:以概率 $p_{temp}=0.75$ 套用指令模板(其余保留非指令行为)、从 495 个问题组成的题目池采样(手写通用问题加 {action}×{target}×{audience}×{style} 组合生成)、按概率附加指令块($p_{inst}=0.7$,其中长度约束 $p_{len}=0.75$、格式指令 $p_{fmt}=0.45$ 等)。Figure 3b 证明这是生死攸关的设计:换成单一固定 prompt「Describe the image:」,即使有蒸馏,任务性能也大幅劣化。核心创新二:S3D8 格式。它不是对标量值做块缩放,而是每 3 个权重(跨 3 个输出通道)共享一个质心索引做向量量化;质心只学习幅值(32 个),符号单独存 3 bit,8 个象限的反射把码本免费扩展成 256 个等效码字。符号因子化让查找表缩到 32×3=96 字节、可驻留 SIMD 寄存器,配合特制位排布只需 5 条逻辑指令即可构造带符号查找索引,实现「存储格式 = 解码路径」的协同设计。这是与 INT、student-t、lloyd-max 等标量格式的本质区别。
方法步骤详情
第一步,合成数据生成。输入:ImageNet 训练集图像。操作:以概率 $p_{temp}=0.75$ 套用 Llama 指令模板(否则用纯文本模板 $\langle|image|\rangle\{prompt\}$ 以保留非指令行为);从题目池采样问题——手写通用问题(如「Describe the image.」「Summarize the scene.」)与按 {action}{target}{audience}{style} 组合生成的题目,共 495 个;再以概率 $p_{inst}=0.7$ 前置指令块,其中 adherence 探针、长度约束、格式指令分别以 $p_{adh}=0.4$、$p_{len}=0.75$、$p_{fmt}=0.45$ 独立采样,长度偏置为短:中:长 = 0.40:0.38:0.22。输出:以温度 0.6、top_p 0.9、至多 512 token 采样得到的 teacher 回答。第二步,QAT 蒸馏。前向中 student 权重取 $\hat{\theta}_S = Q(\theta_S)$,损失只计回答 token 的 KL 散度(用完整 logits 向量)。配置:batch 128、最大序列长 512、训练 2048 步、AdamW($\beta_1=0.9$、$\beta_2=0.95$)、cosine 学习率调度、$\eta = 2^{-(b+14)}$($b$ 为平均位宽)、master 权重 float32。第三步,S3D8 编码。先按输出通道做 absmax 缩放 $\alpha_i = \max_j |W_{ij}| / 127$;对缩放后权重取绝对值、零填充并切成 3 元向量;离线用 k-means++ 初始化的 Lloyd-Max 算法拟出 32 个质心 $C$;QAT 期间缩放、符号与量化索引 $q_{i'j} = \arg\min_l \|C_l - W'_{i'j}\|_2$ 可更新,质心冻结。存储开销约 $(8/3 + 16/k)$ bit/参数。第四步,Arm CPU 推理。字节位排布为 $[S_2 \oplus S_0,\ S_1,\ Q_{4..0},\ S_0]$,解码仅需 5 条逻辑指令生成 3 个 6-bit 索引,经 TBL 查 3 张 64 项带符号查找表还原 48 个 INT8 权重,再用 sdot 做整型点积、int32 累加后统一乘上输入与权重的通道缩放,写回 bfloat16。作者还实现了基于 safetensors 的自定义模型文件格式与 C++ 推理栈。
技术新颖性
技术新颖性体现在四个层面。(1)任务设定:现有 VLM 量化研究(Q-VLM、MBQ、VLMQ 等)集中于后训练量化,本文系统研究 sub-3-bit 的多模态 QAT,并把「无原始训练数据」作为硬约束,给出的 prompt 多样性采样配方是可迁移的方法论贡献。(2)数值格式:主流硬件友好格式(MXFP/NVFP4、DeepSeek 的 2D 块缩放)本质都是均匀标量加块缩放;S3D8 把向量量化带进 SIMD 友好的打包格式,用符号因子化(思路与 NSNQuant 的 KV cache 码本相关)规避了 256×3 大表无法驻留寄存器的问题;并主动选择 2.7 bit 这个「激进但可训练」的工作点,把找回精度的任务交给 QAT——格式与训练程序是配套设计。(3)量化流程:质心离线一次性拟合、训练中冻结,只更新缩放/索引/符号,保证训练稳定;同一质心方案也用于 GPTQ-S3D8 对照,隔离格式效应。(4)系统工程:自研覆盖视觉编码器、交叉注意力、多模态投影和语言模型输出投影的 GPTQ 实现(现有开源库通常只量化文本解码器),以及从位排布到指令调度的全栈实现——Listing 2 的反汇编显示热循环只用 8 条算术指令就解码 48 个权重并完成点积。
实验结果
下游精度(Table 1):以 Llama 3.2 11B Vision Instruct 为对象,bfloat16 原模型(21,340 MB)在四个 1024 样本子集任务上平均 0.744;S3D8-QAT 压到 3,569 MB(2.68 bpp)后平均 0.661,仅退化 0.083,全面碾压同尺寸基线:QAT-INT 0.347(ChartQA 仅 0.303、AI2D 仅 0.249,接近崩溃)、student-t 0.565、lloyd-max 0.436。分任务看 S3D8 的保留度:VQAv2 0.702/0.754、ChartQA 0.648/0.747、DocVQA 0.740/0.844、AI2D 0.554/0.631。程序对比(Figure 1):约 2.7 bpp 处 GPTQ 下 S3D8 平均 0.340 vs 同速率 INT 的 0.018;QAT 把 S3D8 进一步提到 0.661;同等任务性能下 S3D8 比块缩放 INT 多约 22% 压缩;direct casting 低于 3.5 bpp 即崩溃。消融:采样式 prompt 远胜固定 prompt(Figure 3b),即使蒸馏也无法弥补 prompt 多样性缺失;训练 KL 损失与最终任务性能的 Spearman 秩相关达 $\rho = -0.91$(Figure 6),说明合成数据上的训练目标可作为可靠的代理指标;把语言模型输出投影或视觉编码器留在 INT8 只换来 0.000–0.006 的平均分提升却多占 350–944 MB(Table 4),证明统一低位宽是正确选择;GPTQ 的 affine 缩放在低速率下优于 absmax(Figure 4)。运行性能(Table 2、5–7):Pixel 8a 5 核上文本生成形状 $(1, 4096, 14336)$ 的吞吐 S3D8 达 33.8 GMAC/s,高于 INT8 的 26.5 和 bfloat16 的 13.6;Graviton4 上同形状 S3D8 达 1031 GMAC/s,是 INT8 的 2.2 倍、bfloat16 的 4.4 倍;大 batch(prefill/vision)时 S3D8 略慢于 INT8(如 $(128,4096,14336)$ 为 6994 vs 7700 GMAC/s),符合「访存受限时加速、计算受限时持平」的预期。端到端:Pixel 8a 上生成速度中位数 3.8 token/s(对应 12.5 GB/s 权重读取带宽,约为实测峰值 25 GB/s 的一半),而 INT8 权重(约 11 GB)根本装不进手机内存;Graviton4 上 36.8 token/s,快于 INT8 的 26.4 token/s。反量化开销极低:Pixel 8a 上 S3D8→INT8 花费 133 μs(16.5 GB/s),而纯 INT8 内存拷贝基线需 310 μs(21.2 GB/s)。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| VQAv2(自然图像视觉问答) | 准确率(1024 样本验证子集) | 0.702(S3D8-QAT,3,569 MB) | bfloat16 原模型 0.754;同尺寸 QAT-INT 0.579 | 相对原模型仅退化 0.052(保留约 93% 性能),比同尺寸 QAT-INT 高 0.123 |
| ChartQA(图表问答) | 准确率 | 0.648(S3D8-QAT) | bfloat16 0.747;同尺寸 QAT-INT 0.303 | 比 QAT-INT 高 0.345(INT 在此任务几乎失效),相对原模型退化 0.099 |
| DocVQA(文档问答) | ANLS(阈值 0.5) | 0.740(S3D8-QAT) | bfloat16 0.844;同尺寸 QAT-INT 0.258 | 比 QAT-INT 高 0.482,相对原模型退化 0.104 |
| AI2D(科学图表问答) | 准确率 | 0.554(S3D8-QAT) | bfloat16 0.631;同尺寸 QAT-INT 0.249 | 比 QAT-INT 高 0.305,相对原模型退化 0.077 |
| 四任务平均(整体任务性能) | 平均任务分 | 0.661(3,569 MB,2.68 bpp) | bfloat16 0.744(21,340 MB);QAT-INT 0.347;QAT-student-t 0.565;QAT-lloyd-max 0.436 | 体积压缩 6.0 倍仅损失 0.083;比最强同尺寸标量格式(student-t)高 0.096 |
| GPTQ 对比 @2.7 bpp(格式隔离实验) | 平均任务分 | S3D8 + GPTQ:0.340 | INT + GPTQ:0.018 | 同量化程序、同速率下格式带来约 19 倍的性能差距,证明 VQ 格式本身的价值 |
| 单用户文本生成速度(Graviton4 96 核服务器) | tokens/s | 36.8 token/s(S3D8,120 GB/s 权重读取带宽) | INT8:26.4 token/s(258 GB/s,权重约 11 GB) | 快 39%;且 INT8 权重无法装入手机内存,S3D8 是唯一可行选项 |
| 移动端端到端生成(Pixel 8a 手机) | tokens/s(解码阶段,100 token 中位数) | 3.8 token/s(12.5 GB/s 参数读取带宽,模型文件 3.73 GB) | INT8:模型放不进内存;bfloat16:21.3 GB 不可行 | 首次在手机上以 sub-3-bit 位宽运行 11B 级 VLM,读取带宽达实测峰值的约一半 |
局限与改进
作者承认的局限:实验只覆盖单一模型(Llama 3.2 11B Vision Instruct)和 CPU 执行;S3D8 解码器深度绑定 Arm 的 64 项 TBL 指令,移植到其他架构需要专门内核;评估使用的是原 Llama 评测套件中一小部分 VQA 风格基准(每任务固定 1024 样本),且 prompt 模板与答案抽取为自研实现,绝对分数与官方模型卡不完全可比;所有权重统一使用同一量化格式,初步实验显示保留部分层在更高精度并无收益;prompt 与图像选择仍有优化空间。我的补充观察:第一,绝对退化并不小——平均掉 0.083,DocVQA 从 0.844 跌到 0.740,Figure 13 展示了真实失败案例(把「Preliminary report」答成「Nutrition survey」),说明细粒度 OCR 式能力在量化中受损;第二,训练图像全部来自 ImageNet 自然照片,与 ChartQA/DocVQA/AI2D 的文档、图表、示意图域存在分布差距,这三个任务的相对退化(10–12%)确实大于 VQAv2(约 7%);第三,QAT 的计算开销(2048 步 × batch 128 的 teacher+student 前向与 student 反向)和耗时未报告,成本透明度不足;第四,Pixel 8a 上 3.8 token/s 意味着每 token 约 260 ms,交互体验仍偏慢;第五,未与其他 data-free QAT 方法(如 LLM-QAT)做数值对比,QAT 相对 GPTQ 的增益中格式与程序的贡献只能部分解耦。
独立分析的弱点
弱点一:合成数据域窄。全部图像来自 ImageNet 自然照片,缺少文档扫描件、图表渲染、科学示意图等类型,而这恰是退化最大的三类任务。改进方向:按域混合图像源——引入合成图表生成器、公开文档图像集,同时保持「不用评测集本身」的无泄漏原则;或对 teacher 生成质量按域做门控过滤。弱点二:prompt 池虽多样但仍偏「图像理解描述」型(495 个通用问题),对需要精确文本抽取、数值推理、空间定位的指令覆盖不足。改进方向:从模型自身的失败样本中迭代挖掘 prompt(self-instruct 式),或按 teacher 输出类型分布做重要性采样。弱点三:均匀位宽一刀切。Table 4 证明简单保留大层在 INT8 无效,但这不等于混合精度无用——按层敏感性(如各层 KL 贡献或 Hessian 迹)做细粒度位宽分配,可能用不到 0.2 bpp 的额外预算换回更多精度,尤其保护输出投影和 OCR 相关层。弱点四:移动端绝对速度偏低(3.8 token/s),且 5 核配置计时方差很大(Figure 10 归因于调度与热节流)。改进方向:结合结构化稀疏(如 Sherry 的 1.25-bit 三值加稀疏路线)、投机解码、或把视觉编码器卸载到 NPU。弱点五:单模型结论外推风险。Llama 3.2 11B 的权重分布未必代表 Gemma 3、Qwen3-VL 等,S3D8 的率失真优势(尤其对重尾分布的适配)需要跨模型验证;改进方向:建立跨模型基准,报告质心分布形状随模型与层类型的变化规律。
未来方向
作者明确提出的方向:进一步优化 prompt 与图像选择以提升下游任务泛化;为其他硬件架构(GPU/NPU 及非 Arm CPU)设计专用 S3D8 内核。基于本文成果可自然延伸的研究:其一,把合成数据流水线扩展到 KV cache 与激活量化,实现全栈低位宽推理(S3D8 思路本身受 NSNQuant 的 KV cache 符号因子化码本启发,双向打通很自然);其二,蒸馏目标从 token 级 KL 升级到序列级或过程级目标,缓解长回答中的误差累积,可能进一步收窄 DocVQA 类任务的差距;其三,利用「训练 KL 损失与任务性能强相关($\rho=-0.91$)」这一发现,用训练损失做在线位宽分配、早停与 checkpoint 选择,自动搜索每层最优格式;其四,QAT 与 GPTQ 的混合程序——作者已实现 GPTQ-S3D8,可在 QAT 末端叠加误差补偿,或反过来用 GPTQ 初始化加速 QAT 收敛;其五,规模律研究:2.7 bpp 这个工作点在 1B/3B 小模型和 70B 级大模型上如何迁移,配合 ParetoQ 一类的极低位宽缩放律分析;其六,工程侧面向 Android 的热管理与多核调度优化,压平 5 核配置的计时方差,把理论带宽优势转化为更稳定的实际 token/s。
复现评估
复现条件较好。代码完整开源(GitHub: graphcore-research/llama-mobile-vlm),涵盖合成数据生成、QAT 训练、GPTQ 对照实现、S3D8 打包以及 Linux/Android 上的 Arm CPU C++ 推理栈(含 NEON 内核与基准脚本)。数据侧:ImageNet 训练集公开可得,teacher 即开源的 Llama 3.2 11B Vision Instruct 权重,因此训练集可完全重建且天然无评测泄漏(作者明确不使用任何下游基准图像或 prompt)。算力侧:数据生成需对百万级图像跑 11B 模型推理(每样本至多 512 token);QAT 为 batch 128、2048 步、最大序列 512,需要 teacher 前向加 student 前反向,估计需要多卡高端 GPU 跑数天——论文未给出确切 GPU 型号与训练时长,这是复现信息中最模糊的一环。评测设备:Pixel 8a 手机或 AWS Graviton4(c8g.24xlarge)实机,后者按小时计费即可。难度评估:算法组件(Lloyd-Max 质心、STE 蒸馏、KL 蒸馏)均为成熟技术,难度中等;系统工程部分(位打包、TBL 查找、sdot 内核、编译器调优)门槛较高,但仓库提供参考实现,Listing 1/2 还给出热循环代码与反汇编说明。注意作者声明评测使用自研 prompt 模板和固定 1024 样本子集,绝对分数可能与官方模型卡略有出入,复现时建议以相对比较为主。
论文图表
DocVQA 失败案例:问「What type of report is this?」,bfloat16 模型正确答「This is a preliminary report.」,S3D8 模型却答「Nutrition survey.」——完全错误。
论文诚实展示的负面样本:说明细粒度 OCR/文档理解能力在 2.68 bpp 下确有损伤,是理解 DocVQA 分数从 0.844 降到 0.740 的具体机制,也是评估实际部署风险的重要参考。