💰 点进来就是赚到知识点!如何炼制出一个端侧模型?本文带你读读论文《On-Device LLM, A comprehensive review》 ,点赞、收藏、评论更能促进消化吸收!
🚀 想解锁更多 Web AI 的强大能力吗?快来订阅专栏「Web AI 进化录」!
引言
如果把 GPT o1 大模型放进你的手机里,你的手机会重到两只手抬不起吗?还是会被撑得鼓包变形?
哈哈,当然是都不会了,程序比灵魂还轻、还空虚(突然玩起深沉哲学是怎么回事)
但是大模型确实不是只能部署在 H100 集群上的,这两年来,模型厂商在卷参量、卷上下文窗口、卷多模态的同时,也没忘了在端侧模型上较劲。
所谓端侧模型,英文名 On-device Model,指的是运行在用户端设备上的模型。比如可以运行在手机和浏览器里的 Gemini Nano。除了手机,端侧场景还有很多,比如电脑、车机、可穿戴设备、机器人等等。
从 2023 年起,从文本到多模态,10B 以下的各种小参量模型也不断涌现,模型竞赛开辟了另一个战场。与军备竞赛相对应的,市场对端侧模型的需求也在不断增长。有统计预测,到 2032 年,端侧模型市场规模会是现在的 10 倍。人们逐渐不满足于云端模型这种单一的部署形式,希望端侧模型来提供低延迟、低成本、高私密性的智能服务。
我们对大模型的一贯印象是动辄几百亿的参量、依赖昂贵而稀缺的显卡,那么把一个大模型放到手机这样的设备中,它怎么可能闪转腾挪得开?
那么今天,咱们就来聊聊这头大象是怎么被装进冰箱的。
端侧设备的限制
即使是硬件设备水平在不断刷新摩尔定律,手机、电脑满足日常需求早已性能过剩,但是想要跑起层级复杂的神经网络来,可能还是有些吃力。
首先是算力有限。不管是 Apple 的 M4,还是 Intel 的 i9,CPU 在并行计算上总是逊于 GPU,而消费级 GPU 的计算单元总归是有限。而大模型在推理时需要充足的算力 —— 并不是「GPU 太弱那我慢慢算好了」,一定的算力指标是运行大模型的准入门槛。而家用的手机、电脑一般没那个条件。
其次是内存,准确说是 RAM 或者 VRAM。当参与乘运算的矩阵足够大时,需要够足够的运行存储来支撑高速读写。正常办公笔记本电脑的 8GB 会显得过于逼仄。
能耗也是需要考虑的因素。据统计,ChatGPT 每处理一次用户请求要消耗 2.9 瓦时电量。我们按一度电五毛钱算,与 ChatGPT 交互 1000 次,就要花掉 1.5 元的电费。而事实上 ChatGPT 一年的电费也是几个亿。
所以如果我们把原装的几百亿参数模型强行装进手机,那么实际情况可能就是,你跟大模型打了个招呼,然后手机立即卡死、疯狂掉电、烫得能煎蛋。
那么想要在资源有限的环境中平衡性能和准确度,就得对大模型动动手术刀,而且得转发到好友群多砍几刀。
性能指标
要尽量科学客观地观测大模型在端侧的性能,我们需要一些数据指标。
- 延迟时长:指的是从用户发出指令到模型返回第一个 Token 之间所用时长(TTFT,Time to first token)。它直接决定了用户体验。
- 推理速度:可以用每秒生成的 Token 数量来衡量,代表了模型的运算效率。
- 最小运存:最少需要多大 RAM 才能正常跑起来。
- 模型体积:模型文件需要占用多少磁盘空间。毕竟,用户的设备硬件都是有成本的,不太可能因为你是大模型就纵容你无限铺张。
- 能耗:运行一小时需要多少焦耳的能量。
有了具体的衡量刻度之后,让我们来看看在模型的生产周期中,我们可以在哪些阶段用什么手段干预,最终得到一个可以在端侧运行的大模型。
合理的模型架构
在对模型进行设计时,就需要面向端侧场景去考虑采用何种架构。可以从以下几个关键策略去考虑:
- 参数共享:模型的不同部分之间复用权重,以减小整体体量。
- 模块化:把一个模型拆成若干个模块,让它们可以独立或者并行运行。
- 压缩、聚合:通过量化和权重剪枝等手段来减小内存占用。
此外,在预训练时也要控制产出模型的参量,需要在效果和效率之间掌握微妙平衡。
量化(Quantization)
量化的含义是把神经网络的权重从高精度转化为低精度,从浮点数变整数。这样可以在保持准确性的同时,降低模型体积、减少计算所占用的资源、提升推理速度,并降低内存占用。
我们可以专门为模型做一次量化训练,也可以对成品模型进行量化处理。前者(Quantization-aware Training, QAT)让产出的模型直接就是低精度的,一步到位;而后者(Post-training Quantization, PTQ)不需要二次训练,更有效率,而且对资源限制没有那么敏感。
量化是缩小模型体量的最常用方式。
剪枝(Pruning)
你说这是「减脂」也没毛病。总之就是有选择地移除不太关键的权重和神经元,在不影响性能的同时,降低复杂度、提升运算效率。
剪枝有以下几种策略:
- 结构化剪枝:移除整块的组件,比如某个网层、频道、过滤器。这样更利于内存管理和计算。大名鼎鼎的 LoRA 就是这么做的。
- 非结构化剪枝:以权重为维度来移除。
- 上下文相关剪枝:针对特定的场景和任务,把相关性低的部分移除。
剪枝之后的模型,会变得轻量小巧,但也可能会因为权重不完整,在某些边界情况出现准确度下降的可能性。
蒸馏(Distrillation)
指的是把大号模型中的某些领域知识提取、转移到小号模型中去,它也有两种方式:
- 黑盒蒸馏:小号模型直接从大号模型的生成内容中学习。适用于两个模型的架构差异较大,小号无法接入大号的内部参数的情况。
- 白盒蒸馏:小号模型接入大号模型内部,清晰而精确地提取内部模式识别逻辑。
经过蒸馏处理,实际上是「新瓶装旧酒」,用小参量模型来取代大参量模型做同样的工作。如同老师给学生传授知识,学生能得几分真传,就要看造化了。
结语
经过了上述处理,一个小参量、低精度的「青春版」端侧模型就诞生了。它虽然没有云端模型那么高强的性能,但它来到用户设备端时,肩负的是云端模型无法扛起的使命,解决的是不同的需求和问题。因此讨论谁比谁更好是无意义的,本质上来说,随着云端模型变强,端侧模型也会相应取得进步。端侧智能必然会成为不容忽视的存在。
恭喜你读完了本文,你真棒!
📣 我是 Jax,在畅游 Web 技术海洋的又一年,我仍然是坚定不移的 JavaScript 迷弟,Web 技术带给我太多乐趣。如果你也和我一样,欢迎关注、私聊!