把一个几十亿参数的图像扩散模型塞进手机,这件事正在从论文变成工程现实。但”塞进去”三个字背后,是一连串并不浪漫的取舍。
大模型在云端 GPU 上跑得动,是因为它有几百瓦的功耗、几十 GB 的显存带宽、和几乎无限的散热预算。一部手机只有 5 到 10 瓦的整机功率上限,内存带宽比桌面级小一个量级,芯片表面温度超过 45 摄氏度就要触发降频。在这种约束下,模型本身必须先瘦身,再重写执行路径。
第一步不是压缩,是选哪条路径压缩
蒸馏不是把一个大模型”砍一半”。蒸馏是让一个小模型在训练阶段,去模仿大模型输出的整张概率分布,而不是只学正确答案。这种差异在图像生成里被放大成一种更微妙的问题:小模型必须学会”在每一步去噪时,应该把图像往哪个方向推”。
如果直接照搬大模型的中间特征,小模型学到的会是”它的算力”而不是”它的审美”。所以主流方案是同时给学生模型两个目标:一是生成图像本身要和原图接近,二是它中间每一帧的噪声预测分布要和老师模型高度一致。后者更吃显存,也更难调。
第二步:把权重从 fp16 压到 int4,不是省内存那么简单
把 fp16 量化到 int4,模型体积能直接砍到原来的四分之一,看上去很划算。但量化是带损耗的:扩散模型对低比特特别敏感,因为它的去噪过程是一个累计过程——第一步错 1%,第 20 步可能就错 20%。
所以工程上出现了”双轨策略”:早期去噪步骤用 int8 精度,给方向感;后期细节步骤用 int4 精度,给纹理密度。一张图从加噪到出片几十步,每一步用不同的精度组合,这部分逻辑现在是模型文件外的运行时配置,发布时一起打包。
第三步:移动 NPU 不跑通用矩阵,只能跑特定形状
手机 NPU 是为端侧推理量身定做的,但它的硬件加速器是固化的。某一代 NPU 只对 4×4、8×8、16×16 这样的特定矩阵块做过深度优化,模型权重如果落不到这些形状上,就会被迫退回到通用 CUDA 核,性能立刻塌一半。
这就要求蒸馏后的学生模型在架构层就要做”硬件感知”。通道数、注意力头数、卷积核大小都不是随便选的数字,而是要在搜索空间里反复试,看哪一组组合在目标 NPU 上能跑出最高的 token per second。一个常见的现象是:在 PC 上跑得很漂亮的蒸馏模型,到了某款手机上反而比原版更慢——因为它的权重矩阵形状恰好和硬件加速器不匹配。
第四步:5 秒出图不是终点,是新的体验底线
业内一个常用的产品口径是”手机端 5 秒出第一张图”。这个数字背后是端到端推理预算:模型加载、去噪迭代、图像解码、颜色空间转换,每一个环节都被切到只剩几毫秒。
这逼出了几个工程技巧:模型权重按需流式加载,第一次去噪迭代的中间结果立刻开始向屏幕送出;去噪步数从 25 步砍到 4-8 步,靠蒸馏来补质量;解码器从大模型换成超轻量版本。每一个砍掉的步骤背后都有相应的损失函数在兜底,否则用户拿到的就是一团模糊的色彩。
代价清单:5 个不能省的环节
把整个流水线拆开看,蒸馏到端侧至少要解决这五件事:
一是训练数据要比模型本身更复杂。蒸馏不是无中生有,它需要老师模型对几十万张图都跑一遍完整推理,产出配对的”中间噪声预测”作为学生模型的学习目标。
二是评测数据集要重做。FID、IS 这些在 ImageNet 上有用的指标,到了真实手机拍摄的小数据集上就失灵,需要重新设计一套反映”日常场景出图质量”的评测。
三是运行时库必须重写。一个针对 PC GPU 优化的推理框架,到了移动 NPU 上大部分算子都得重写,因为 NPU 的指令集和 CUDA 是两套世界。
四是端到端的延迟分布要测。平均 5 秒出图不够,需要看 P99 延迟——最差情况下用户要多等多久。低端机型的体验边界通常由 P99 决定,而不是平均值。
五是功耗曲线要配合手机的温控策略。持续推理会让芯片快速撞到温墙,触发降频后推理速度立刻腰斩。一套合格的端侧方案必须包含”温控感知调度”,在芯片温度接近阈值时主动降级步数。
这件事为什么值得做
把生成模型压到手机里,意义不只是省云端推理的成本。它真正改变的是体验形态:用户不再需要为生成一张图先登录、输入关键词、等待网络往返。一个想法出现的瞬间,按下快门就能看见雏形。
这种延迟级别的变化,会把生成式 AI 从一种”工具”重新定义成一种”直觉的延伸”。就像计算器改变数学教育一样,端侧的生成模型有可能改变人和图像之间的关系——前提是它真的能在千元机上稳定跑出能看的图。
所以蒸馏这件事,远不只是把模型变小。它是让大模型真正走出云端、走进口袋的最后一公里,也是这一代工程师正在面对的、最具体也最琐碎的一道工程题。