手机也能跑视觉大模型?把110亿参数塞进3.7GB的秘密

你有没有想过,为什么手机上的AI助手大多只能处理文字,一旦涉及"看图说话"就得联网求助云端服务器?

答案很简单:视觉语言模型太重了。以Llama 3.2 11B Vision Instruct为例,这个模型原始大小高达21.3GB,别说手机内存装不下,就算装下了,功耗和发热也够呛。这就好比你想把一整个图书馆搬进随身携带的行李箱里,纸质书本身的重量就是硬伤。

Graphcore Research和Arm的研究团队做了一件挺大胆的事:把这个110亿参数的视觉语言模型压缩到了3.7GB,压缩比接近6倍,还要保证它在标准问答测试上表现依然过硬。这篇论文《Llama-Mobile: Efficient 2.7-Bit Quantization of VLMs》讲的就是这件事是怎么做成的。

**这不是简单的"降低精度"就能解决的问题。**

事情要难在哪,得先说清楚。

压缩模型这件事,业内早有成熟套路,叫做量化。

量化*:把模型里那些原本用32位或16位浮点数表示的参数,改用更少的比特位(比如8位、4位甚至更少)来存储,从而减少模型体积和计算开销的技术。

问题是,量化压缩得越狠,模型出错的概率往往就越高。这就像把一段高清视频转成压缩格式,压缩比小的时候你几乎看不出差别,可一旦压缩得太狠,画面就开始出现马赛克,色块糊成一团。视觉语言模型比纯文本模型更娇气,因为它同时要处理图像和文字两种信息,稍微压缩过头,模型就可能看错图、答非所问。

在这篇论文之前,业界对付低比特量化基本有两条路子。一条是训练后量化,也就是模型训练完之后再做压缩处理,代表方法叫GPTQ。

GPTQ*:一种训练后量化技术,通过分析权重矩阵的二阶信息(海森矩阵)来最小化量化带来的误差,不需要重新训练模型,压缩速度快、成本低。

另一条路是量化感知训练,简称QAT。

QAT(Quantization-Aware Training)*:在训练或微调过程中就把量化操作加入进去,让模型提前适应低精度环境,通常比训练后量化效果更好,但需要额外的训练数据和计算资源。

这两条路各有各的软肋。GPTQ省事,但压缩到极限的时候性能掉得厉害。QAT效果好,但它高度依赖训练数据的质量,如果拿来训练的数据和模型原本的使用场景对不上,效果反而会打折扣。而这篇论文面对的现实是:研究者手里根本没有Llama 3.2原始的训练数据和训练配方,这些都是Meta公司内部的机密。

没有原始数据,还想做高质量的QAT,这就是研究团队要闯的第一道关。第二道关更硬核:即便训练出了低比特的模型,怎么才能让手机的Arm处理器高效地跑起来,而不是纸上谈兵。

论文最后交出的答卷分成两块。一块是数据生成的流程设计,解决"没数据怎么办"的问题。另一块是一种全新的数字格式,叫S3D8,专门为Arm CPU的解码效率量身定制。接下来我们一步步拆开看。

没有原始训练数据,怎么教模型"减肥"

先说第一个难题:手里没有原始训练数据,怎么让量化后的模型不"失忆"?

研究团队想出的办法挺巧妙:既然拿不到原始数据,那就让模型自己"生成"数据来教自己。

具体怎么做?他们找来一堆图片,这里选用的是ImageNet数据集。

ImageNet*:一个包含超过128万张图片的大型图像数据库,长期以来是计算机视觉领域训练和测试模型的标准数据集之一。

选择ImageNet的理由很实际:它足够大、足够多样,而且和最终要测试的问答任务没有直接关联,不会造成"抄近道"式的过拟合。

拿到图片之后,团队给每张图片配上一个随机生成的提问,然后把图片加提问一起丢给原始的、没有压缩过的Llama模型(这时候它被称为"教师模型"),让教师模型生成回答。这些教师模型生成的回答,就成了训练素材,用来教那个正在被压缩的"学生模型"尽量模仿教师的行为。

这套逻辑用了一个术语,叫知识蒸馏。

知识蒸馏(Knowledge Distillation)*:让一个体积更小、精度更低的学生模型去模仿一个更大更精确的教师模型的输出分布,从而在压缩体积的同时尽量保留原有的能力。

