日期:2026-07-15
某制造企业产线要在毫秒级完成缺陷判定,但车间网络不稳、部分工位甚至长期断网,无法把每一帧视频流回传云端。初版我们直接把训练好的 FP32 检测模型搬上边缘工控机,单帧推理要 180 毫秒以上,且 GPU 显存占用高、常驻进程容易被系统回收,漏检率也偏高。更现实的压力来自产线节拍:传送带节拍约 20 毫秒一帧,模型慢就意味着要在产线旁加缓存队列,一旦堆积就拖慢整条线。这个项目里,客户的核心诉求很明确:模型必须跑在断网边缘设备上,单帧判定要在产线节拍内完成,且不能因为一次 OTA 失败把整条线拖停。我们最初尝试过把模型做成云端推理加本地缓存兜底,但实测在断电工位缓存一旦耗尽就只能放行,缺陷漏过率骤升,反而比纯本地更危险。最终我们决定走"云边协同、边缘只跑确定性模型"的路线,把训练与再训练留在云端,把低延迟判定下沉到边缘盒子。
落地场景是产线摄像头实时推理:工业相机拍摄传送带上的工件,边缘盒子逐帧做缺陷判定(划痕、缺料、装配错位、表面污渍),判定结果实时上送 MES 触发告警或剔除动作,同时把缺陷图与判定结果落本地库,供班后复盘。对于网络可达的工位,边缘会把统计指标与疑难样本周期性回传云端做再训练,形成数据闭环;对于断网工位,则完全本地闭环,靠 OTA 包增量更新模型。整套推理与调度依赖我们采用的 AI 私有化部署底座的算力调度监控能力,边缘侧轻量化常驻由推理框架托管,Prometheus 指标经网关汇拢后在看板呈现吞吐与温度。上线覆盖约 6 条产线、40 余个检测工位,日均处理图像约 120 万帧。缺陷类型按工件分了约 18 类,其中划痕与缺料占投诉量的七成以上,因此我们在训练与采样阶段对这两类做了加权,确保边缘模型对高频缺陷更敏感。
INT8/FP16 量化蒸馏。 FP32 模型在边缘端既慢又占显存,直接部署不可行。我们先做 FP16 半精度导出压住显存,再用 PTQ(训练后量化)把主干量化到 INT8,并对检测头做敏感层保持 FP16 的混精策略——检测头对坐标回归敏感,全 INT8 会明显掉点。量化前用校准集跑一遍收集激活分布:
# 导出 INT8 量化模型(TensorRT / ONNX 路线)
python export_quant.py --model yolov8s_defect.pt --calib-data ./calib_2000/ --dtype int8 --sensitive-layers "detect.head" --out defect_int8.engine为弥补 INT8 带来的精度损失,我们用蒸馏把大模型(teacher)的软标签知识迁移到小模型(student),mAP 仅降 0.8 个点却把体积砍掉近 4 倍,边缘盒子显存占用从 3.1G 降到 0.9G。
推理框架轻量化常驻。 边缘工控机内存有限,大模型进程常驻容易因 OOM 被系统杀掉,重启一次就丢十几秒产量。我们采用轻量推理框架,关闭动态批处理、固定输入分辨率、启用 TensorRT 内核缓存,并把服务做成 systemd 托管守护进程,心跳失败自动拉起:
[Service]
ExecStart=/opt/infer/edge_run --model defect_int8.engine --warmup 50
Restart=always
MemoryMax=1.2G预热阶段先跑 50 帧把内核编译缓存住,首帧延迟从冷启动的 300ms 降到稳态 12ms;同时把日志级别调到 warn,避免磁盘 IO 成为瓶颈。
断网本地闭环与 OTA 更新。 断网工位必须能独立运行,我们设计了"影子模式"OTA:新模型先以影子进程并行跑、与当前模型做结果一致性比对,差异率低于阈值才切换主流量;OTA 包带签名与回滚点,下载失败或校验不通过自动回退上一版本,绝不让产线因升级卡死。
ota:
strategy: shadow_cutover
consistency_threshold: 0.98
rollback_on_fail: true
sign_verify: true一致性阈值 0.98 是平衡"尽快生效"与"避免误切"的经验值,低于它说明新模型行为漂移,宁可暂缓。
量化与边缘部署前后对比如下(脱敏示意值):
| 指标 | 改造前(FP32) | 改造后(INT8+边缘) | 说明 |
|---|---|---|---|
| 单帧推理延迟 | 约 182 ms | 约 11 ms | 边缘盒子稳态 |
| 漏检率 | 约 2.1% | 约 0.6% | 混精+蒸馏补偿 |
| 误检率 | 约 1.4% | 约 0.9% | 阴影比对校准 |
| 产线节拍影响 | 降速约 15% | 几乎无影响 | 实时判定不堆积 |
| 运维成本 | 基线 100% | 降至约 45% | 云边协同减带宽与人巡 |
案例片段(已脱敏):量化导出与延迟/精度对比。同一缺陷测试集(5000 帧)上,FP32 单帧 182ms、mAP 0.947;FP16 单帧 38ms、mAP 0.945;INT8(检测头混精+蒸馏)单帧 11ms、mAP 0.939。导出命令即上文
export_quant.py --dtype int8 --sensitive-layers detect.head,精度损失 0.8 点,换来得延迟降至约 1/16,满足产线 20ms 节拍硬约束。
第一,云边协同而非云边替代:边缘不是把云搬下来,而是只跑确定性、低延迟的判定模型,疑难与再训练交给云,这样断网也不影响主流程。第二,边缘只跑确定性模型,凡是要"思考""生成"的不确定性任务别往边缘塞,断网时会放大风险,且难以回滚。第三,量化不要一刀切 INT8,敏感头做混精、用校准集与蒸馏补偿,精度与速度能兼得,体积也明显变小。第四,OTA 必须带影子切换与回滚,产线停一分钟的损失远超模型那点收益,签名校验也要默认开启。第五,常驻服务要靠守护进程而非脚本拉起,显存与内存上限要写死避免拖垮宿主。第六,缺陷样本要持续回流云端做再训练,否则边缘模型遇到新工件类型会缓慢退化,我们设了每周一次的疑难样本回捞机制。这套边缘部署范式我们已沉淀为底座的标准交付形态,后续接新产线基本可复用,新线接入从一个月压缩到约一周。