写这篇东西的起因,是我最近拆了几个机器人团队的推理方案,发现一个特别扎眼的现象:demo 阶段大家跑的模型都挺漂亮,一旦走到真实场景、装满传感器、背着小电池在厂房或者马路上跑起来,问题就全来了。帧率掉一半?算力卡在异构核之间传数据?模型在 PC 上精度挺高,上了端侧 INT8 掉点掉到没法看?这些问题其实都指向同一个原点——端侧推理不是“把模型塞进设备”这一步,而是一笔从头到尾的工程账。今天我想把这笔账掰开揉碎聊一聊,尤其是站在“物理AI”这个方向(机器人、自动驾驶、无人机这类要跟真实世界打交道的系统),聊聊为什么全栈自研是很多团队绕不开的最后一段路。
这篇文章适合正在做端侧部署和嵌入式 AI 的工程师、机器人公司里负责算法和平台的研发,以及被“要不要自研”这个问题困扰的技术管理者。我会把端侧推理的算力、功耗、时延、部署、维护这几本账分开算,再把全栈自研的取舍点和实现路径讲清楚,最后会拿出我在实际项目中遇到的拦路虎和排查记录,给一份可以直接抄作业的避坑清单。
1. 先说清楚什么是“端侧推理”和“物理AI”
1.1 物理AI对推理的诉求,跟传统端侧AI不太一样
很多人一听到端侧推理,第一反应是手机相册里的分类、语音助手、人脸解锁,或者工业质检里面跑个缺陷检测。这类应用的共同特点是:输入比较规整、环境可控、任务相对封闭,一个模型检测完东西,结果输出到屏幕上,用户看一眼就行。但物理AI 是另一个物种——模型的输出不是给“人看”的,而是直接送去控制电机、转向、机械臂,甚至决定一辆在开放道路上行驶的车该不该刹车。这就要求推理结果不仅正确,还要在严格的时间窗口内以可预期的方式送达。
拿一个典型的轮式机器人举例:视觉感知要从一对双目相机里实时恢复深度,再叠加障碍物检测和语义分割;融合模块要把视觉、惯性测量单元、轮式里程计的数据揉在一起做状态估计;规划模块拿到最新的障碍物信息以后要实时算出一条可执行的轨迹。整个链路从传感器采到数据,到控制指令发出,业界通常在 50 毫秒到 100 毫秒的级别完成一个周期。如果任何一段推理选择把数据传到云端、等结果再传回来——好一点的公网延迟 50 到 100 毫秒,加上排队和抖动,大概率整个系统会变成“睁眼瞎”。所以端侧推理不是某个技术潮流逼出来的选择,而是物理世界给的一条硬约束:感知、决策和执行必须在设备内部闭环。
这也就是为什么我在文章开头说这是“工程账”——对于物理 AI 系统,端侧推理不是跑分软件里一个数字,而是一个要跟电池容量、散热结构、物料成本、开发人天逐项妥协的工程决策。每一个技术选型背后,都有一笔实打实的成本和收益在博弈。
1.2 从业者视角:为什么先算账,再谈选型
跟不少做算法的朋友聊天,我发现一个共同的思维惯性:先把模型精度刷上去,再想怎么压到端侧。这个顺序在传统AI 项目里问题不大,但在物理 AI 领域,往往会让你在后期付出巨大的返工代价。我举个例子,你花了两周训练了一个高精度的语义分割模型,Flops 好看,mIoU 也漂亮,结果到了端侧芯片上一看,单帧推理要 120 毫秒,功耗吃掉了整个系统预算的一半。这时候你再回头看,能做的选择就非常被动:要么砍模型结构重训,要么花大力气做蒸馏和剪枝,要么换更贵的芯片把 BOM 成本拉上去。
比较健康的思路是倒推:先想清楚最终产品的外形、电池、成本、工作环境,再反推需要多大算力、多少内存带宽、什么级别的时延;然后把任务拆成“哪些必须端侧”、“哪些可以降级”、“哪些必须冗余备份”,再回头设计模型和选型。
我自己在实际项目中的体会是,物理 AI 的推理链路不是单点极致,而是整条链路的最差段决定体验。所以在后文里我会有意识地用“链条”而不是“组件”的视角来拆解每一笔账,这样更接近真实工程里的场景。
1.3 给不同读者的一句话导航
如果你是做嵌入式开发的,可以重点看第 2 章和第 4 章,那里有量化、算力、内存带宽的具体计算方法和坑;如果你是算法工程师,第 3 章关于模型结构和推理引擎的对接会比较有参考价值,帮你理解为什么“模型能跑”和“模型能跑好”之间隔着一层算子优化;如果你是团队管理者,第 2 章的账本和第 5 章的 ROI 计算会更直接地告诉你自研的边界在哪里。
2. 端侧推理的工程账:五个账本逐一算清
2.1 算力账:先别急着看 TOPS,先算有效算力
很多芯片厂商的 PPT 都喜欢讲“我这颗芯片有 XX TOPS”,听起来唬人,但实际到物理 AI 场景里,最该看的是“有效算力”——在跑你真实的模型组合、真实的数据流、真实的 batch size 时,到底能稳定发挥出多少。
里面有几个特别容易坑人的细节:首先是利用率。端侧芯片通常由 CPU、GPU、NPU、DSP 异构组成,你的网络不可能每一层都是统一的张量算子,卷积、矩阵乘可以交给 NPU,但遇到过大的动态形状算子,或者大量元素级操作,经常得切回 CPU 或者 GPU。这一切换,数据搬运和同步开销就上来了。其次是有没有考虑多模型并发。物理 AI 系统往往不是只跑一个模型,视觉检测一个、分割一个、深度估计一个、雷达点云处理一个,如果所有模型都挤在一个加速器上排队,峰值算力和实际平均算力之间的差距会非常明显。
我在一个扫地机器人项目里遇过这样的换算:选型时 NPU 标称 4 TOPS,实际跑单模型能达到标称的 60% 左右,但两路摄像头图像同时输入、再加上点云聚类和路径规划,整机有效算力直接掉到标称值的 35% 以下。所以如果你问我算力账怎么记,我的答案永远是:用你最关键的三个模型串成一个最小的感知流水线,放到目标芯片上实测,看稳定帧率是多少——这个数字才是你真正用来规划产品功能的依据。
提示:不要用单模型跑分来选芯片。物理 AI 场景下,多个模型并发引起的计算资源争抢才是常态,务必按完整流水线来评估。
2.2 功耗账:算力再强,电池和散热不答应
功耗是物理 AI 最容易在立项阶段被低估的账。原因是很多团队习惯用实验室的插电环境开发,等做成产品才发现设备不是一直插着电的。以移动机器人为例,一块常见的 5000mAh 电池,标称能量大概 18 瓦时多一点,放电效率打折后按 15 瓦时算。如果你整机平均功耗做到 15 瓦,那一块电池只能撑 1 小时,这对一台商用扫地机器人或者巡检机器人来说是不可接受的。而推理引擎通常在整机功耗里占大头——NPU 满载跑到几瓦到十几瓦都很常见,再加上传感器、控制板、通信模块,整机功耗立刻被推高。
所以功耗账要这样算:先定整机功耗预算,再反推推理部分能分到多少瓦,再决定能跑多少个模型、多大分辨率的输入。这里经常要做的抉择是帧率和功耗之间的权衡。比方说,视觉感知从 30 帧降到 15 帧,算力需求几乎减半,功耗也对应下降;但如果你的底盘控制周期是 50 毫秒一度,感知 15 帧就意味着 33% 的控制周期拿不到新的感知结果,此时就得靠预测补偿,复杂度又上去了。因此,我在实际项目里通常不是定一个固定帧率,而是定义一个“最低安全帧率”,然后在这个帧率之上做功耗平滑,比如空闲时自动降低采样率,进入高危区域时再提升到最高帧率。
2.3 内存带宽账:计算可以等,但数据搬运不想等
很多时候大家只盯着 TOPS 和内存容量,却忽略了内存带宽。算力再高,如果权重和激活值搬运不过来,算力也发挥不出来。而且这笔账从来不是单独存在的:NPU 一边在做卷积计算,ISP 一边在把图像数据写进内存,CPU 一边在跑状态估计,三者在同一块带宽上抢资源。一旦带宽被打满,最直接的后果就是推理时延出现周期性抖动,帧率不稳定。这在 PC 上跑 demo 时几乎体会不到,因为 CPU/GPU 各自有大带宽显存,冲突不明显;但端侧是共享内存架构,谁多吃一口,别人就少吃一口。
我在一个无人机项目里遇到过特别典型的带宽问题:图像分辨率从 720p 提升到 1080p 之后,模型推理时延只增加了 8 毫秒,但整机端到端时延却多了 15 毫秒。排查到最后发现是 ISP 写入和 NPU 读取在同一个内存通道上互相干扰,加了 DDR 带宽负载后时延立刻回落。从那以后,我要求团队在测试带宽敏感型系统时,必须做全系统并发压测——CPU、NPU、ISP、DSP 一起转起来,看推理时延还能不能保持稳定。这也是为什么我在后面第 4 章会专门提到时延抖动问题:它往往不是某一个组件变慢了,而是共享资源被抢了。
2.4 时延账:端到端的每一毫秒都花在哪了
时延是物理 AI 项目里最容易被说清、也最难做好的指标。说它容易被说清,是因为它可以直接测:传感器曝光时刻到执行器响应时刻,中间所有环节的时间加起来,是多少就是多少。说它难做好,是因为端到端时延几乎要经过七八个环节:传感器缓存、ISP 处理、图像畸变校正、预处理、模型推理、后处理、融合、决策、控制计算、通讯总线、执行器响应。每一段单独优化都不难,但要整体压下来,必须做到链路级的调度协同。
特别要注意“排队延迟”。很多工程师喜欢看着模型单独推理的耗时来估算整机时延,这是把时间的加法想得太简单了。模型推理的耗时是在“假设输入已经就绪”的前提下算出来的,但现实中输入到了以后,可能因为前一帧还没处理完而要排队等待。排队延迟在帧率接近临界值时会突然爆炸,比如你的流水线最大吞吐是 28 帧,但当输入帧率到 30 帧时,队列就会越排越长,端到端时延从 60 毫秒跳到 150 毫秒都不是新鲜事。所以时延账要分两部分抓:一部分是纯计算耗时,另一部分是排队和同步开销——前者靠优化算子和模型结构来解决,后者靠合理的双缓冲、流水线切分和优先级调度来解决。
注意:端到端时延的瓶颈往往在“排队延迟”,而不在“单模型推理耗时”。优化单条流水线之前,先确认是否是排队导致的时延漂移。
2.5 部署协同账:一台设备没有时间给你“慢慢升级”
最后这本账,是硬件成本和软件工程成本的总和。很多团队做端侧推理有一个常见的误解:只要买一块开发板,刷个开源推理框架,烧个模型进去,就算部署完了。确实,开发板阶段的 demo 几乎都能跑通。但到了量产,事情就变成这样:你要同时适配三种不同型号的整机,每一种的外设中断号不一样;你的模型在市场推广中期要更新,但不想因为一个算子改动导致整个镜像要重新回炉;你的设备在老化的硬件上逐步出现算子行为不一致的问题。这时候你会发现,部署不是“一次性接入”,而是一套持续的变量管理。
我在评估一个方案的时候,会先把“维护这本账”列进去:一共要支持几版系统镜像?每季度有多少次 OTA 推送?升级一次模型要打通哪些链路?从模型训练到转换成端侧格式、到自动测试、到灰度发布,最短需要多少人日。全栈自研之所以在物理 AI 团队里越来越常见,就是因为这套链路如果全部依赖外部黑盒工具,每一次升级都要跟在别人后面等适配。这种账在初创期不明显,但当产品出货量到几千台、上万台,就会突然变成沉重的负担。
所以这五本账——算力、功耗、内存带宽、时延、部署协同——你用哪种组合方式记都可以,但它们一定是一起算的。单独优化任何一项,必然挤占其他几项。
3. 全栈自研不是“造轮子”,而是把最终解释权拿在手里
3.1 自研到底自研哪些层
先界定一下“全栈自研”这个词,因为在不同团队里它的含义差别非常大。
有人认为全栈自研就是模型全部自己训练,算法全部自己写;有人认为是推理引擎自己写,算子自己写;还有人认为是芯片都要自己设计。按我在机器人行业里的观察,最合理、也最划算的全栈自研,通常包含这样几个层面:
第一层是模型结构选型与蒸馏方案的自研。第三方开源模型一般都是为了通用场景设计的,直接拿来跑物理 AI 任务,容量和结构往往有冗余。自研模型结构的目标是让模型在满足任务精度的前提下,算子类型尽量规整,方便映射到端侧加速器;再配合蒸馏和量化感知训练,产出一个真正为端侧优化过的模型。
第二层是推理引擎和运行时调度的自研。开源推理引擎提供了很多通用算子实现,但通用就意味着中庸。端侧芯片的加速器通常有自己独特的指令调度方式,你得把计算图调度、内存复用、多核流水这些环节都按需求定制,才能充分压出性能。这一层是性能差距比较大的地方。
第三层是算子适配与优化的自研。这一步是最“硬核”的环节,我不是说一定要手写所有算子,而是说你要有能力和工具去分析自定义算子里的性能瓶颈,针对特定加速器做寄存器级或者内存访问级的优化,至少也要能熟练做图改写、算子融合、通道对齐这类操作。
第四层是传感器同步与整机集成的自研。物理 AI 不是“一个盒子放算法”,它要跟传感器、控制器、执行器做到时间同步,这一步往往是全栈体验里最容易被忽略、但对真正落地影响最重的一部分。
除了少数有芯片定制能力的巨头,绝大多数团队走到第 2 和第 3 层就已经足够支撑自己的核心竞争力了。把这两层做好,意味着你能从源头上控制“最后一公里”的大部分变量。
3.2 为什么开源方案到了物理 AI 场景会露怯
开源推理引擎确实很强大,例如 ONNX Runtime 这类通用框架,在服务器端和常见的边缘盒子上表现都不错。但它在物理 AI 场景里会露出三个“软肋”。
第一个软肋是内存高水位。开源引擎为了支持各种模型的动态形状,通常会预分配较大的内存池,这在摄像头固定分辨率输入、网络结构固定的嵌入式产品里是极大的浪费。物理 AI 以固定模型、固定输入为主,完全可以用静态图优化把内存占用压到极低。第二个软肋是调度策略。通用引擎很难知道你的传感器帧率和模型优先级,因此它做不到为你的实时控制任务预留算力资源,一旦后台任务触发,推理时延就会飘。第三个软肋是算子覆盖的边际成本。端侧芯片几乎每家的 NPU 指令集都不一样,模型一旦出现某个关键算子没有高效实现,开源引擎要么退回到 CPU 实现,要么用通用实现跑得很慢,而这时候你手里没有改图融合的能力,就只能干等上游适配。
类比一下,使用开源方案就像租一间精装办公室:拎包入住很快,但你没法拆墙、没法改水电、没法把机房的冷却系统做改造来满足你特别的服务器散热。对于传统办公够用,但对于需要精密环境物理 AI 系统,全栈自研更像是“工业厂房定制”——前期投入大,但后期每一堵墙、每一根管道都是为你自己的流程服务的。你真到量产爬坡的时候,会庆幸这些变量都由自己掌控。
3.3 自研过程中最应该控制的三件事
全栈自研失败的项目,我见过太多了。它们大多不是因为技术难度,而是因为三件事没控制住。
第一件是范围爆炸。一开始只是想自研推理引擎,后来被业务推着把模型结构、数据策略、OTA 系统、监控告警全都自己写了一遍,最后人天远超预期。我的建议是给自研划一条清晰的边界:以“算子性能、内存规划、调度策略”为核心,其他能标准化的东西尽量复用。
第二件是缺少基线评估。有些团队从第一天开始就冲着自己写引擎去,却从没认真想过“我到底比开源方案好在哪,好在多少”。这会导致投入产出比很难说清楚。我自己的做法是:在任何自研优化开始之前,先搭一套完整可复现的 benchmark 基线,把时延、内存、功耗、稳定性都记录下来。每一次优化,必须对比基线,必须给出变化量。没有基线,优化就成了一种自我感觉良好的行为。
第三件是忽视工具链建设。自研不只意味着写代码,更意味着调试工具、性能剖析工具、自动化测试脚本都要配齐。很多团队在引擎上花了大力气,却舍不得在 profiling 和测试上投入,最后遇到性能问题像大海捞针一样难查。关于这个我后面第 4 章会展开聊。
4. 最后一公里:落地时的拦路虎与排查实录
4.1 模型精度在端侧掉点,先查量化再查算子
这是我在几乎所有端侧项目里都会遇到的问题:同一个模型,在 PC 上跑 FP16 时精度非常满意,导出 INT8 部署到端侧后,目标的检出率掉了五个百分点甚至更夸张。
绝大多数情况发生在量化阶段。可见的坑有三个:其一是校准数据集太随便。频繁遇到有人用几十张图片做校准,而且这些图片跟真实场景的分布差异很大,导致量化后激活值的范围估算不准。其二是没有做量化感知训练。直接训练 FP32 模型,再训练后量化导出,权重和激活值的敏感度没有被显式压制。其三是个别敏感层的精度损失被平均指标稀释了。比如平均 mAP 只掉了 1 个点,但“近处行人的检出率”掉了 6 个点,这在物理 AI 场景里是会出事的。
实操中,我建议先做“分层敏感度分析”:把整个模型拆成若干子图,逐段设置成高精度和低精度,找出对输出影响最大的那几层,然后对这些层做混合精度,或者将其在计算图上拆分成更细的算子来单独量化。再配合校准数据集从正式训练的验证集里均匀抽取,并且覆盖目标场景的边角情况(逆光、夜间、遮挡、不同地面材质等),INT8 掉点通常能控制在可接受范围。
注意:量化掉点排查顺序应该是——先换校准集,再做分层敏感度分析,最后才是换量化算法。很多人一开始就调量化算法,方向常常跑偏。
4.2 推理时延抖动,排查的三板斧
帧率上不去、时延不均匀是最烦人的问题,因为这种问题通常不是由单一计算瓶颈造成的。我的排查顺序基本固定,可以概括成三板斧。
第一板斧,确认是不是带宽竞争。用 profiler 同时观测 CPU、NPU、ISP 的负载和内存吞吐,看时延飙升的时刻是否有多个模块同时大量访问 DDR。如果证实是带宽竞争,处理思路是:错开各模块的内存访问高峰,或者降低某个模块的突发访问量(比如把 ISP 的中断分散开、给 NPU 设置更友好的内存访问 pattern)。第二板斧,确认是不是中断与内核调度的干扰。实时任务在默认 Linux 内核上容易被后台任务抢占,这需要用实时补丁或隔离 CPU 核,把关键推理线程固定到独立核上,并且锁内存,避免页错误引入不可控抖动。第三板斧,确认是不是动态调频调的锅。端侧芯片的 CPU/NPU 频率通常由调频器管理,负载突然上来时,硬件提频需要几十毫秒的时间,这个时间窗口内的推理时延就会变长。解决办法是将性能模式在关键任务执行前提前锁定到高频率,或者用手动调频策略,让关键任务的频率变化曲线可预测。
这套三板斧在几个不同项目里都帮了大忙,只是每次的权重不一样。有的项目主要是带宽问题,有的优先级调度问题为主,有的则是调频太激进。把所有测量数据拉出来对比后,基本都能找到主因。
4.3 异构计算单元之间的“握手”成本
物理 AI 的推理很少是单一计算单元完成的。预处理可能在 CPU 上做,卷积主网络在 NPU 上跑,后处理的一些动态算子回到 CPU,遇到特殊算子又得用 GPU DSP 帮忙。异构计算的麻烦在于:每一段切换都涉及数据搬运和同步等待,而同步等待是最容易低效的环节。
举个例子。一个语义分割模型,输入图像 960x540,编码器部分是标准卷积,解码器里有一个我们自定义的快速上采样算子,没有 NPU 实现。最开始的做法是 NPU 跑完编码器,把特征图搬回 CPU,CPU 跑上采样,再送回 NPU 做后续融合。表面上看 CPU 上采样只花 3 毫秒,但加上“特征图从 NPU 到 CPU”的搬运和同步等待,整个过程花了 14 毫秒。解决办法是对特征图做通道方向的重排,让自定义算子在 NPU 上用若干标准算子组合近似,并用算子融合把它并入主网络。改动后,整个过程从 14 毫秒降到 4 毫秒,整机端到端时延下降了将近 10 毫秒。
这个案例给我的体会是:异构系统里的性能优化,要盯着“数据搬移和握手开销”来做文章,而不是单纯盯着某一个计算单元的耗时。很多所谓“算子优化”其实最终都变成了“减少跨单元搬运”的优化。
4.4 真实环境里模型“突然变蠢”的原因
端侧部署完成后,还会遇到一类更隐蔽的问题:模型在实验环境测得好好的,到了真实环境就时不时抽风。这不是玄学,背后通常有几个写得出的原因。
第一个原因是传感器退化。比如镜头脏了、进水汽、光线变化,都会让输入的图像分布发生漂移,模型没见过的分布一来,输出自然就不可信。应对思路是加传感器健康度检测和异常输入检测,不是所有帧都要跑推理,而是先判断输入质量。第二个原因是时序错位。物理 AI 系统对时间同步极其敏感——如果推理使用的图像是 30 毫秒前拍的,而里程计信息是 5 毫秒前更新的,它们融合出来的位置估计可能误差非常大。排查时要去检查时间戳同步与缓冲策略,确保参与融合的各路数据都对应同一个世界状态。第三个原因是模型没做“不确定性估计”。很多端侧部署只是给出一个置信度,但物理 AI 系统需要知道“我现在这个判断到底有多可靠”,如果模型过于自信,下游控制就会非常危险。
这些问题的缓解方法需要贯穿从数据采集到部署的整条链路,我不认为有什么银弹。但至少可以确定:在物理 AI 场景里,模型质量不能只看准确率,还要看“遇到分布外输入时的表现”。这个要求在端侧尤其难以满足,因为你没法像云端那样随时用大模型兜底。
4.5 一张可以抄作业的常见问题速查表
我把这些年踩过的一些高频问题整理成表,方便大家在实际项目中按图索骥。
| 问题现象 | 优先排查方向 | 常用处理办法 |
|---|---|---|
| 部署后 INT8 掉点严重 | 校准集、敏感层、量化感知训练 | 换校准集、分层混合精度、重训量化模型 |
| 推理时延不定期变大 | 带宽竞争、内核调度、动态调频 | 错峰、RT 补丁、锁核、锁频 |
| 多模型并发性能骤降 | 资源争抢、共享带宽饱和 | 错峰调度、优先级隔离、模型裁剪 |
| 端到端时延比推理耗时长很多 | 排队延迟、流水线同步 | 双缓冲、流水线切分、减小队列深度 |
| 模型在真实环境频繁失效 | 传感器退化、时间戳错位 | 输入质量检测、时间戳同步、不确定性估计 |
| 升级模型后旧设备表现不一致 | 算子回归、版本兼容 | 自动化回归测试、灰度发布、算子 golden 比对 |
这张表不是万能的,但它能帮你省掉很多“凭感觉排查”的时间。遇到新的问题,建议你把现象、假设、验证方法、结论四栏记录下来,往后的排障速度会越来越快。
5. 全栈自研的“值不值得”,是一笔可以算清的账
5.1 什么情况下一定不该自研
先讲不应该自研的情况,因为很多团队是“为了自研而自研”,这真没有必要。
如果你的产品是做固定场景、固定任务的专用设备,比如只在某个仓库固定路线上跑的 AGV,一共就三五个模型,整机出货量也只有几百台,那全栈自研多半不划算。这种情况下,开源推理引擎加成熟板卡,配上少量算子定制,完全够用。你真正的竞争力可能来自调度算法和业务逻辑,而不是推理引擎本身。自研反而会把研发资源拖进底层基础设施的泥潭,导致业务迭代变慢。同样,如果你的团队规模很小,算法人员和嵌入式人员都不足,没有专职的性能优化工程师,那我也建议优先用开源方案把产品先推出去,等痛点真实出现再来谈自研。
要知道,全栈自研的本质是“拿研发成本换边际成本”和“拿前置投入换后端可控性”。如果产品还处于求验证的阶段,这个杠杆就别轻易去撬。我在不少团队里看到过,自研引擎做了大半年,产品需求已经变了三轮,研发团队疲于应对——这就是典型的高估了自研的收益、低估了它的维护成本。
5.2 什么情况下应该坚决自研
反过来,当你的产品具备这几个特征的时候,自研的回报会非常明显。
特征一是规模量产,出货量预期在几千套以上,每套设备省下的芯片成本、电池成本、外壳散热成本都会被放大。特征二是场景复杂且持续演进,比如你的机器人要不断适应新场地、新障碍物,模型更新频率高,而且每个版本都要控制端侧性能和功耗。这时候自研的模型结构加推理引擎能让你做到“模型更新不动底层工具链”。特征三是时延和功耗要求极高,例如高速移动的无人机平台,每一毫秒的时延、每一瓦的功耗都直接决定飞控表现,通用工具很难满足你的极致约束。特征四是团队已经具备算法、嵌入式、硬件三个方向的基础力量,且愿意投一到两个季度来沉淀工具链。
我在评估一个新项目时,做的第一件事就是列一张表:把“自研可能带来的收益”逐项写出来(单位成本的下降、时延的改善、迭代的加速、风险的降低),再给每一项赋一个可比较的粗估值,跟自研需要投入的人天做对比。如果收益是投入的三倍以上,我会非常支持全栈自研。如果不满足,那我会建议先用开源方案把系统跑起来,同时选定几个高价值的算子作为切入点,做一次小规模自研试点,用真实数据来验证“性能提升”是否足以覆盖“工程复杂度上升”。
这种“渐进式自研”的路径,比一开始就追求“全栈自研、全部重写”稳妥得多,也更容易在持续迭代的过程中逐步把核心能力收回到自己手里。
5.3 最后一公里的个人建议:把“可控性”当成核心评估指标
这篇文章围绕着端侧推理的工程账和全栈自研的价值展开,最后我想回到“最后一公里”的真实含义。
从实验室到量产,从虚拟仿真到物理世界,这段路往往是整个项目里耗费心力最大的地方。它不像模型精度那样有一个漂亮的曲线,也不像跑分那样能轻易引起关注,但它决定了产品最终能不能稳定、可靠、安全地跑起来。而全栈自研在这个过程里最重要的价值,不是某些性能指标上领先了几个百分点,而是“可控性”——你能够在自己掌控的链条里定位问题、做取舍、快速迭代。当设备在客户现场遇到从未见过的光照条件,当机器人在潮湿或者多尘的环境里出现传感器退化,当新模型上线后发现老设备的行为不一致……这些场景里,你能不能第一时间分析、定位、修复,才是决定项目生死的关键。
如果让我给一个最直接的行动起点,那就是:在开始自研之前,先花两周时间把你的系统“度量体系”建好。把推理时延、帧率波动、内存峰值、功耗曲线、温度降频、模型精度等所有关键指标都变成自动化监控的一部分,让每一次改动都能有一个客观的衡量依据。有了这套度量体系,再谈自研与否,你做的每个决定都会清晰得多。这也是我从多个项目里踩坑踩出来的最大感悟。