这里最关键的设计巧思藏在提问方式上。如果每次都用同一句提示词,比如固定问"描述一下这张图片",模型的输出会变得千篇一律,句式雷同、长度相近、风格单一。这就好比你想让一个学生学会应对各种题型的考试,结果每天只让他做同一道例题。练一百遍这道题,他确实会对这道题烂熟于心,但换一道题他大概率还是不会。

论文里专门做了一个实验验证这一点:用固定提示词训练出来的模型,和用随机采样多样化提示词训练出来的模型相比,前者的下游任务表现明显更差,差距随着训练步数增加越拉越大(详见论文图3b)。这说明模型要学的不是"记住一个标准答案",而是要学会在各种不同情境下都能生成合理的回答,这种"举一反三"的能力,恰恰需要靠训练数据的多样性来喂养。

具体来说,研究团队设计了一套随机采样的提示词生成规则。

有75%的概率,会套用Llama官方的指令模板(也就是模型平时被调教成"听指令、答问题"的那种格式),确保模型不会忘记自己作为一个"听话的助手"该有的样子;剩下25%的概率则用最朴素的图片加提示词格式,保留模型在非指令场景下的原生能力。

问题本身也是随机生成的,从近500个不同的问题模板里抽取,涵盖"描述主要内容""总结场景""面向数据集标注的说明"等各种角度和风格。

有70%的概率还会在问题前面加一段额外指令,比如要求用简单语言作答、要求控制答案长短、要求遵循特定格式,这些指令又是分别按不同概率随机组合出现的。

这套流程的核心目的只有一个:让模型接触到的问答场景尽可能贴近真实世界里五花八门的提问方式,既有简短的是非题,也有需要展开论证的长篇解释,还有各种格式要求和语气风格。整个过程完全不使用任何下游测试任务(比如VQAv2、ChartQA这些评测集)里的图片或问题,避免"背题"式的作弊。

这个思路让我联想到应试教育和素质教育的区别。死记硬背某一套题型的学生,考试换个出题风格立刻现原形;而真正见多识广、训练充分的学生,面对陌生题型也能保持水准。数据的多样性,不是数据的数量,才是这里的胜负手。

2.7比特里塞进三个数,S3D8格式怎么做到的

解决了"喂什么数据"的问题,接下来是这篇论文真正的技术硬货:怎么设计一种数字格式,既能把参数压缩到极致的2.7比特每个参数,又能让手机芯片飞快地把它解压出来用。

先说说为什么这事不简单。

一般的量化格式,无论是简单粗暴的整数量化(INT),还是稍微聪明一点的非均匀量化,通常都是一个数值对应一个存储单元,逐个处理。但研究团队想要更进一步的压缩率,普通格式很难压到3比特以下还保持可用的精度。

这里他们选择了一种叫向量量化的思路。

向量量化(Vector Quantization, VQ)*:不是把每个数值单独量化,而是把多个数值打包成一个"向量",然后在预先训练好的"码本"(一堆代表性的向量样本)里找一个最接近的代表值来近似表示整个向量,从而用更少的比特存储更多信息。

具体到S3D8这个格式,它的核心设计是:把三个权重数值打包进一个字节(8个比特)里。

怎么做到的?先说数值本身。这三个数各自的正负号(是正是负)各占1个比特,三个数总共3个比特用来存符号。剩下的5个比特,用来存一个"索引编号",这个编号指向一张预先训练好的、包含32个"代表性数值组合"的查找表。也就是说,这三个数值的绝对值大小信息,被压缩成了这张32项表格里的其中一项。

这就是论文标题里"2.7比特"的由来:3个数值总共占用8个比特,平均下来一个数值只占用8/3约等于2.67个比特,再加上一点用来存储缩放系数的开销,最终落在2.68比特左右。

论文里配了一张很直观的图(图2),把这个过程画得很清楚。左边是原始的浮点数据,先根据每个输出通道里数值的最大绝对值算出一个缩放系数,把数据映射到一个标准的8位整数范围。这一步得到的中间结果叫channel-INT8,也就是按通道缩放的8位整数格式。

接着,把这个8位整数数据的绝对值部分,去匹配一张预先算好的"最优代表值表",找到最接近的那一项,记下它的编号;同时单独记录下这个数原本的正负号。这样一来,原本需要完整存储的数值,就被拆解成了"一个共享的索引编号"加"三个独立的正负号"。

