ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Azure IoT Edge 虚拟机部署实战:在云端 VM 上运行水果品质检测边缘推理

Azure IoT Edge 虚拟机部署实战:在云端 VM 上运行水果品质检测边缘推理 Azure IoT Edge 虚拟机部署实战在云端 VM 上运行水果品质检测边缘推理【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners在 IoT-For-Beginners 课程的「在边缘运行水果检测器」4-manufacturing/lessons/3-run-fruit-detector-edge中模型从 Custom Vision 云端推理迁移到了 Azure IoT Edge 边缘设备。而当你的开发环境是 macOS、或没有可承载 IoT Edge 运行时的 Linux 硬件/树莓派时最直接的方案就是先在 Azure 中创建一个预装好 IoT Edge 运行时的 Linux 虚拟机VM把它作为边缘设备来部署图像分类容器。阅读本文后你将掌握如何通过一条 ARM 模板部署命令创建 IoT Edge VM、获取其 IP/DNS、开放 80 端口、设置自动关机与控制成本以及如何 SSH 登录验证分类模块、用 curl 与设备端代码调用边缘推理 API。为什么需要一台云虚拟机来跑 IoT EdgeIoT Edge 运行时只运行 Linux 容器详见课程 README.md 中的说明它可以运行在 Linux 或 Windows 的 Linux 虚拟机中。课程的「安装 IoT Edge 运行时」任务按硬件给出了四条路径树莓派可直接安装运行时其他 Linux 电脑可直接安装运行时Windows可在 Linux 虚拟机中安装运行时macOS在云端创建一台预装 IoT Edge 的 Linux 虚拟机即本文所讲解的 vm-iotedge.md 方案。虚拟机是运行在云端、可以按你的意愿任意配置并运行自己软件的计算机。把 IoT Edge 运行时放到云端 VM 上意味着边缘设备本身也是一台云资源创建后它会自动连入你的 IoT Hub 并注册为边缘设备而后续容器的部署、模块的运行状态查看都与物理边缘设备完全一致。前置条件注册 IoT Edge 设备并取得连接字符串创建 VM 前需要先在 IoT Hub 中注册边缘设备身份并拿到连接字符串——它将被传入 VM 的部署模板用于让 VM 上的运行时自动连接 IoT Hub。在fruit-quality-detector资源组中创建 IoT Hub基于fruit-quality-detector起一个唯一名称。注册名为fruit-quality-detector-edge的 IoT Edge 设备。与注册普通设备类似区别是增加--edge-enabled标志az iot hub device-identity create --edge-enabled \ --device-id fruit-quality-detector-edge \ --hub-name hub_name将hub_name替换为你的 IoT Hub 名称。查询设备连接字符串az iot hub device-identity connection-string show --device-id fruit-quality-detector-edge \ --output table \ --hub-name hub_name将输出中的连接字符串完整复制保存稍后使用。创建一台预装 IoT Edge 的虚拟机理解部署命令Azure 提供了一个官方 ARM 模板iotedge-vm-deploy可以一键创建一台已预装并配置好 IoT Edge 运行时的 Linux VM。使用以下命令完成部署az deployment group create \ --resource-group fruit-quality-detector \ --template-uri https://raw.githubusercontent.com/Azure/iotedge-vm-deploy/1.2.0/edgeDeploy.json \ --parameters dnsLabelPrefixvm_name \ --parameters adminUsernameusername \ --parameters deviceConnectionStringconnection_string \ --parameters authenticationTypepassword \ --parameters adminPasswordOrKeypassword各参数的含义与取值要求参数说明取值建议--resource-group目标资源组与本课程一致使用fruit-quality-detector--template-uri官方 IoT Edge VM 部署模板地址使用 1.2.0 版本模板dnsLabelPrefixVM 的 DNS 标签前缀全局唯一建议形如fruit-quality-detector-vm-加你的名字或其他标识adminUsername登录 VM 的用户名需要相对安全不能使用admin之类的弱用户名deviceConnectionString上一步取得的边缘设备连接字符串必须加上双引号包裹authenticationType登录认证方式本文使用password密码认证adminPasswordOrKey登录密码或 SSH 公钥密码需足够复杂不能使用password之类弱口令模板会默认创建一台DS1 v2规格的 VM。这类规格表示机器的性能档位也直接决定计费——DS1 v2 提供1 个 vCPU 和 3.5GB 内存。 VM 规格越高性能越强、费用越高课程文档写作时一台 DS1 VM 的费用约为每小时 $0.06美元。实际价格请以 Azure 官方定价页为准。因为价格会随时间变化控制成本的核心思路不是依赖单次查询而是下文介绍的自动关机与**停用deallocate**策略。部署成功后发生了什么命令执行完成后Azure 会完成以下自动化动作创建 VM含磁盘、网络、安全组等附属资源自动安装 IoT Edge 运行时运行时使用你传入的deviceConnectionString自动连接 IoT Hub并注册为你注册好的fruit-quality-detector-edge设备。也就是说这台 VM 从创建那一刻起就已经是活的边缘设备了无需手动 SSH 进去配置运行时。获取 VM 的 IP 地址与 DNS 名称后续调用图像分类 API、SSH 登录都需要 VM 的网络地址。运行az vm list --resource-group fruit-quality-detector \ --output table \ --show-details从输出中复制PublicIps公网 IP或Fqdns完全限定域名字段的值二者任选其一即可。开放 80 端口配置网络安全组规则图像分类容器将在边缘设备上监听 80 端口标准 HTTP 端口。默认情况下Azure VM 的入站端口全部被网络安全组NSG封锁因此必须显式放行 80 端口。先查询 VM 所属的网络安全组名称az network nsg list --resource-group fruit-quality-detector \ --output table复制输出中Name字段的值。为该 NSG 添加一条放行 TCP 80 端口的入站规则az network nsg rule create \ --resource-group fruit-quality-detector \ --name Port_80 \ --protocol tcp \ --priority 1010 \ --destination-port-range 80 \ --nsg-name nsg name将nsg name替换为上一步查到的网络安全组名称。--priority 1010表示该规则的优先级数值越小优先级越高1010 是文档中给出的可用优先级--destination-port-range 80限定了放行目标端口。完成这一步后来自外部的 HTTP 请求才能抵达 VM 上运行在 80 端口的分类器容器。控制成本自动关机与停用/启动VM 是持续计费的云资源控制成本是边缘 VM 方案必须处理的实操问题。配置每日自动关机可以设置 VM 在每天固定时间UTC自动关机。这样即使你忘记手动关闭计费也不会超过自动关机时刻az vm auto-shutdown --resource-group fruit-quality-detector \ --name vm_name \ --time shutdown_time_utcvm_name你的虚拟机名称shutdown_time_utcUTC 时间使用 4 位数字 HHMM 格式。例如午夜UTC 00:00关机填0000想让美国西海岸晚上 7:30 关机因西海岸 7:30 PM 对应 UTC 2:30 AM填0230。停用与启动不使用 VM 时应将其停用deallocate而不是仅仅停止。区别在于az vm stop停止运行但计算资源仍然保留分配给你计费继续az vm deallocate释放计算资源分配不再计费磁盘等存储资源仍保留。停用命令az vm deallocate --resource-group fruit-quality-detector \ --name vm_name需要再次使用时启动az vm start --resource-group fruit-quality-detector \ --name vm_name将vm_name替换为你的 VM 名称。完成整个项目后建议按仓库根目录的 clean-up.md 说明删除相关资源避免持续产生费用。部署后验证SSH 登录并检查模块状态连接 VM使用创建 VM 时设置的adminUsername和密码通过 IP 或 DNS 名称 SSH 登录ssh adminUsernameIP address或ssh adminUsernameDNS Name按提示输入密码。查看模块列表登录后运行iotedge list必要时加sudo查看 IoT Edge 模块状态iotedge list成功部署后应看到三个模块都在运行jimfruit-quality-detector-jimb:~$ iotedge list NAME STATUS DESCRIPTION CONFIG ImageClassifier running Up 42 minutes fruitqualitydetectorjimb.azurecr.io/classifier:v1 edgeAgent running Up 42 minutes mcr.microsoft.com/azureiotedge-agent:1.1 edgeHub running Up 42 minutes mcr.microsoft.com/azureiotedge-hub:1.1edgeAgent/edgeHub是 IoT Edge 的系统模块负责与 IoT Hub 通信、执行部署清单deployment manifestImageClassifier是本次课程部署的业务模块镜像来自你的 Azure Container Registry。查看分类器日志iotedge logs ImageClassifier必要时加sudo。日志会展示 TensorFlow 初始化信息以及 Flask 服务启动情况其中Loading model...Success!、Loading labels...2 found. Success!表示模型与标签加载成功Running on http://0.0.0.0:80/表示 REST API 已在 80 端口就绪jimfruit-quality-detector-jimb:~$ iotedge logs ImageClassifier 2021-07-05 20:30:15.387144: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA 2021-07-05 20:30:15.392185: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2394450000 Hz 2021-07-05 20:30:15.392712: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x55ed9ac83470 executing computations on platform Host. Devices: 2021-07-05 20:30:15.392806: I tensorflow/compiler/xla/service/service.cc:175] StreamExecutor device (0): Host, Default Version Loading model...Success! Loading labels...2 found. Success! * Serving Flask app app (lazy loading) * Environment: production WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:80/ (Press CTRLC to quit)测试分类器 REST API分类容器暴露的接口与 Custom Vision 云端 REST API 兼容但端点指向 VM 的 IP/主机名且无需 Prediciction-Key——因为请求不经过 Azure 资源安全策略由内网自行设计详见课程 README.md 的「测试图像分类器」小节。若在 VM 本机测试主机名用localhost若使用 VM用上文获取的 IP 或 DNS 名称。用 curl 发送本地图片文件进行预测curl --location \ --request POST http://IP address or name/image \ --header Content-Type: image/png \ --data-binary file_Name替换IP address or name为运行 IoT Edge 的机器 IP/主机名file_Name为要测试的图片文件。返回 JSON 中的predictions数组包含各标签及概率{ created: 2021-07-05T21:44:39.573181, id: , iteration: , predictions: [ { boundingBox: null, probability: 0.9995615482330322, tagId: , tagName: ripe }, { boundingBox: null, probability: 0.0004384400090202689, tagId: , tagName: unripe } ], project: }把 IoT 设备切换到边缘分类器分类器在 VM 边缘设备上运行后就可以把 IoT 设备的推理请求从云端改指向 VM。课程提供了两个设备的改造指南Arduino/Wio Terminal见 wio-terminal.md树莓派/虚拟 IoT 设备见 single-board-computer.md。从仓库源码可以看到调用端的实际实现。以树莓派/虚拟设备为例Python 端改用requests库直接向边缘 URL 发起 POSTCustom Vision 的 Python SDK 只支持云端模型不支持 IoT Edge 模型见 app.pyprediction_url URL headers { Content-Type : application/octet-stream } image.seek(0) response requests.post(prediction_url, headersheaders, dataimage) results response.json() for prediction in results[predictions]: print(f{prediction[tagName]}:\t{prediction[probability] * 100:.2f}%)URL即http://IP address or name/image。运行输出示例(.venv) ➜ fruit-quality-detector python app.py ripe: 56.84% unripe: 43.16%虚拟设备版本代码位于 code-classify/virtual-iot-device/fruit-quality-detector/app.py。Wio Terminal 端的 C 实现则使用普通WiFiClientHTTPClient完成同样的 POST 请求需删除证书设置与Prediction-Key请求头因为边缘端走的是 HTTP 而非 HTTPS见 main.cpp。部署清单与模块端口映射的补充说明VM 方案只是边缘设备的一种承载方式分类容器真正被拉取并运行依赖一份部署清单deployment manifestdeployment.json。仓库中已提供完整示例code-deployment/deployment/deployment.json。清单中与 VM 方案直接相关的关键点$edgeAgent.properties.desired.runtime.settings.registryCredentials存放容器仓库的登录凭据username/password/address运行时据此从 Azure Container Registry 拉取镜像modules.ImageClassifier.settings.image指向classifier:v1镜像ImageClassifier模块的createOptions将容器 80 端口绑定到宿主机的 80 端口HostConfig: {PortBindings: {80/tcp: [{HostPort: 80}]}}——这正是上面需要为 VM 开放 80 端口的原因通过az iot edge set-modules命令把清单下发给边缘设备详见课程 README.md 的「部署你的容器」小节。小结在云端创建 IoT Edge 虚拟机是用最短路径获得一个可随时开关、按需付费的边缘推理节点的实用方案一条 ARM 模板命令完成 VM 创建与运行时自动配置配合 NSG 规则开放 80 端口再用iotedge list/iotedge logs验证ImageClassifier模块运行最后把 IoT 设备的请求 URL 指向 VM 的 IP/DNS 即可完成从云端推理到边缘推理的迁移。切记通过az vm auto-shutdown与az vm deallocate控制成本并在项目结束时清理资源。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表