如何使用物联网设备管理平台Golioth实现大规模图像分类
1. 为什么您的边缘AI模型需要空中更新
你训练了一个模型,它在实验室中能准确分类图像。你将其部署到现场设备上,然后现实发生了变化。
灯光在变化,摄像机角度在调整,新的对象类别不断出现,而这些在训练数据中从未存在。原本在测试中准确率达到95%的模型,在生产环境中却只能达到70%。你需要立即推出一个改进后的模型,而不是等到下个季度,或是在维护窗口期间。现在就行动起来,覆盖所有设备,无需派遣工程师逐一检查。
这是模型更新的问题,也是边缘AI生命周期中最大的短板之一。机器学习社区拥有成熟的训练工具(如Edge Impulse、TensorFlow、PyTorch)和成熟的推理工具(如TFLite、ONNX Runtime),但将模型部署到生产设备上通常仍需手动操作:通过SSH登录设备,复制文件,然后重启服务。这种方法适用于原型机,但无法应对十台设备,更不用说上千台了。
本文将介绍如何使用物联网设备管理平台Golioth,为运行图像分类任务的Linux边缘设备提供空中(OTA)模型更新的实用方案。我们将全面讲解整个工作流程:设备配置、模型上传、版本创建以及在推理仍在进行时实现几秒钟内生效的更新部署。
2. 生产中模型更新的挑战
将模型部署到边缘设备是一次性事件,而保持该模型的时效性则是一个持续性的运营挑战。其困难之处在于:模型漂移
真实世界的数据会随着时间变化。一个基于夏季图像训练的模型在冬季时性能会下降。一个针对某一批次产品训练的工厂检测模型,可能无法发现下一批次中的缺陷。模型本身并不会崩溃,而是逐渐变得不准确,往往无人察觉,直到为时已晚。
车队管理
当您拥有多个设备时,每个设备可能运行不同的版本。部分设备在最近一次更新期间可能处于离线状态,或位于网络连接不稳定的位置。您需要一个系统来追踪每台设备的版本,并协调这些差异。
零停机要求
生产系统不能因更新而停机。安防摄像头需要在加载新模型时持续进行分类。质量检测系统不能因固件重写而暂停生产线。更新过程必须在后台进行,确保新模型能够无缝生效。
回滚安全
有时新模型的表现会比旧模型更差。你需要能够快速回退到之前的版本,而无需重新训练或从头开始部署。这就需要保留版本化的副本,并具备在不同版本之间切换的机制。
安全
模型文件属于知识产权,通过互联网传输至可能位于不可信物理位置的设备。传输机制需要加密通信、身份认证的设备以及完整性验证,以确保模型在传输过程中不会被篡改。
3. 解决方案:Golioth 用于机器学习模型交付
Golioth 是一个物联网设备管理平台,可提供安全且可扩展的固件远程升级(OTA)。虽然它通常用于向微控制器交付固件,但其构件管理系统也非常适合将机器学习模型部署到 Linux 边缘设备上。
建筑结构简单明了:
•Edge Impulse(或您选择的训练工具)会生成一个 trained.tflite 模型和一个标签文件。
•Golioth 将模型作为版本化的资源托管,并管理您设备群组的发布。
•您的边缘设备运行一个轻量级更新器,用于从Golioth获取新模型,并运行一个执行推理的Python脚本。
关键在于职责分离。模型更新器负责云通信、身份验证、下载和文件管理,而推理脚本则处理摄像头捕获和分类任务。它们作为独立进程运行。当新模型到达时,更新器将其写入磁盘,并通知推理脚本重新加载——无需重启,也无停机时间。
4. 设备注册与认证
在设备能够接收模型更新之前,必须先在Golioth上注册并获取认证凭据。这可确保只有授权设备才能拉取您的模型,并且模型通过加密连接传输。4.1 创建项目
Golioth 中的每一个事物都存在于一个项目中。项目可以将您的设备、资产和发布版本集中管理。在 Golioth 控制台创建一个代表您部署的项目,例如“工厂质检”或“零售分析”。
4.2 添加设备
每个物理设备在Golioth中都会获得一个唯一的标识。请前往“设备”页面,创建一个新的设备,并为其赋予一个有意义的名称,以标识其位置或功能,例如“camera-line-3”或“entry-classifier-01”。
4.3 使用PSK凭据进行认证
Golioth 支持两种设备认证方式:预共享密钥(PSK)和基于证书的(PKI)。
PSK 是更简单的选项。每个设备会从 Golioth 控制台获取一个 PSK 身份标识和一个 PSK 密钥,并将其设置为设备上的环境变量。这适用于快速原型开发和小型部署。
对于本项目,我们使用证书认证(PKI),相关内容将在下一节中介绍。
4.4 证书认证
对于生产部署,基于证书的身份验证(PKI)提供了更强的安全性。每台设备都会获得由您的证书颁发机构(CA)签名的唯一X.509证书。在TLS握手过程中,设备会出示其证书,Golioth则将其与已注册的CA进行比对验证。
证书认证消除了管理单个PSK密钥的必要性,并支持大规模自动化配置。模型更新器从磁盘读取三个PEM文件:
•设备证书:用于识别该特定设备
•设备私钥:用于验证证书的所有权
•Golioth 根 CA:验证服务器确实是 Golioth
PSK 和证书认证功能相同,仅在配置复杂性和安全级别上有所不同。开发和小型部署可使用 PSK;生产环境中的集群则应使用证书。
5. 通过Golioth部署模型
一旦您的设备完成注册并通过身份验证,即可开始推送模型。Golioth 的 OTA 系统采用三个概念:包(您要交付的内容)、批次(接收者)和部署(接收时间)。
5.1 创建包
Golioth 中的包代表您设备上一个可升级的组件。每个包都有名称、描述以及一组版本化的资源列表。对于图像分类,我们创建两个包:
如果项目中的两个不同设备使用相同的模型,您只需一个AI模型包。通过分组(cohorts)可独立部署到两种设备类型上。
创建一个包:
•在Golioth Web控制台中导航至包
•点击创建
•请输入包名(例如:ai-model)
•可选地添加描述和元数据属性
•点击创建
•重复标签包装的操作。
上传一个版本:
•在包列表中打开你的包
•点击新版本
•设置版本号(例如:1.0.0 或简写为 1)
选择要上传的二进制文件(您的 .tflite 模型或 labels.txt)
•点击上传物品
新版本会显示在版本列表中。每个版本都是不可更改的——一旦上传,便无法修改。要推送更新后的模型,请上传新的版本(例如版本2)。这将为您提供所有已部署模型的完整历史记录,便于随时回滚。
5.2 创建队列
在将更新部署到设备之前,您需要先将其分配到一个组中。组是一组接收相同软件包和固件更新的设备。
通常,您会为每种设备类型或部署阶段创建一个队列。例如:
生产:现场所有生产设备
canary:一个小型子集,会优先接收更新以进行验证
dev:内部测试设备
开始时,一个批次就足够了。
创建一个队列:
前往Golioth网络控制台中的群组
点击创建分组
请输入一个名称(例如:默认或开发)
点击创建
将设备分配给该组。
在控制台中有三种方法可以实现这一点:
从队列页面:点击“添加设备”,在表格中找到您的设备,然后点击“添加”。
从设备索引中:选择带有复选框的设备,点击批量操作 → 分配到群组,然后选择该群组
从“编辑设备”页面:点击“编辑”,从下拉菜单中选择一个组别,然后点击“保存”。
一旦设备被分配到某个群组并连接到Golioth,它将立即收到该群组的当前部署清单。
5.3 部署更新
部署会将特定的一组软件包版本推送到同一组中的所有设备。每个组每次只能有一个有效的部署。当你创建新的部署时,它会取代之前的部署,并立即推送到该组中所有已连接的设备。
要创建部署:
1:转到群组并选择您的群组
2:点击右上角的“部署”
3:选择要包含的软件包和版本:
AI模型 → 版本1
标签 → 版本 1
4:点击“下一步”以查看更改
5:点击开始部署
部署将推送到该组中的所有设备。在设备端,模型更新器接收到清单,识别出新包后开始下载。
5.4 升级到新模型版本
当您准备好要部署重新训练的模型时:
1:进入“包” → “ai-model” → “新版本”
2:将新的 .tflite 文件上传为版本 2
3:前往“群组” → 你的群组 → 部署
4:选择 ai-model v2 + labels v1(如果标签已更改,则选择 v2)
5:查看并点击开始部署
队列中每个设备上的模型更新器都会接收新的清单文件,仅下载已更改的工件,更新符号链接,并通知 Python 推理脚本重新加载——整个过程在几秒钟内完成。
6. 亲眼见证其运作
让我们来看一个真实的部署场景。我们有一个在 Edge Impulse 中训练好的图像分类模型,用于识别两种水果:橙子和甜椒。初始模型(v1)使用了有限的数据进行训练,性能不稳定。我们将通过 Golioth 推送改进后的模型(v2),并实时观察更新效果。
6.1 重新开始
设备初始时会有一个空的模型目录。模型更新器连接到Golioth并订阅了清单更新:
与此同时,Python推理脚本启动并等待模型到达:
6.2 首次模型交付(v1)
我们发布了首个包含Golioth控制台中的ai-model v1和labels v1的版本。更新器接收到清单后开始下载:
Python 脚本接收到信号后加载模型:
摄像头画面开始显示预测结果。但这个初始模型是使用有限数据训练的,经常将橙子误判为甜椒,置信度分数大约在20%到30%之间。
6.3 推送改进后的模型(v2)
在 Edge Impulse 中使用更多数据和更多训练轮次进行重新训练后,我们获得了一个准确率显著提高的 v2 模型。我们将该模型上传至 Golioth 作为 ai-model v2,创建一个新版本(ai-model v2 + labels v1),并将其部署上线。更新器会检测到新版本并自动下载:
请注意,标签文件并未重新下载。更新器检测到磁盘上已存在标签v1,因此跳过了该文件,仅传输了新模型。Python脚本会立即重新加载:
摄像头画面现在显示准确的分类结果,置信度在70%至85%之间。“模型已重新加载”横幅会短暂出现在视频画面中,以确认更新已生效。
从在Golioth控制台点击“Roll Out”到新模型在设备上运行推理,整个更新过程在标准宽带连接下仅需几秒钟,对于一个419KB的模型来说。
6.4 磁盘内容
在部署两个版本后,模型目录如下所示:
两个版本均保留在磁盘上。如果 v2 在特定环境中表现不佳,可以通过创建一个引用 ai-model v1 的新版本来回滚,或者手动将符号链接指向旧版本。
7. 模型部署的最佳实践
7.1 版本 全部内容
上传到Golioth的每个型号都会获得一个版本号。使用该版本号可以准确追踪每台设备上运行的具体内容。当设备报告问题时,第一个应该问的问题是:“它运行的是哪个型号版本?” 磁盘上的版本文件和Golioth控制台都能立即回答这个问题。
7.2 始终为模型附带标签
如果向模型添加了新的类别,标签文件必须相应更新以保持一致。将两者同时包含在同一个Golioth版本中,可确保它们作为一个完整的配对一同提供。模型输出与标签之间出现不匹配是细微的错误,会导致预测结果虽然准确但完全错误。
7.3 使用分阶段发布
不要一次性将新模型推送到整个车队。先标记部分设备为“信标”并优先部署到它们上,在生产环境上线前观察其准确率一两天。Golioth 的设备标签和定向发布功能让这一过程变得简单明了。
7.4 上线后监控
模型更新器可通过状态报告API将自身状态反馈给Golioth。使用此功能可确认每个设备均已成功下载并加载新模型。未能更新的设备在控制台中会显示过时版本,便于识别和排查问题。
8. 结论与未来工作
8.1 我们所构建的内容
我们演示了一种基于Golioth的OTA基础设施,在Linux边缘设备上部署和更新机器学习模型的实用系统。该系统支持多构件发布(模型+标签)、自动版本管理、零停机热重载以及回滚功能。从上传新模型到在设备上运行,整个工作流程耗时不到一分钟。
该架构将模型交付与模型推理分开,使各个组件能够独立发展。设备更新器负责云通信和文件管理;推理脚本则处理摄像头捕获和分类任务。两者通过文件系统和简单的Unix信号进行通信,确保系统可靠且易于调试。
8.2 这能实现什么
我们构建的OTA模型交付基础设施,为更先进的边缘AI工作流奠定了基础:
主动学习系统:设备可以实时监控自身的预测置信度。当置信度低于某个阈值时,设备会标记这些样本以供审核。这些不确定的样本往往是最有价值的训练数据。通过一个流程,可以收集这些样本,将其添加到训练集中,在Edge Impulse中重新训练,并将优化后的模型通过Golioth推送回去。这形成了一种持续学习的循环,每个部署的设备都能共同帮助提升模型性能。
A/B 模型测试:通过版本管理和设备标签,您可以同时在不同的设备组上运行两个不同的模型版本。比较它们在实际场景中的准确率,以确定哪个模型表现更优,然后再决定是否在全车队范围内推广使用。
自动化重训练流水线:Edge Impulse 的 REST API 可集成到 CI/CD 流水线中,自动在新数据上重新训练模型,导出模型并上传至 Golioth 作为新的构件版本,创建部署并推送到候选设备。无需人工介入即可完成常规模型优化。
领域自适应:不同部署地点可能具有不同的环境条件(如光照、角度、背景)。通过Golioth的定向发布功能,同一基础模型可针对各站点进行微调,并推送到特定设备组,确保每台设备都能运行针对其环境优化过的模型。
模型压缩与优化:随着更先进的量化技术或模型架构的出现,您可以使用经过优化的版本,使其运行更快或占用更少内存。无需更改设备硬件或推理代码。
本文编译自hackster.io