论文右边那张图(图2右侧)展示了这些代表值在坐标系里的分布:32个蓝色的点代表训练出来的"代表性数值组合",围绕原点呈现出某种密度分布,数值越集中的区域,代表点也越密集,这是因为神经网络的权重通常服从某种接近正态分布的规律,中间密集、两头稀疏。而正负号信息则像是给这32个点做了"镜像复制",让它们能覆盖到正负数值的八个象限组合(因为3个数各自有正负两种可能,2的3次方等于8种组合)。

这套设计要解决的根本矛盾是什么?

普通的量化格式如果想要非均匀分布(也就是让数值密集的地方精度更高,稀疏的地方精度低一些,从而整体误差更小),往往需要一张很大的查找表,比如如果每个数值单独用8比特编码,理论上就需要256乘以3也就是768字节的查找表。这对于追求速度的芯片硬件来说太笨重了,因为手机CPU里能高速访问的寄存器空间是很有限的,查找表越大,每次查找的开销也越大。

论文这里用了一个很聪明的技巧:既然神经网络的权重分布通常是对称的(正负两边镜像对称),那就没必要把正负号也塞进这张大表里,单独拎出来用符号位处理,查找表就能从256项直接压缩到32项。这就好比你要给全班同学编花名册,如果男生女生的名字其实是成对出现的双胞胎(一个叫"张三"一个叫"张三反"),那你完全没必要把两个人的名字都完整记录一遍,只需要记一个"张三"再加一个"性别标记"就够了,花名册厚度直接减半还不止。

**如果不做这种对称性拆分,直接用256项的完整查找表,那么这张表的大小会超出芯片高速缓存能够舒服放下的范围,每次查找都可能要付出额外的内存访问延迟,速度反而慢下来。**

S3D8还做了两个特别针对Arm芯片硬件特性的优化。

第一个是数据的排列方式。芯片处理数据讲究"连续"和"对齐",如果把三个权重按照它们在计算里"输入维度"上的位置连续排列,会导致做矩阵乘法运算时需要额外的操作去交错、拆分这些数据。研究团队选择反过来,让打包进同一个字节的三个数值对应的是"输出通道",这样在做点积运算的时候,不需要额外的对齐补边操作,效率更高。

第二个优化更细致,是关于符号位怎么和索引编号组合,才能用最少的芯片指令完成解码。论文提到,Arm处理器有一种叫TBL的向量化查找表指令,可以直接支持带符号数值的查找。

TBL(Table Lookup)*:Arm处理器SIMD指令集里的一种向量化查表指令,能够一次性对多个数据并行执行查表操作,是这里加速解码的关键硬件特性。

研究团队巧妙设计了比特的排列顺序,让符号信息和索引信息可以通过简单的位运算("与"运算、"移位"运算、"异或"运算这类逻辑运算)快速拼接出三个查表用的索引,总共只需要5条逻辑指令,就能同时解码出48个数值。这个细节虽然听起来很技术,但它直接决定了这个格式在真实手机芯片上跑起来是快还是慢。

这里其实藏着一种"软硬件协同设计"的思路,格式设计不是数学家在纸上算出最优压缩率就完事了,而是要真正摸清楚目标芯片的指令集能做什么、不能做什么,然后把算法削足适履地嵌进硬件的能力边界里。这就像给运动员定制跑鞋,不是找一双"理论上最结实"的鞋,而是要摸清这位运动员的脚型、跑步姿势、赛道材质,做出真正贴合的那一双。

压缩之后,模型表现到底掉了多少

说了这么多方法,最终效果到底怎样?这是所有读者最关心的问题。

论文用Llama 3.2 11B Vision Instruct模型做了系统性对比实验,测试集选用了四个视觉问答基准:VQAv2(通用图片问答)、ChartQA(图表理解)、DocVQA(文档理解)、AI2D(科学示意图理解)。

先看数字对比。原始的bfloat16模型(也就是没有压缩过的版本)体积高达21340MB(约21.3GB),四项任务的平均得分是0.744。

**S3D8格式配合QAT训练之后,模型体积压缩到3569MB(约3.5GB),平均得分是0.661,只比原始模型下降了0.083。**

对比一下同等体积下其他量化格式的表现就更有说服力了。同样压缩到3600MB左右的体积,普通的均匀整数量化格式(INT)平均得分只有0.347,几乎腰斩;用了非均匀量化优化的student-t格式能到0.565;另一种非均匀量化方法lloyd-max只有0.436。相比之下,S3D8的0.661可以说是断层式领先。

