搞了大半年工业AI边缘部署,从激光打标的零件识别,到产线尾端的表面缺陷检测,再到设备状态监测,前前后后折腾了不少项目。今天不聊理论,纯聊实践。想把模型从GPU服务器搬到车间里的边缘设备上,看着很简单——容器一拉、模型一导、服务一起,完事。真做起来才知道,这条路每一步都有坑,有些坑是文档里没有的,有些坑是踩完还得爬出来重新设计的。这篇东西就是把这些坑一个个摊开讲,让准备入坑的少走点弯路,已经在坑里的也可以对照一下是不是遇到了同样的问题。
1. 为什么要在边缘跑AI,而不是把图传回服务器
1.1 工业现场那个“不得不边缘”的痛点
最开始做工业AI项目时,我的思路是典型的“中心化”思维:现场相机拍图,通过网络传给机房里的服务器,跑完推理把结果传回来。这个方案在演示环境跑得飞起,一到真正的车间就翻车了。
首先是延迟。我们的表面缺陷检测要求从拍照到输出结果控制在200毫秒以内,而产线节拍是固定的,传送带不会等你的算法。现场到机房虽然只是几百米光纤,但经过交换机、防火墙、网关,再加上排队,实测网络往返经常到50到100毫秒。如果用的是无线网络,抖动更离谱,高峰期丢包重传,端到端延迟能飙到500毫秒以上。产线那边等不了,一卡就是停机。
其次是带宽。工业相机分辨率动辄500万像素、1200万像素,一张图少说几兆。一条产线8个工位,每个工位每秒拍2张,算下来每秒要传几十兆甚至上百兆的数据量。车间的网络基础设施大多不是按这个量级设计的,地沟里的网线屏蔽层老化,配线架接触不良,摄像头的数据和PLC的控制报文在同一张网里抢带宽,搞到最后控制信号都受影响,电气工程师直接找上门来。
还有数据隐私和合规的问题。有些产线涉及工艺参数、产品良率数据,客户明确要求数据不能出车间。有些出口型工厂对数据出境有严格约束。不管从哪个角度讲,把图像数据放在现场处理都比传回中心更让客户安心。
所以做工业AI边缘部署不是技术潮流,是现场倒逼出来的方案。图在哪儿拍的,就在哪儿算,只把结果——比如缺陷类别、位置坐标、置信度——上报到上位机或MES系统,这样网络压力小,延迟低,也能满足数据本地化的要求。
1.2 边缘部署的边界在哪里,先想清楚再动手
说“边缘部署”,但边缘到底在哪儿?这决定了你选什么硬件、装什么系统、怎么布服务。
我在项目里把边缘部署分了三个层级。最靠近设备的是嵌入式级别,就是那种贴在设备本体上的小盒子,用ARM芯片或低功耗加速卡,负责单点检测,比如某个关键轴承的振动分析。再往上一层是工位级边缘节点,一般是一台无风扇工控机或者加固型的边缘计算盒子,负责一个或几个工位的视觉检测,处理多路相机、多套模型。第三层是车间级边缘服务器,放在车间机柜里,聚合多台工位节点的结果,负责模型更新下发的管理,有时候也承担一些计算量更大的融合推理。
这个层级划分不是拍脑袋,而是根据数据流、可靠性要求和算力需求自然形成的。越是靠近设备端,环境越恶劣,但数据量越少、实时性要求越高;越往上,环境越好,但模型管理、版本迭代的复杂度反而集中在这里。
我见过不少人上来就买一台高配GPU工控机,打算一个设备搞定所有工位的检测任务。算力看着足够,但一落地就遇到问题:GPU电源要求高,现场电压不稳直接重启;设备体积大,产线边上根本没有安装位置;更麻烦的是单点故障——GPU工控机一旦宕机,整条产线所有工位一起停,这在生产上是不能接受的。所以我的原则是:能用小设备分散部署,就不要用一台大设备集中扛。宁可多花一点管理成本,也要把故障爆炸半径控制在单个工位以内。
2. 硬件选型与算力评估:纸上算力和实际跑力的差距
2.1 算力评估的三种错误姿势
硬件选型是第一个大坑。前面说到的算力评估,绝大多数人是靠厂商给的理论算力数字来拍板,实际上这玩意儿和真实性能之间隔着一整个“可落地性”的距离。
第一种错误姿势是只看TOPS或者TFLOPS。TOPS是理论整数算力,TFLOPS是理论浮点算力,但这两个数字是在特定条件下测出来的:模型大小固定、内存带宽充足、算子全部命中加速器优化库。真实工业模型跑起来,算子五花八门,有些算子(比如动态shape相关的)在加速器上根本没有优化实现,会掉回CPU跑,性能瞬间垮掉。我遇到过一个情况,一台设备标称算力是另一家的3倍多,但跑同一个YOLO变体模型,帧率却只有对方的六成。原因就是模型里有好几个自定义算子,在标称算力高的那台上全部走的是通用回退路径。
第二种错误姿势是用GPU的显存容量来判断能跑多大模型。工业模型普遍不大,一两个GB的显存已经非常充裕,真正卡脖子的往往是内存带宽。两个相同显存量的设备,因为内存类型和位宽不同,实际推理吞吐可能差出两三倍。内存带宽不够的时候,数据搬运时间占大头,GPU算得再快也被“喂不饱”。
第三种错误姿势是拿公开跑分数据来套自己的业务场景。公开跑分模型通常是ResNet、YOLO这些经典结构,而工业场景经常是带自定义分支、多任务输出的模型。一个模型连检测带分类带回归,输出头十几个,部署到边缘设备上算子组合和公开基准完全不同,跑分根本不具备参考价值。
2.2 折腾下来我觉得靠谱的选型路径
经过几次翻车,我后来总结出一个相对靠谱的选型路径。
第一步,先把训练好的模型在PC上用CPU做一次基准测试,记录单帧推理延迟和内存占用。这个数据作为基线。
第二步,锁定两三款候选边缘设备,把模型转换到对应的推理框架,直接用真机跑,测三个指标:单帧延迟(p50和p99都要看)、吞吐量(批处理下的最大帧率)、内存峰值。这里特别强调p99,p50好看没有用,工业现场要的是稳定。
第三步,带数据、带场景做72小时持续运行测试。这一步最容易被忽略,很多设备在持续高负载下会降频、过热保护、内存泄漏,跑两天后延迟悄悄升高,不实测根本发现不了。
我在某个项目中需要跑一个带Transformer模块的轻量模型,候选设备A是ARM CPU平台,候选设备B是带NPU的x86平台。纸上算力A远不如B,但实测下来A因为内存在同一个封装内,数据搬运开销小,单帧延迟反而更稳定;B的NPU对Transformer的算子支持不全,部分层回退到CPU,导致延迟波动很大。如果当时只看理论算力就选B,后面上线绝对要返工。
2.3 别忽视的功耗和散热账
工业现场的功耗和散热问题是选型时最容易忽略、实施时最要命的。
边缘设备通常装在工业控制柜里,柜内空间狭小,散热条件差。我遇到过装了独显工控机后,柜内温度直接升到65摄氏度,设备频繁降频,推理延迟从80毫秒一路涨到300多毫秒,产线端误报率明显上升。后来不得不加装柜内风扇和空调,整个改造又多花了两周。
功耗预算也要提前算。客户配电柜给新设备留的回路可能只有多大的余量,你一台设备峰值功耗高,就会和柜内原有的PLC、变频器抢电。变频器启动时电压跌落,边缘设备电源电压瞬间低于工作范围,直接重启。这个问题在大型设备启动时特别常见。
所以我的建议是:在选型阶段就把“平均功耗、峰值功耗、工作温度范围、散热方式”这四个参数和客户现场实际情况拉一遍清单。无风扇被动散热设备在粉尘环境下可靠性好很多,虽然理论性能不如主动散热的,但实际工业场景里,稳定远比峰值性能重要。
3. 模型转换与量化:精度掉点的重灾区
3.1 从训练框架到推理框架的转换流程
模型训练和边缘推理基本上处于两个世界。训练世界里,框架版本天天变,算子实现日新月异;推理世界里,一切都是静态的、确定性的、受控的。从训练到部署,中间要过一段“翻译”的过程。
以我常用的一个流程来说:训练在PyTorch下完成,导出为ONNX,再转换到目标推理框架的专有格式。听起来就是两条命令的事,实际上每一步都可能有兼容性问题。
PyTorch导出ONNX时,最容易出问题的是动态shape。训练时你输入图片尺寸是固定的640乘640,但模型里某个模块在导出时如果沿用了动态维度,ONNX图里就会带动态shape标记,转换到某些推理框架后会触发不支持的分支路径。我习惯在导出前先把模型固定到静态shape,也就是在导出脚本里用dummy input跑一次并指定输入张量的形状,这样导出的ONNX在转换时省掉大量麻烦。
第二个问题是自定义算子。工业模型经常有自己写的检测头、后处理层,这些自定义层在导出时会变成一系列基础算子的组合,但组合方式往往不是推理框架优化的目标形态。这个时候需要手动改导出脚本,把一些计算过程合并成推理框架能识别的算子,或者在推理框架里注册自定义算子实现。两种方案我都试过,合并算子性能更好但工作量不小,注册自定义算子灵活但后续维护麻烦。没有银弹,只能在具体项目里权衡。
3.2 量化那几天我反复试的几件事
模型量化是边缘部署的必经之路。边缘设备的算力有限,Int8量化后推理速度通常能提升一两倍,但对检测类任务来说,量化带来的精度损失可能直接决定项目能不能用。
我踩过最大的坑是没有意识到数据分布对量化效果的影响。量化说白了就是把连续浮点数值映射到有限的整数区间,这个映射的准确度取决于量化阶段统计到的激活值分布。如果你的标定数据只有正常工况下的图片,而现场实际会有逆光、强噪声、不同光照方向的图片,这些没见过的数据分布会让量化后的模型在边界场景上“精准崩溃”。
后来我的做法是:收集至少覆盖一周生产周期的真实数据做标定集,故意加入低对比度、过曝、遮挡等极端样本。量化后先在和现场同型号的摄像头下做灰度直方图对比,再跑一遍完整的精度验证集。这个过程麻烦,但能减少项目上线后的大量返工。
还有一个坑是偏置和缩放因子的处理。某些推理框架在量化时不做精细的偏置矫正,导致某些层的输出分布严重偏移。我实测当中出现过量化后某些类别的召回率掉到百分之四五十、模型对暗色目标直接失明的情况。当时的排查思路是用推理框架自带的逐层调试工具,把每一层浮点和量化版本的特征图打印出来做分布对比,找到偏差最大的层,针对性地在标定集中增加那类目标的样本,重新量化后才把精度拉回来。
3.3 精度验收的验收标准与数据准备
部署前一定要先定好精度验收标准,不然“模型能用吗”这个问题永远扯不清。
我在项目里通常定这么几个指标:各类别的查准率、查全率,综合的mAP,以及和原浮点模型对比的精度退化幅度。精度退化幅度这个指标特别重要,我用的是一个“相对退化率”的算法:在同样的验证集上,量化模型的mAP除以浮点模型的mAP,工程上一般要求这个比值不低于某个阈值,比如0.95。如果低于0.9,我就认为是量化方案本身有问题,而不是验收标准太严。当然,不同任务要求不同,关键缺陷类别要单独设卡,比如产品表面裂纹的漏检率必须为零或者接近零,在采标定数据时就要重点保证这一类样本的数量和多样性。
数据准备这块我多说一句。光是按目录放好图片不够,要梳理好数据来源、拍摄条件、标注版本。我在项目里踩过标注版本混乱的坑,训练用的标注和验收用的标注不是同一个版本,导致整个精度评估结果都是错的,白跑了两个星期才发现问题。后来我用带哈希校验的清单来管理每一版数据集,每次评估前先核对哈希,确保训练集、标定集、验证集三者的标注版本一致。
4. 推理框架与运行时环境:版本地狱与依赖泥潭
4.1 框架选择的取舍逻辑
推理框架的选型是整个边缘部署里牵一发动全身的决定。选完框架基本就锁死了硬件平台、算子支持范围、后续优化的空间。
我的选择逻辑第一看算子覆盖率。把自己模型的算子清单拉出来,对着框架的支持矩阵逐项核对,不只是看“支持不支持”,还要看实现方式。有些框架对某个算子只有基础实现,性能不行;有些框架对某个算子有多版本实现,其中某些版本只支持特定输入布局。算子覆盖率不够的框架,性能再好也要慎重,因为你不知道下一个模型会不会就踩到不支持的算子上。
第二看模型转换工具的成熟度。有些框架的转换工具报错信息非常反人类,遇到不支持的算子直接甩一个“unknown op”,你根本不知道问题出在哪个层。有些框架能给出清晰的图结构诊断信息,这就省了很多时间。
第三看社区活跃度和版本迭代速度。工业项目往往要维护两三年,框架选了小众的,遇到bug找不到人问,就只能自己硬啃。我吃过这个亏,后来宁可选大厂维护的框架,至少在版本兼容性和文档完整度上有保障。
4.2 运行时依赖的干净环境构建
边缘设备的运行环境比服务器环境复杂得多。同一个系统里可能既要跑算法服务,又要跑厂商的SDK,还要和PLC通信。依赖冲突是常态。
我常用的思路是:每个算法服务单独打包成镜像或独立的运行目录,自包含所有依赖,不依赖系统全局安装的库。在系统层面保持最小化,不装多余的软件包。把框架运行时、加速库、驱动版本固定下来,不跟随系统升级。这套做法的核心逻辑是让部署环境和开发环境尽量一致,同时让每个服务可以独立升级、回滚、卸载。
依赖打包的一个坑是动态库版本冲突。两个推理服务各自依赖同一个加速库的两个不同版本,如果它们在同一个系统目录下能互相覆盖,就会出现“装A服务把B服务弄崩了”的问题。我的解决办法是为每个服务创建独立的运行目录,把相关的动态库放在服务自己的目录下,通过设置环境变量指定加载路径,避免使用系统全局路径。具体配置方式不同系统有差异,但思路是一样的:隔离、自包含、可回滚。
4.3 模型加载与显存管理的坑
模型加载看起来是小事,实际上坑很多。我遇到过的典型问题是模型加载速度慢。一个几十MB的模型文件,在边缘设备上加载可能要十几秒甚至几十秒。如果是正常的服务启动,这倒无所谓;但如果服务在运行中因为异常崩溃而自动重启,每次重启都先等几十秒加载,产线那边就是好一会儿的停摆。
我的处理方案是把模型加载做成异步方式,服务启动后先加载模型,加载完再对外宣告“可用”。同时把模型文件放在本地高速存储上,避免从网络共享盘加载,网络一抖加载时间就没谱了。另外,模型文件在做代码升级时要保证原子替换,不要让服务跑到一半发现模型文件还没传完,那会导致加载直接失败。
显存管理也是工业部署里经常被忽视的问题。边缘设备显存本来就小,吃紧是常态。我在做多路视频分析时遇到过显存碎片化导致分配失败的问题,现象是跑了半天后某个新接入的视频流无法创建推理上下文,但其他路一切正常。后来查下来是模型版本更新后,激活函数的实现变了,内存占用模式也跟着变,导致显存碎片化加剧。我把推理引擎的显存分配策略从固定大小改成可增长模式,并在每次模型加载后显式地做一遍内存整理,这个问题就没有再出现过。
5. 工业现场部署:从实验室到车间的那段路
5.1 设备形态与安装方式的选择
实验室里设备随便放,到了车间,安装约束多到超出想象。
首先是空间。产线设备旁边往往只有一根立柱的位置,或者一个狭窄的电气柜。我见过工位旁边只剩20厘米宽的空隙,常规尺寸的工控机根本塞不进去。后来用了导轨安装的嵌入式设备,才勉强放下。选型阶段最好提前拿到现场安装位置的尺寸图,不要到货了才发现装不下。
其次是防护等级。车间的粉尘、油雾、水汽对设备是致命威胁。普通机箱的工控机在粉尘大的环境里跑几个月,风扇就堵满灰尘,散热效率直线下降,CPU温度飙升。我在一个打磨车间的项目里,设备用了普通机箱,两个月后频繁死机,拆开一看散热鳍片被金属粉尘糊死了。后来全部换成无风扇密闭机箱的宽温设备,问题才解决。对粉尘环境,无风扇设计不是可选配置,是刚需。
再有是安装方式。直接挂在振动大的设备本体上,机械硬盘会提前报废。虽然现在边缘设备大多用固态存储,但振动还有可能造成接口松动、连接器脱落。安装时能用减震支架就尽量用减震支架,电缆做好固定和应力释放,防止长期振动导致网口插头接触不良。
5.2 网络、断电与断网场景下的容错设计
工业现场的网络状况比想象中脆弱得多。车间的大功率设备启动瞬间,电网电压波动就能让普通交换机重启;施工误挖断光纤的事我也遇到过;Wi-Fi信号在金属设备丛林中衰减剧烈,根本不适合做关键业务链路。
网络容错的核心原则是:边缘设备必须在断网环境下保持正常工作。推理、判定、结果输出这些核心功能全部在本地完成,断网只影响向中心上报数据。我的设计是本地持久化一个结果队列,断网时结果先写入本地存储,网络恢复后自动补传。这样产线不会被网络问题卡死。
断电是另一个必须面对的场景。工控机不像PLC有专门的断电保持策略,瞬间断电经常导致数据库损坏或模型文件损坏。我的做法是给边缘设备配置带掉电保护的电源模块,同时在软件层面做事务性写入,关键文件先写临时文件再原子重命名,最大限度避免断电导致的数据损坏。另外,启动脚本要有自动恢复逻辑:系统重启后自动拉起服务,如果检测到上次运行异常退出,就自动清理残留临时文件再重新加载。
有个经验值得分享:断电重启后的系统时间可能会错乱,一些依赖时间戳的日志和数据上报会出问题。我在启动脚本里加了网络时间同步逻辑,设备一开机就先同步时间,再启动业务服务,避免时间错乱影响后续数据。
5.3 长时间运行的稳定性问题
工业设备是7乘24小时常年不关机的,这和实验室跑几个小时完全是两回事。
长时间运行最容易出现的问题是内存泄漏。某个版本的预处理库在处理图像时没有释放临时缓冲区,跑两天后内存占用从300MB悄悄涨到3GB以上,服务最终被操作系统杀掉。这种问题靠肉眼很难发现,我的办法是在环境里做内存监控,跑一个巡检脚本,每十分钟记录一次内存占用,连续记录一周,然后把数据画成曲线。曲线呈持续上升趋势的,基本就是内存泄漏。
运行半年后的性能退化也值得一提。一方面存储芯片的剩余空间越来越少,影响临时文件读写;另一方面长时间运行后日志文件、历史结果越攒越多,磁盘碎片化加剧。我在部署规范里明确要求:日志按天滚动,最多保留30天;数据文件定期归档清理。这些运维细节不做,设备会随着时间推移悄悄变慢,最后变成“性能问题”被甩到算法头上。
还有系统自动更新的问题。Windows系统如果开了自动更新,深夜重启一次,产线的算法服务就断了,第二天早上一看,设备是亮的,软件全没起来。我的处理方式是彻底关闭自动更新,所有系统补丁和软件更新都安排在计划停机窗口内手动执行。这个操作可能听起来很基础,但确实有项目栽在这上面。
6. 性能优化与系统调优:让推理速度再快一截
6.1 预处理与后处理的并行化
很多人优化推理性能时只盯着模型本身的执行时间,却忽略了预处理和后处理。
工业视觉检测任务的预处理通常包括图像解码、尺寸缩放、颜色空间转换、归一化。后处理包括阈值筛选、非极大值抑制、坐标转换、结果格式化。这些操作在CPU上执行,经常会变成推理速度之外的第二个瓶颈。我做性能分析时先画出整条链路的瀑布图,看每一段占了多少时间,然后针对性地优化,而不是上来就调推理引擎。
一个典型例子是图像解码。500万像素的彩色图,用CPU解码耗时可能比推理还高,如果把相机输出直接改成灰度图像,或者用支持硬件解码的采集方案,CPU时间会显著减少。另一个例子是后处理里的大循环操作,用Python的for循环处理几千个检测框,耗时夸张,换成向量化操作后速度提升一个数量级。
更有效的做法是把预处理和后处理放到单独的线程池里做,不和推理争抢同一个核心。我用过双缓冲队列模型:采集线程把图像投进队列,预处理线程消费并处理,推理线程接到处理后的张量执行推理,后处理线程拿输出做结果整理。流水线模型的核心是让每个阶段都能并行工作,充分利用边缘设备的CPU多核能力。
6.2 推理引擎的运行参数调优
推理引擎不是装上就能跑的,参数调优的空间往往很大。我总结下来,不少性能和稳定性问题都能归结到推理引擎参数选择不当。
首先是批处理大小。工业应用多数是单帧请求模式,一次只能处理一帧,批处理一就是默认值。但在某些场景下,比如离线分析一批历史图片,或者把多路视频帧凑成一个小batch一起推理,吞吐量会有明显提升。但batch太大会增加单次响应的时延,实时性要求高的场景要权衡。
其次是线程数设置。推理引擎的CPU线程数默认值不一定适合边缘设备。多核CPU并不意味着线程越多越好,我试过把线程数从默认值翻倍后,反而因为线程切换开销导致p99延迟上升。正确的做法是实测几条线路下性能,根据延迟和吞吐曲线选一个折中值。考虑到设备上可能还跑着采集和通信服务,推理线程数不宜独占所有CPU核心。
再有一个不能忽略的是推理引擎预热。模型加载后先跑若干次空推理,让内存池、算子缓存、线程池都进入稳定状态,之后再开始正式对外服务。这个操作可以显著降低前几次请求的超常延迟。我的经验是预热次数不用太多,十几次足够了,关键是每次推理的输入shape要和正式运行时保持一致。
6.3 整链路时延分解与瓶颈判断
优化性能如果只盯着推理那一小段,是不够的。我需要对整个链路做时延分解,把每一段的耗时拆开看。
我在项目中记录这几个关键时间戳:图像采集完成、图像开始预处理、预处理完成、推理开始、推理完成、后处理完成、结果发送完成。把这些时间戳的差统计出来,画时间戳时间线图,瓶颈一目了然。有一次我们以为模型推理是瓶颈,结果拆分后发现图像采集接口的阻塞等待占了将近一半的时延。原来是相机触发模式设置错了,相机在等外部触发信号,而触发信号线接触不良,导致采图严重超时。这种问题如果不做链路分解,根本不知道去哪里找。
分解完之后再看哪些环节可以并行、哪些可以异步、哪些可以缓存。比如相机参数固定就,预处理参数不变,那么归一化用的均值和标准差可以预先算好;类别的显示名称和颜色映射可以预生成字典,不用每次推理后都重新算一遍。这些都是小细节,但积少成多,整条链路的时延就能从几百毫秒压到几十毫秒级别。
7. 常见问题与排查技巧实录
7.1 高频问题速查表
把项目中遇到的高频问题整理成一张速查表,遇到现象直接查原因,效率高很多。
| 问题现象 | 可能原因 | 初步排查方向 |
|---|---|---|
| 推理延迟越来越高,最终卡死 | 内存泄漏 | 查看内存曲线,检查临时缓冲区释放逻辑 |
| 量化后某类目标全部检测不到 | 标定数据分布不覆盖 | 补充该类样本重新量化 |
| 模型加载几十秒,重启恢复慢 | 模型文件过大或存储性能差 | 换本地固态存储,加载过程异步化 |
| 设备运行中自动重启 | 电源不稳或过热 | 查电柜电压日志和设备温度曲线 |
| 断网后服务崩溃 | 代码里对网络异常没有容错 | 检查上报逻辑是否做了断网保护 |
| 服务启动后cuda不可用 | 版本驱动和加速库不匹配 | 核验固件驱动版本对应关系 |
| 同一模型不同设备精度不一致 | 预处理参数不相同 | 统一预处理代码和参数配置 |
7.2 排查思路:先分层再怀疑
工业AI系统从底层往上分,至少有硬件层、驱动层、推理层、业务逻辑层四层。遇到问题,我的排查思路是先分层定位,不急着改代码。
具体来说,先确认硬件是不是正常,比如电源指示灯、设备的CPU温度、存储剩余空间。再看驱动,用测试程序跑一个最简单的推理,确认加速设备能用。然后确认推理层,跑一个官方示例模型,比较一下运行时间是否正常。最后才检查业务逻辑层,是不是自己的代码出了问题。
这个顺序看起来简单,但真的能节省大量时间。我遇到过一个问题现象是“某个缺陷类型检测率突然下降”,一开始以为是模型老化了,折腾了一天重新采集数据重新训练。后来用分层排查法发现,是相机白平衡参数被误改,导致所有图像颜色偏色,模型在偏色图像上的识别率自然下降。先从几乎不会被怀疑的底层硬件排查,反而更快发现问题。
另外我坚持所有关键操作都要留日志。日志不用多,但要留关键节点:服务启动、模型加载完成、首次推理、异常退出、网络切换。我在项目里养成一个习惯,就是现场出现了说不清的问题,第一件事去翻日志,看到“首次推理前又加载了一次模型”这种诡异操作,基本就能定位到初始化逻辑有重复调用的bug。
7.3 几个我觉得特别值得记住的细节
最后分享几个小细节,都是实际项目中积累出来的。
第一个是不要在生产环境用未经测试的库版本。边缘部署涉及好几个层级,各个依赖库的版本之间经常是互相锁定的。升级任何一个库之前,先在测试设备上把整个链路回归一遍,不要信“这个版本只是小改”。我做过的项目里,有一次升级了图像库的小版本,低版本和高版本的默认像素格式不一致,导致所有模型输入的通道顺序反了,模型推理结果完全乱套。如果不回归测试就上产线,后果很严重。
第二个是配置文件要带版本号。边缘设备多了之后,远程升级配置是家常便饭,不带版本号的配置文件一旦被误覆盖,你根本不知道设备跑的是哪一套参数。我给所有配置文件都加了版本字段和哈希校验,加载时先校验,不一致就报警。这个习惯救过我很多次。
第三个是要预设远程运维通道。工业设备分布在车间各个角落,出问题总不能每次都拎着显示器去现场。我在部署时会给每台设备预留一个远程管理接口,只对运维网络开放,不对产线网络开放。这样才能在问题发生时第一时间远程查看状态、拉日志、做初步诊断。这不算什么新功能,但把远程通道变成一个可复用的基础设施,实际运维效率能提升一个量级。
说到最后,我的体会是工业AI边缘部署这件事,真正难的不是某一个单点技术,而是把模型、硬件、环境、运维、现场条件全部捏在一起。每一个环节单独看都很清楚,组合起来却充满了细节上的摩擦。做这件事,耐心比聪明更重要,踩坑之后能成体系地沉淀成方法,才算真正从零到一走了过去。希望这篇分享能让后面的人少走一点弯路。