最近我们团队在做一款AI手表,遇到了比较严重的性能问题。

AI手表的硬件资源非常有限,CPU、内存、电池都比手机小得多,但又要跑AI功能、做健康监测、处理语音交互。刚做出来的原型机,AI助手的响应时间平均要5秒,用户体验很差。

经过一系列的性能调优,我们把平均响应时间从5秒降到了1秒以内,降幅达到了80%。这篇文章,我想分享一下这次性能调优的实战经验。

背景和挑战

先说说AI手表的背景和挑战。

我们的AI手表,主要功能包括:AI语音助手、健康监测(心率、血氧、睡眠)、运动记录、消息提醒、NFC支付等。其中,AI语音助手是核心功能,用户可以通过语音问问题、设置提醒、控制智能家居等。

AI手表的硬件配置大概是:双核ARM CPU,1GB内存,8GB存储,300mAh电池。这个配置,在手表里算不错的,但和手机比差远了。

挑战主要有几个方面:

第一个是计算资源有限。AI模型需要大量的计算资源,而手表的CPU性能只有手机的几分之一。如果把大模型直接跑在手表上,根本跑不动。

第二个是内存有限。1GB内存,系统本身就要占一半多,留给应用的内存很少。AI模型动辄几百MB,根本装不下。

第三个是电池容量小。300mAh的电池,比手机小得多。AI计算非常耗电,如果不优化,续航会非常短。

第四个是实时性要求高。AI语音助手,用户说完话,希望立刻得到回应。如果等好几秒,体验就很差。我们的目标是响应时间在1秒以内。

第五个是散热限制。手表的体积很小,散热能力有限。如果CPU长时间高负载运行,会发热严重,甚至会烫伤用户。

基于这些挑战,我们需要做大量的性能调优,才能让AI手表真正可用。

第一步:性能分析

调优的第一步,是搞清楚时间都花在哪里了。

我们给系统加了详细的性能分析工具,记录AI助手从用户说话到给出回复的每个阶段的耗时。

分析之后发现,响应时间主要花在几个地方:

第一个是语音采集和预处理。用户说话之后,手表要采集音频、做降噪、做语音活动检测(VAD),然后把音频编码。这个过程大概需要500毫秒。

第二个是网络传输。因为手表的算力有限,AI推理主要在云端完成。手表要把音频传到云端,云端处理完再把结果传回来。网络传输的时间,平均在2秒左右,而且波动很大,网络不好的时候能到5秒以上。

第三个是云端AI推理。云端要做语音识别(ASR)、自然语言理解(NLU)、大语言模型生成(LLM)、语音合成(TTS)。这个过程平均需要2秒。

第四个是结果展示和播放。收到云端的结果之后,手表要显示文字、播放语音。这个过程大概需要500毫秒。

可以看到,最大的瓶颈是网络传输和云端推理,加起来占了80%的时间。要把响应时间降到1秒以内,必须从这两个方面入手。

第二步:端云协同优化

我们做的第一个大的优化,是端云协同。

以前的架构是:手表只负责采集音频和播放结果,所有的AI处理都在云端。这样的好处是手表端简单,但坏处是网络传输的延迟很大,而且完全依赖网络,网络不好的时候根本没法用。

我们改成了端云协同的架构:简单的任务在端侧处理,复杂的任务在云端处理。

具体来说,我们在手表端部署了一个轻量级的AI模型,负责:

  • 语音唤醒:检测唤醒词,比如"你好小助手"。
  • 语音活动检测:判断用户什么时候在说话,什么时候说完了。
  • 简单指令识别:识别一些常用的简单指令,比如"开始计时""设置闹钟""查看心率"。
  • 离线回复:对于一些简单的问题,直接在端侧回复,不需要联网。

这样,大部分简单的操作,都可以在端侧完成,响应时间在几百毫秒以内。只有复杂的问题,才需要传到云端处理。

端侧的轻量级模型,我们用了模型量化和剪枝技术,把模型压缩到了50MB以内,推理时间在200毫秒以内,对续航的影响也很小。

端云协同优化之后,大概有60%的请求可以在端侧完成,平均响应时间降到了2秒左右。

第三步:网络传输优化

对于需要云端处理的请求,网络传输是最大的瓶颈。我们做了几个优化。

第一个优化是,音频压缩。以前我们用的是16kHz、16bit的PCM音频,码率是256kbps。我们改成了Opus编码,码率降到了24kbps,音质损失很小,但数据量减少了90%。这样,上传音频的时间大大缩短。

第二个优化是,流式传输。以前我们是等用户说完话,把整段音频录完,再一起传到云端。我们改成了流式传输:用户说话的同时,就把音频一块块地传到云端。云端可以边接收边处理,等用户说完的时候,云端已经处理了一部分,大大减少了等待时间。

第三个优化是,预连接和连接复用。我们在手表端保持和云端的长连接,不需要每次请求都重新建立连接。而且,在用户说话的时候,就提前建立连接,等用户说完,直接发送数据,省去了连接建立的时间。

