Развёртывание ML-моделей через Azure IoT Edge
Azure IoT Edge запускает контейнеры (modules) на Edge-устройствах с оркестрацией из Azure. ML-модели из Azure Machine Learning → IoT Edge module → деплой через deployment manifest. Интеграция с Azure Stream Analytics, Cognitive Services, ONNX Runtime.
Архитектура IoT Edge
IoT Edge runtime: два системных контейнера:
-
edgeAgent— управляет lifecycle модулей по deployment manifest -
edgeHub— локальный брокер MQTT/AMQP, маршрутизация сообщений между модулями, store-and-forward при потере сети
Deployment manifest (JSON):
{
"modulesContent": {
"$edgeAgent": {
"properties.desired": {
"modules": {
"MLInference": {
"type": "docker",
"settings": {
"image": "myregistry.azurecr.io/ml-inference:1.2.0",
"createOptions": "{\"HostConfig\":{\"Devices\":[{\"PathOnHost\":\"/dev/video0\"}]}}"
}
}
}
}
},
"$edgeHub": {
"properties.desired": {
"routes": {
"MLToCloud": "FROM /messages/modules/MLInference/* INTO $upstream"
}
}
}
}
}
ML модули из Azure Machine Learning
AML → IoT Edge workflow:
- Обучение в AzureML compute cluster
- Регистрация модели в AzureML Model Registry
- Создание IoT Edge deployment пакета через
Model.package() - Push контейнера в Azure Container Registry
- Обновление deployment manifest → автоматический деплой на device group
from azureml.core import Workspace, Model
from azureml.core.model import InferenceConfig
from azureml.contrib.core.webservice import AksEndpoint
ws = Workspace.from_config()
model = Model(ws, 'defect-detector')
# Создание IoT Edge пакета
package = Model.package(ws, [model],
inference_config=InferenceConfig(entry_script='score.py',
environment=env),
generate_dockerfile=False)
package.wait_for_creation(show_output=True)
package.pull() # docker pull для ACR
ONNX Runtime в IoT Edge модуле
Azure рекомендует ONNX Runtime для кросс-платформенного инференса:
import onnxruntime as ort
import numpy as np
# hardware-aware session
opts = ort.SessionOptions()
opts.graph_optimization_level = ort.GraphOptimizationLevel.ORT_ENABLE_ALL
opts.intra_op_num_threads = 4
# провайдеры в порядке приоритета
providers = ['TensorrtExecutionProvider', # NVIDIA
'CUDAExecutionProvider',
'CPUExecutionProvider']
session = ort.InferenceSession('model.onnx', opts, providers=providers)
def infer(image_np):
input_name = session.get_inputs()[0].name
return session.run(None, {input_name: image_np})
Azure IoT Edge + ONNX Runtime образ:
mcr.microsoft.com/azureml/onnxruntime:latest-openvino — с OpenVINO для Intel железа.
mcr.microsoft.com/azureml/onnxruntime:latest-jetpack — для NVIDIA Jetson.
Взаимодействие модулей
Module Twin: Каждый модуль имеет Azure IoT Hub device twin subset. Изменение desired properties → callback в модуле:
async def twin_patch_handler(patch):
if 'modelVersion' in patch:
await update_model(patch['modelVersion'])
if 'confidenceThreshold' in patch:
global THRESHOLD
THRESHOLD = patch['confidenceThreshold']
module_client.on_twin_desired_properties_patch_received = twin_patch_handler
Direct Methods: Синхронный вызов из Azure → Edge (timeout-based):
async def method_handler(method_request):
if method_request.name == "GetStats":
payload = {"fps": current_fps, "detections_today": counter}
return MethodResponse.create_from_method_request(
method_request, 200, payload)
Message Routing: edgeHub маршрутизирует по source, topic, body properties:
FROM /messages/modules/Camera/* WHERE $body.width > 1920 INTO modules/HiResProcessor/inputs/frames
FROM /messages/modules/MLInference/* WHERE $body.confidence > 0.9 INTO $upstream
Azure Stream Analytics на Edge
Для real-time аналитики без отправки в облако:
-- ASA Edge job query
SELECT
System.Timestamp() as EventTime,
AVG(temperature) as AvgTemp,
COUNT(*) as Anomalies
INTO AlertOutput
FROM TemperatureInput TIMESTAMP BY EventTime
GROUP BY TumblingWindow(second, 30)
HAVING AVG(temperature) > 75 OR COUNT(*) > 10
ASA Edge job деплоится как IoT Edge модуль. SQL запрос выполняется локально, результаты отправляются в другой модуль или в облако.
Компьютерное зрение с Custom Vision
Azure Custom Vision → экспорт ONNX/TFLite → IoT Edge модуль:
# экспорт trained модели
az cognitiveservices account custom-vision export \
--project-id $PROJECT_ID \
--iteration-id $ITERATION_ID \
--type ONNX
Custom Vision App Module — готовый Docker образ от Microsoft, принимает ONNX модель через module twin, экспонирует HTTP endpoint для инференса.
Fleet Management через IoT Hub
Device Provisioning Service (DPS): Zero-touch provisioning. Устройство при первом запуске → DPS endpoint → автоматическое назначение в IoT Hub + получение deployment manifest.
Automatic Deployments:
Target condition: tags.location = 'factory-A' AND tags.deviceType = 'vision-station'. Приоритет deployments: базовый (100 устройств) + override для специфичных устройств.
Мониторинг:
Azure Monitor + IoT Hub metrics. Built-in: connected devices, messages/day, twin operations. Custom: через IoTHubDeviceClient.send_message() с application properties для фильтрации в Log Analytics.
Поддерживаемые платформы
Linux AMD64/ARM64/ARMv7. Windows AMD64 (IoT Core, Server 2019). Протестировано: Intel NUC, Raspberry Pi 4, NVIDIA Jetson Nano/Orin, промышленные IPC (Advantech, Beckhoff).
Минимальные требования: 512 MB RAM, контейнерная поддержка (containerd/moby).
Сроки: 3–6 недель
Базовый деплой с Azure ML моделью — 1–2 недели. Кастомные модули, ASA Edge, OPC Publisher интеграция с промышленным оборудованием, DPS fleet provisioning — 5–6 недель.







