最近两年,端侧AI发展很快。现在的旗舰手机,都能在本地运行大语言模型、AI图像生成、语音识别等AI功能。不用联网,不用调用云端API,直接在手机上就能跑AI,既快又保护隐私。
但很多人用端侧AI,只是用用厂商自带的功能,比如AI消除、AI翻译、AI摘要等,没有充分发挥端侧AI的潜力。其实,端侧AI还有很多进阶的用法和技巧,能让你用得更高效、更强大。
这篇文章,我想分享一些端侧AI的进阶技巧。从模型选择、量化压缩、推理优化到应用开发,聊聊很多人不知道的实用技巧,帮助大家充分发挥端侧AI旗舰的性能。
模型选择:不是越大越好
很多人觉得,端侧AI模型越大越好,参数越多能力越强。但实际上,在端侧设备上,模型不是越大越好,而是要根据设备性能和应用场景选择合适的模型。
首先,要考虑设备的内存和算力。旗舰手机的内存一般是12GB到16GB,但系统和其他应用要占掉一部分,留给AI模型的内存可能只有几GB。一个7B参数的模型,量化到4位,大概需要4GB左右的内存;如果是13B的模型,量化到4位,大概需要7-8GB。在手机上跑13B的模型,内存就比较紧张了,可能会导致其他应用被杀后台,或者系统卡顿。
所以,在手机上,7B的模型是比较合适的选择,平衡了能力和性能。如果是更轻量的任务,比如分类、摘要,3B甚至1B的模型就够用了,速度更快,更省电。
其次,要考虑模型的架构。不同的模型架构,在端侧的表现不一样。比如,Llama系列的模型比较通用,但推理速度一般;Phi系列的模型比较小,但能力很强,适合端侧;Gemma系列的模型优化得比较好,在端侧的推理速度不错。选择适合端侧优化的模型架构,能获得更好的体验。
还要考虑模型的微调。通用的大模型,在特定任务上的表现不一定好。如果你的应用是针对特定领域的,比如医疗、法律、编程,可以用领域数据微调一个小模型,效果可能比通用的大模型还好,而且速度更快、更省资源。
我见过很多人,一上来就想在手机上跑最大的模型,结果卡得用不了,体验很差。其实,选一个合适大小的模型,针对你的任务做优化,体验会好很多。
量化压缩:端侧AI的必修课
端侧AI的核心技术之一,就是模型量化压缩。大模型参数多、体积大,直接在端侧跑不动,必须做量化压缩。
量化就是把模型的参数从高精度(比如FP32)转换成低精度(比如INT8、INT4),从而减小模型体积,提升推理速度。量化会损失一点精度,但一般来说,INT8量化的精度损失很小,几乎感知不到;INT4量化的精度损失会大一些,但对于很多任务来说也够用了。
很多人用端侧AI,只是用默认的量化设置,没有根据自己的需求调整。其实,量化有很多技巧。
第一个技巧是混合精度量化。不是所有层都需要量化到同样的精度。模型的不同层,对精度的敏感度不一样。有些层对精度敏感,比如注意力层,就用高一点的精度(INT8);有些层对精度不敏感,比如前馈层,就可以用低一点的精度(INT4)。这样混合精度量化,既能保证精度,又能减小体积、提升速度。
第二个技巧是量化感知训练。普通的量化,是训练完之后再量化,会有精度损失。而量化感知训练,是在训练的时候就模拟量化的误差,让模型适应量化,这样量化之后的精度损失更小。如果你的模型是自己训练的,建议用量化感知训练,效果会好很多。
第三个技巧是KV缓存量化。大模型推理的时候,KV缓存会占用很多内存。把KV缓存也量化,比如量化到INT8或者INT4,可以大大减少内存占用,让你能在有限的内存里跑更大的模型,或者处理更长的上下文。
第四个技巧是动态量化。静态量化是把整个模型都量化到固定精度,而动态量化是根据输入的情况,动态调整量化精度。比如简单的输入用低精度,复杂的输入用高精度。这样可以在保证精度的前提下,提升平均速度。
量化是端侧AI的核心技术,掌握了量化的技巧,就能在端侧跑出又快又好的AI模型。
推理优化:让模型跑得更快
选好了模型,做了量化,接下来就是推理优化了。推理优化的目标,是让模型在端侧跑得更快、更省电、占用更少的资源。
第一个优化是算子融合。大模型的计算由很多算子组成,比如矩阵乘、加法、激活函数等。把多个小算子融合成一个大算子,可以减少内存访问和计算开销,提升推理速度。比如,把矩阵乘、加法、GELU激活融合成一个算子,一次计算完成,比分开计算快很多。
现在主流的端侧推理框架,比如llama.cpp、MLC LLM、ONNX Runtime等,都做了算子融合的优化。但如果你自己定制模型或者算子,也要注意做算子融合。
第二个优化是批处理优化。端侧AI一般是单用户、单请求,批处理的意义不大。但在一些场景下,比如批量处理文本、批量生成图片,可以用批处理来提升吞吐量。把多个请求打包成一个批次,一次推理完成,比一个个处理效率高很多。
第三个优化是投机采样。这是大模型推理的一个进阶技巧。投机采样的思路是,用一个小模型(草稿模型)快速生成候选token,然后用大模型(目标模型)一次验证多个候选token。如果小模型生成的候选token被大模型认可,就可以一次接受多个token,从而提升生成速度。
投机采样可以在不损失精度的前提下,提升2到3倍的生成速度。这对于端侧大模型来说,是一个很有效的优化。现在一些端侧推理框架已经支持投机采样了,如果你还没用,可以试试。
第四个优化是前缀缓存。很多应用场景,系统提示词(system prompt)是固定的,每次推理都要重新计算一遍,很浪费。前缀缓存就是把固定的系统提示词的KV缓存保存下来,下次推理的时候直接用,不用重新计算。这样可以减少首token的延迟,提升响应速度。
比如,你做一个AI助手,系统提示词是固定的,有几百个token。用了前缀缓存之后,每次用户提问,都不用重新计算系统提示词,直接从缓存里取,首token的响应速度会快很多。
第五个优化是硬件加速。现在的旗舰手机,都有专门的NPU(神经网络处理单元),专门用来做AI计算。NPU的算力比CPU强很多,而且更省电。做端侧AI,一定要利用好NPU,而不是只用CPU。
不同手机的NPU不一样,比如高通的Hexagon、联发科的APU、苹果的Neural Engine。要针对不同的NPU做优化,让模型能跑在NPU上。现在主流的端侧推理框架,都支持NPU加速,但需要正确配置。如果你的模型跑在CPU上而不是NPU上,速度会慢很多,也更耗电。
上下文管理:端侧AI的痛点
端侧大模型的一个痛点,就是上下文长度有限。因为内存有限,能处理的上下文长度就有限。很多人用端侧AI,遇到长文本就处理不了,或者处理到后面就忘了前面的内容。
上下文管理有几个技巧。
第一个技巧是滑动窗口。对于长文本,不要一次性全部输入,而是用滑动窗口的方式,每次只处理一部分。比如,处理一篇长文章,可以分段处理,每段保留前一段的摘要作为上下文,这样既能处理长文本,又不会超出上下文限制。
第二个技巧是摘要压缩。当上下文快满的时候,可以把之前的对话历史压缩成一个摘要,用摘要代替原始的对话历史。这样可以大大减少上下文的长度,同时保留关键信息。比如,把之前10轮的对话压缩成一段摘要,只占几十个token,这样就能继续对话了。
第三个技巧是检索增强(RAG)。对于需要大量知识的任务,不要把所有知识都放进上下文里,而是用检索的方式,从知识库中检索相关的内容,只把相关的内容放进上下文。这样既能处理大量知识,又不会超出上下文限制。
端侧做RAG也很方便,可以用一个轻量的向量数据库,把知识库存在本地,检索的时候直接在本地检索,不用联网。这样既保护了隐私,又能处理大量知识。
第四个技巧是重要信息提取。在对话过程中,把重要的信息(比如用户的名字、偏好、之前的决定)提取出来,单独保存。当需要这些信息的时候,再注入到上下文中。这样,上下文里就不用一直带着这些信息,节省了上下文空间。
这些上下文管理的技巧,能让你在端侧有限的上下文里,处理更复杂的任务,获得更好的体验。
应用开发:端侧AI的正确姿势
如果你是开发者,想做端侧AI的应用,有几个建议。
第一个建议是选择合适的推理框架。现在端侧AI的推理框架很多,比如llama.cpp、MLC LLM、ONNX Runtime、TFLite、Core ML等。不同的框架,支持的模型、硬件、平台不一样。要根据你的目标平台和需求,选择合适的框架。
比如,如果你做跨平台的应用,llama.cpp和ONNX Runtime支持的平台比较多。如果你只做iOS,Core ML是最好的选择,和系统集成最好。如果你做安卓,高通的QNN或者联发科的NeuroPilot能更好地利用NPU。
第二个建议是做好模型的打包和管理。端侧AI应用,模型体积比较大,几个GB很正常。怎么把模型打包进应用,或者让用户按需下载,是需要考虑的问题。
一般来说,不要把大模型直接打包进APK/IPA,那样安装包太大了。可以让用户第一次使用的时候下载模型,或者提供不同大小的模型让用户选择(比如小模型、中模型、大模型),用户根据自己的手机性能和需求选择。
第三个建议是做好性能和功耗的平衡。端侧AI很耗电,也容易发热。如果你的应用让手机变得很烫、耗电很快,用户会很反感。所以,要做好性能和功耗的平衡,比如在不需要高性能的时候,用小模型或者降低精度;在后台运行的时候,限制推理的频率;检测到手机温度高的时候,自动降低性能。
第四个建议是保护用户隐私。端侧AI的一大优势就是隐私,数据不用上传到云端。但如果你的应用还是把用户数据上传到云端,那就失去了端侧AI的意义。所以,尽量让所有AI计算都在本地完成,不要上传用户的隐私数据。如果确实需要云端辅助,也要明确告知用户,获得用户同意。
第五个建议是做好离线体验。端侧AI的另一个优势是离线可用。即使没有网络,也能正常使用AI功能。所以,你的应用应该能在完全离线的情况下正常工作,不要依赖网络。这对于网络不好的场景,或者用户不想联网的场景,很有价值。
常见误区
最后,说说端侧AI的几个常见误区。
第一个误区是:端侧AI可以完全替代云端AI。其实不是的。端侧AI的优势是隐私、离线、低延迟,但模型能力和算力有限,复杂的任务还是需要云端。最好的方式是端云协同:简单的、隐私敏感的任务在端侧做,复杂的、需要大量算力的任务在云端做。端侧和云端不是替代关系,而是互补关系。
第二个误区是:端侧AI就是把云端模型搬到端侧。不是的。端侧AI需要针对端侧的特点做专门的优化,比如模型压缩、量化、推理优化、上下文管理等。直接把云端的大模型搬到端侧,是跑不起来的,或者体验很差。端侧AI是一个专门的领域,需要专门的技术和优化。
第三个误区是:参数越多效果越好。不是的。在端侧,模型大小受限于内存和算力,不是越大越好。一个优化得好的小模型,可能比一个没优化的大模型效果更好、速度更快。关键是根据任务和设备,选择合适的模型,并做好优化。
第四个误区是:端侧AI只是手机厂商的事。不是的。端侧AI是一个开放的生态,普通开发者也可以做很多事情。比如,用开源的推理框架,在自己的应用里集成本地大模型;用端侧AI做一些创新的应用,比如离线翻译、本地知识库、隐私计算等。端侧AI的机会很多,不只是大厂能做。
写在最后
端侧AI是一个很有前景的方向。随着手机算力的提升和模型优化技术的进步,端侧AI的能力会越来越强,应用会越来越广。
但端侧AI也是一个需要深入学习的领域。不是随便把模型跑起来就行了,要做好模型选择、量化压缩、推理优化、上下文管理,才能获得好的体验。
希望这篇文章分享的这些进阶技巧,能帮大家更好地使用和开发端侧AI,充分发挥旗舰手机的AI性能。
最后用一句话来结束这篇文章:"端侧AI的真正潜力,不在于把云端的东西搬下来,而在于创造只有端侧才能做到的新体验。"
愿每一个开发者,都能在端侧AI的浪潮中,找到属于自己的机会。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录