850 миллисекунд. Таков p99 задержки облачного инференса при отправке 1080p-кадра с промышленной площадки через средний LTE-модем. За 850 миллисекунд конвейер протаскивает деталь на два метра вперед, и пневматический толкатель бьет в пустоту. В Morana Labs, где мы строим industrial AI и high-load системы на железе клиента, с этой цифры начинается каждый второй аудит. Индустриальный edge — это не дань хайпу. На объекте может не быть связи. Канал может лечь от наводок соседнего цеха. Облако может уйти в maintenance. Но конвейер останавливаться не должен. Никогда.
Облако — это иллюзия контроля
Зачем тащить тяжелые вычисления на слабые железки? Ради детерминированности. Отправляя данные во внешний контур, вы подписываетесь на непредсказуемый джиттер сети. Вы платите за трафик, упираетесь в пропускную способность аплинк-канала и нарушаете регламенты безопасности, сливая видеопоток с завода на чужие серверы.
Инференс обязан жить на устройстве, если ваш цикл обратной связи меньше секунды. Дроны, роборуки, оптическая сортировка мусора, системы предотвращения аварий — здесь облако мертво по определению. Думаете, 5G решит проблему? Забудьте. Экскаватор, перерубивший оптику к базовой станции, обнуляет любые инвестиции в инфраструктуру связи.
Железо: Jetson, Raspberry Pi и зоопарк NPU
Выбор вычислителя зависит от математики вашей модели, а не от бюджета, который выделило руководство.
Raspberry Pi 5. Отличный одноплатник для агрегации сенсорной телеметрии. Вытянет ли он YOLOv8? Да, в Nano-версии и на 3 кадрах в секунду, с перегревом через десять минут. Память LPDDR4X с узкой шиной удушит любую сверточную сеть. RPi годится для легковесных одномерных CNN, акустических моделей или табличных данных. Для серьезного computer vision он не подходит. Без вариантов.
NPU-акселераторы. Coral Edge TPU, Hailo, Rockchip RK3588. Стоят копейки в серии, но превращают разработку в ад. Компиляторы проприетарные и кривые. Поддержка современных операторов нейросетей отстает от PyTorch на годы. Если в вашей архитектуре есть нестандартный слой внимания, NPU выплюнет его обратно на слабый ARM-процессор, и весь пайплайн встанет колом. Вы выигрываете в деньгах на железо, но спускаете бюджет на зарплаты инженеров, пытающихся впихнуть граф в тулчейн.
NVIDIA Jetson. Линейки Orin Nano и NX. Это золотой стандарт отрасли. Дорого, горячо, но вы получаете полноценную поддержку CUDA. 99% того, что обучено в PyTorch, заведется на edge с минимальными танцами.
Edge AI на устройстве: инференс нейросети на Jetson и Raspberry Pi без интернета
Взять файл model.pt, закинуть на девайс через SCP и написать model.to('cuda') — это преступление против производительности. В проде так не делают. Вы обязаны подготовить модель под целевую архитектуру.
Сначала идет квантизация. FP32 на edge не нужен, это пустая трата регистров и пропускной способности памяти. Мы режем точность весов до FP16 или INT8. Для INT8 вам понадобится репрезентативный датасет из реальных условий для калибровки, чтобы собрать статистику активаций и не обрушить метрики precision/recall. Дальше компиляция. На Jetson это TensorRT. Модель превращается в бинарный движок, жестко привязанный к конкретной архитектуре GPU и версии CUDA.
- Экспорт графа: выгружаем веса из PyTorch в формат ONNX.
- Слияние слоев: применяем constant folding и убираем мертвые ветви вычислений.
- Калибровка: прогоняем тысячу типичных кадров, чтобы TensorRT вычислил динамические диапазоны тензоров для перехода в INT8.
- Сборка движка: фиксируем размер батча (обычно 1 для edge-камер), размеры входных разрешений и компилируем
.engine.
Скомпилировали? Рано радоваться. Железо уедет в цех. Там +35°C в тени, вибрации и масляная пыль.
Jetson под нагрузкой — это кипятильник. Как только кристалл прогреется до 80°C, операционная система включит жесткий тепловой троттлинг. Частоты GPU упадут вдвое. Ваш реалтайм на 30 FPS превратится в 12 FPS, очередь буферов V4L2 переполнится, и приложение упадет по OOM (Out Of Memory). Вы обязаны мониторить температуру демоном, настраивать агрессивные профили вращения кулера через jetson_clocks и ограничивать энергопотребление через nvpmodel.
И самое главное — защита от зависаний. На edge нет сисадмина, который зайдет по SSH и поднимет упавший докер. Если инференс повис из-за аппаратного сбоя I2C-шины на MIPI-камере, устройство должно перезагрузиться само. Для этого мы намертво привязываем код к хардовому watchdog.
import os
import time
from systemd.daemon import notify, Notification
def run_inference_loop(model, camera):
# Сообщаем systemd, что инициализация TensorRT завершена
notify(Notification.READY)
# Читаем интервал ожидания watchdog из systemd.service
wd_usec = int(os.environ.get('WATCHDOG_USEC', 0))
wd_interval = (wd_usec / 1_000_000) / 2 if wd_usec else 0
last_ping = time.time()
while True:
frame = camera.read()
if frame is None:
continue
# Тяжелый прогон через NPU или GPU
results = model.infer(frame)
process_telemetry(results)
# Пингуем железный watchdog. Не успели — хард-ресет девайса.
if wd_interval and (time.time() - last_ping) > wd_interval:
notify(Notification.WATCHDOG)
last_ping = time.time()Это база. Не вставили пинг воркера в основной цикл? Ждите звонка в три часа ночи с просьбой найти электрика, который передернет рубильник на объекте за две тысячи километров от офиса.
Последний круг ада — обновление нейросетей на парке из сотен разбросанных коробок. Обновление по сети через пакетный менеджер ломается на 99% скачивания, оставляя систему в неконсистентном состоянии. Модели и рантайм должны обновляться атомарно. Скачали новый образ в фоновый раздел. Проверили криптографические подписи. Переключили флаг в загрузчике. Ребутнулись. Если новая модель словила segmentation fault при старте, watchdog убьет процесс, U-Boot увидит сбой и молча откатится на стабильный раздел. Клиент даже не узнает, что релиз был битым.