这组数字意味着什么?意味着在同样的体积预算下,其他格式压缩过头的地方,模型可能连图表上的柱状图数值都读不准,答案错得离谱;而S3D8能把这种损耗控制在一个相对温和的范围内,四个任务里表现最差的AI2D(科学图示理解)也还能保持0.554的准确率,远好于其他格式在这项任务上不到0.35甚至0.15的表现。

再看量化方法本身的对比。论文用了一张图(图1)把三种量化路径,直接强制转换(不做任何训练调整)、GPTQ训练后量化、以及本文的QAT方法,放在同一张图里对比模型体积和任务表现的关系。结论很直观:直接强制转换在体积压缩到3.5比特以下时性能会断崖式下跌;GPTQ整体表现优于直接转换,但在极低比特率下依然力不从心;而QAT方法在低比特区间明显更稳健。

论文还专门做了个对照实验,把量化方法和数字格式两个变量拆开单独测试。在约2.7比特每参数的压缩率下,如果只用GPTQ(不做QAT),S3D8格式能拿到0.340的平均分,而用同样的GPTQ方法但换成普通INT格式,得分只有0.018,几乎等于瞎猜。这组对比把"格式设计的贡献"单独拎了出来:即便都不用QAT精细调教,光是S3D8这套"三合一打包加符号分离"的设计,就已经比传统整数量化强了将近20倍的表现。而进一步用QAT去训练S3D8,得分又从0.340跃升到0.661,这说明格式设计和训练方法这两个变量都很重要,缺一不可。

跑起来到底快不快,手机实测数据说话

压缩率和精度都谈完了,还剩最后一个现实问题:这套格式在真实的手机芯片上跑起来,速度到底行不行?

论文在两个平台上做了测试。一个是消费级的Google Pixel 8a手机,另一个是服务器级的Graviton4芯片(96核的Arm服务器芯片,用作性能上限参考)。

先看纯粹的"解码速度",也就是把S3D8格式的压缩数据还原成可以直接计算的INT8格式需要多长时间。以视觉编码器里一个多层感知机的上投影层为例,在Pixel 8a手机上用5个CPU核心,S3D8格式的解码只需要133微秒(相当于16.5GB每秒的读取带宽),而作为参照的INT8直接拷贝操作需要310微秒。这说明S3D8虽然多了一步"解压"的动作,但因为它本身要读取的数据量只有INT8格式的三分之一,综合算下来反而比直接读取INT8数据还要快。

再看真正跑矩阵乘法运算(也就是神经网络推理里最核心、最耗时的计算环节)的速度对比。这里有个挺有意思的现象:在生成文字这种"每次只处理一个词"的场景下(论文里叫batch size等于1,也就是矩阵乘法运算里的m=1情况),S3D8的速度优势非常明显。比如在Graviton4芯片上,处理一个形状为(1, 4096, 14336)的矩阵运算,bfloat16格式的速度是每秒236亿次乘加运算(GMAC/s),INT8格式是461亿次,而S3D8达到了1031亿次,几乎是INT8的两倍多。

但如果是处理长文本或图像这种"批量处理"场景(比如一次要处理1601个图像块,对应m=1601的情况),S3D8的优势就不明显了,甚至会比INT8稍慢一点点。这背后的道理不难理解:生成文字这种场景,瓶颈在于"把参数从内存里搬到计算单元"这个过程,专业说法叫内存带宽受限,这时候数据体积越小,搬运越快,S3D8体积小的优势就能充分发挥。而批量处理场景,瓶颈变成了"计算单元本身算得够不够快",专业说法叫计算受限,这时候S3D8因为多了一步解压缩的额外运算,反而占了一点点小便宜的代价。

**这个现象揭示了一个很朴素的道理:手机上跑AI助手,用户体验最敏感的就是"逐字蹦出回答"的这个生成阶段,而这恰恰是S3D8最擅长的场景。**

反过来说,如果一个应用场景更偏向批量处理大量图片(比如相册批量打标签),S3D8的收益可能没那么可观,这时候直接用INT8可能是更简单也更合适的选择。这也提醒我们,没有一种压缩格式是万能的,得看具体用在什么场景。

最后论文团队还做了一个端到端的完整测试:用C++搭建了一套完整的推理程序,真的在Pixel 8a手机上跑完整的Llama 3.2 11B Vision模型,模型文件大小压缩到3.73GB(这个数字比前面提到的3.57GB稍大,是因为算上了词表和一些元数据)。测试结果是,在生成阶段能达到每秒3.8个词(token)的速度,对应12.5GB每秒的参数读取带宽,这已经是这台手机理论最大读取带宽(约25GB每秒)的一半左右了。作为对比,如果用INT8格式存储,模型压根装不进手机内存,这也侧面说明了极致压缩不是锦上添花,而是能不能在手机上跑起来的生死线。