第四个优化是,弱网适配。在网络不好的情况下,自动降低音频码率,或者切换到端侧处理。这样,即使网络不好,也能保证基本功能可用,不会完全卡死。

网络传输优化之后,网络传输的时间从2秒降到了500毫秒以内。

第四步:云端推理优化

云端推理也是一个大的瓶颈,我们做了几个优化。

第一个优化是,流式识别和生成。以前我们是等整段音频都上传完,再做语音识别,再做自然语言理解,再生成回复。我们改成了流式处理:音频一边上传,一边做语音识别;识别出文字之后,立刻做自然语言理解;理解了意图之后,立刻开始生成回复。这样,各个阶段流水线处理,大大减少了总时间。

第二个优化是,模型量化和推理优化。云端的大模型,我们用了INT8量化,推理速度提升了2倍。同时,用了vLLM等推理优化框架,提高了GPU的利用率,降低了单请求的推理时间。

第三个优化是,缓存常用回复。对于一些常见的问题,比如"今天天气怎么样""现在几点了",我们把回复缓存起来。如果用户问的问题和缓存中的匹配,就直接返回缓存的结果,不需要调用大模型。我们还做了语义缓存,不只是精确匹配,语义相似的也可以命中缓存。

第四个优化是,意图预判。在用户说话的过程中,我们就开始预判用户的意图。如果预判是某个常用意图,就提前加载对应的模型和数据,等用户说完,直接处理。

云端推理优化之后,云端推理的时间从2秒降到了500毫秒以内。

第五步:端侧性能优化

除了端云协同和网络、云端的优化,我们还对手表端的性能做了优化。

第一个优化是,CPU调频。根据当前的负载,动态调整CPU的频率。处理AI任务的时候,提高频率,保证性能;空闲的时候,降低频率,节省电量。我们还根据任务的类型来调整频率,比如语音唤醒用低功耗模式,AI推理用高性能模式。

第二个优化是,内存管理。因为内存有限,我们做了精细的内存管理。AI模型只在需要的时候加载到内存,用完就释放。不常用的模型,存放在闪存里,需要的时候再加载。我们还做了内存压缩,把不常用的内存页压缩,腾出更多空间。

第三个优化是,语音预处理优化。语音的降噪、回声消除、VAD等预处理,我们用了NEON指令(ARM的SIMD指令)来优化,一次处理多个采样点,速度提升了3倍。

第四个优化是,UI渲染优化。手表的屏幕小,但UI渲染也会占用资源。我们优化了UI渲染流程,减少了不必要的重绘,用了硬件加速,让界面更流畅,也减少了CPU的占用。

端侧优化之后,端侧的处理时间从500毫秒降到了200毫秒,同时功耗也降低了。

优化效果

经过以上这些优化,AI手表的性能有了质的飞跃。

响应速度方面:AI助手的平均响应时间,从5秒降到了1秒以内。其中,简单指令的响应时间在300毫秒以内,复杂问题的响应时间在1秒左右。用户体验提升了很多,基本做到了"说完就有回应"。

续航方面:因为端云协同和CPU调频等优化,续航从原来的8小时提升到了24小时,满足了一整天的使用需求。

内存方面:峰值内存占用从800MB降到了500MB,系统不再因为内存不足而卡顿。

发热方面:CPU的平均使用率从70%降到了40%,机身温度明显降低,不再有发烫的问题。

总的来说,优化之后的AI手表,终于达到了可以日常使用的水平。

一些经验总结

这次AI手表的性能调优,我总结了一些经验。

第一,可穿戴设备的优化,要从端、网、云三个层面一起入手。只优化一个层面,效果有限。需要端云协同、网络优化、云端推理优化、端侧性能优化一起做,才能达到最好的效果。

第二,流式处理是降低延迟的关键。无论是音频上传、语音识别,还是回复生成,都要尽量流式处理,让各个阶段流水线工作,而不是等一个阶段完全结束再开始下一个。

第三,端侧轻量级AI很重要。在可穿戴设备上,不可能所有任务都依赖云端。必须在端侧部署轻量级的AI模型,处理简单任务,既降低延迟,又节省电量,还能在离线时使用。

第四,性能和功耗要平衡。可穿戴设备的电池有限,不能只追求性能而忽略功耗。要在性能和功耗之间找到平衡点,用动态调频、按需加载等技术,既保证性能,又控制功耗。

第五,持续监控和优化。性能优化不是一次性的工作,需要持续监控,发现新的瓶颈,持续优化。随着功能的增加,可能会出现新的性能问题。

写在最后

AI手表是一个很有前景的产品方向,但也是一个挑战很大的领域。硬件资源有限,但用户的期望很高。要做好AI手表,需要在性能、功耗、体验之间找到平衡。

通过端云协同、网络传输优化、云端推理优化、端侧性能优化,我们把AI助手的响应时间降了80%,终于达到了可用的水平。

希望这篇文章能给做可穿戴AI设备的朋友一些参考。如果你也有性能调优的经验,欢迎在评论区交流。