而在Graviton4服务器芯片上,S3D8能跑到每秒36.8个词,速度比INT8格式的每秒26.4个词还要快,这对于需要伺候大量用户请求的服务器场景来说也是一个实打实的效率提升。

这项研究目前也有一些明确的边界

论文作者也很坦诚地列出了几个局限。

整套实验只在一个模型(Llama 3.2 11B Vision Instruct)上做了验证,没有测试其他视觉语言模型是否也能获得同样的收益。S3D8这套解码逻辑高度依赖Arm芯片特有的64项查找表指令,换到其他芯片架构(比如高通、苹果自研芯片如果指令集设计不同)上可能需要重新设计解码逻辑,不能简单照搬。

测试用的四个视觉问答基准数据集,本身规模有限(论文里用的都是固定的1024条样本子集),覆盖面未必能代表所有真实应用场景。研究团队还尝试过一种折中方案:把模型里某些特别重要的层(比如语言模型的输出投影层,或者整个视觉编码器)保留成精度更高的INT8格式,其余层继续用S3D8压缩,指望能用一点体积换来更好的效果。但实验显示这个思路收效甚微,即便把输出投影层和视觉编码器都换成INT8,模型体积从3569MB涨到4513MB,平均得分却只提升了0.006,几乎可以忽略不计。这说明S3D8这套格式本身已经相当均衡,靠"局部妥协"很难再榨出明显的额外收益。

写在后面

读完这篇论文,最让我意外的一点是,研究团队解决"没有原始训练数据"这个问题的方式,不是去想办法搞到数据,而是让模型自己给自己当老师。这个思路乍一看有点"左脚踩右脚"的意味,教师模型本身就是要被压缩的那个模型的完整版,用它自己生成的数据来训练它自己的压缩版本,听起来像是循环论证。但仔细想想,这其实是把"模型原本的行为模式"当作了一种可以被反复采样、反复提炼的资源,教师模型见过的世界,压缩成了它能生成的答案风格,学生模型再从这些答案里学回来。这种"自我蒸馏"的思路,可能比强行找外部数据集去凑更加贴合模型原本的语气和习惯。

论文里那个"固定提示词vs随机提示词"的对比实验也让我印象很深,两组实验用的是完全相同的训练数据规模和步数,唯一的差别就是提示词是否多样化,结果表现差距巨大。这提醒我一个更普遍的道理:很多时候"喂给AI多少数据"不是决定效果的关键变量,"喂的数据够不够多样"才是。

还有一个细节值得琢磨。论文附录里展示了几个具体的问答案例,压缩后的模型在DocVQA那道题上,把"这是什么类型的报告"答成了"营养调查",而正确答案应该是"初步报告",这是一份关于巴西东北部营养状况的初步调查报告,模型抓住了"营养调查"这个内容主题,却漏掉了"初步(preliminary)"这个封面上明确写着的关键词。这种错误挺有意思,它不是那种"看图看瞎了"的低级错误,而是一种"抓大放小"式的信息丢失,压缩带来的损耗,有时候表现得很像人类粗心大意时犯的错,而不是随机的乱码。这会不会是低比特量化损耗的一种普遍特征?值得再深挖。

Q&A

Q1:Llama-Mobile的S3D8格式是什么?

A:S3D8是论文提出的一种2.7比特每参数的量化格式,把三个权重数值打包进一个字节,通过共享的5比特索引查表加3比特符号位实现压缩,专门针对Arm CPU的解码效率做了硬件层面的优化设计。

Q2:这项研究把Llama 3.2 11B Vision Instruct模型压缩到多大?

A:压缩后的模型体积是3.7GB,配合8比特激活值,相比原始bfloat16版本21.3GB的体积,压缩比接近6倍,同时在四项视觉问答基准测试上平均只损失了0.083的准确率。

Q3:没有原始训练数据怎么做量化感知训练?

A:研究团队让教师模型(未压缩的原始模型)针对ImageNet图片生成随机采样提示词对应的回答,把这些生成结果当作训练素材去教量化后的学生模型模仿教师的行为,从而绕开了需要访问原始训练数据的限制。

作者声明:作品含AI生成内容
举报/反馈
分享到: 微博 QQ 空间
对本文内容有合作意向?
我们将在 1 个工作日内与您联系
留言咨询