Развертывание YOLOv5 с помощью DeepSparse от Neural Magic

Добро пожаловать в эру программного обеспечения для ИИ.

В этом руководстве объясняется, как развернуть YOLOv5 с помощью DeepSparse от Neural Magic.

DeepSparse — это среда выполнения вывода с исключительной производительностью на CPU. Например, по сравнению с базовой линией ONNX Runtime, DeepSparse обеспечивает ускорение в 5,8 раз для YOLOv5s на той же машине!

YOLOv5 DeepSparse vs ONNX Runtime speed comparison chart

Впервые твои рабочие нагрузки deep learning могут соответствовать производственным требованиям к производительности без сложности и затрат на аппаратные ускорители. Проще говоря, DeepSparse дает тебе производительность GPU при простоте программного обеспечения:

  • Гибкое развертывание: стабильная работа в облаке, центрах обработки данных и на периферийных устройствах с любым оборудованием, от Intel до AMD и ARM.
  • Бесконечная масштабируемость: вертикальное масштабирование до сотен ядер, горизонтальное с использованием стандартного Kubernetes или полная абстракция с помощью Serverless.
  • Простая интеграция: понятные API для встраивания модели в приложение и мониторинга её в рабочей среде.

Как DeepSparse достигает производительности уровня GPU?

DeepSparse использует разреженность (sparsity) модели для достижения прироста производительности.

Разреживание (sparsification) посредством прунинга (pruning) и квантования — это широко изученная техника, позволяющая на порядки уменьшить размер и вычислительные ресурсы, необходимые для выполнения сети, при сохранении высокой точности. DeepSparse учитывает разреженность, пропуская обнуленные параметры и сокращая количество вычислений при прямом проходе. Поскольку разреженные вычисления теперь ограничены памятью, DeepSparse выполняет сеть послойно, разбивая задачу на Tensor Columns — вертикальные полосы вычислений, которые помещаются в кэш.

DeepSparse tensor columns for sparse neural network inference

Разреженные сети со сжатыми вычислениями, выполняемые послойно в кэше, позволяют DeepSparse обеспечивать производительность уровня GPU на CPU!

Как создать разреженную версию YOLOv5, обученную на моих данных?

В репозитории моделей с открытым исходным кодом от Neural Magic, SparseZoo, содержатся предварительно разреженные чекпоинты для каждой модели YOLOv5. Используя SparseML, который интегрирован с Ultralytics, ты можешь дообучить разреженный чекпоинт на своих данных с помощью одной команды CLI.

Ознакомься с документацией Neural Magic по YOLOv5 для получения дополнительных подробностей.

Использование DeepSparse

Мы разберем пример бенчмаркинга и развертывания разреженной версии YOLOv5s с помощью DeepSparse.

Установка DeepSparse

Выполни следующее, чтобы установить DeepSparse. Мы рекомендуем использовать виртуальное окружение с Python.

pip install "deepsparse[server,yolo,onnxruntime]"

Получение файла ONNX

DeepSparse принимает модель в формате ONNX, передаваемую одним из способов:

  • Заглушка SparseZoo, которая идентифицирует файл ONNX в SparseZoo
  • Локальный путь к модели ONNX в файловой системе

В примерах ниже используются стандартные плотные (dense) и прунинг-квантованные чекпоинты YOLOv5s, идентифицируемые следующими заглушками SparseZoo:

zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none

Развертывание модели

DeepSparse предлагает удобные API для интеграции твоей модели в приложение.

Чтобы попробовать примеры развертывания ниже, скачай образец изображения и сохрани его как basilica.jpg с помощью следующего кода:

wget -O basilica.jpg https://raw.githubusercontent.com/neuralmagic/deepsparse/main/src/deepsparse/yolo/sample_images/basilica.jpg

Python API

Pipelines оборачивают предварительную обработку и постобработку вывода вокруг среды выполнения, предоставляя чистый интерфейс для добавления DeepSparse в приложение. Интеграция DeepSparse-Ultralytics включает готовый Pipeline, который принимает исходные изображения и выводит ограничивающие рамки (bounding boxes).

Создай Pipeline и запусти вывод:

from deepsparse import Pipeline

# list of images in local filesystem
images = ["basilica.jpg"]

# create Pipeline
model_stub = "zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none"
yolo_pipeline = Pipeline.create(
    task="yolo",
    model_path=model_stub,
)

# run inference on images, receive bounding boxes + classes
pipeline_outputs = yolo_pipeline(images=images, iou_thres=0.6, conf_thres=0.001)
print(pipeline_outputs)

Если ты работаешь в облаке, ты можешь получить ошибку о том, что OpenCV не может найти libGL.so.1. Ты можешь либо установить отсутствующую библиотеку:

apt-get install libgl1

Либо использовать headless-пакет Ultralytics, который полностью избавлен от зависимостей GUI:

pip install ultralytics-opencv-headless

HTTP-сервер

Сервер DeepSparse работает поверх популярного веб-фреймворка FastAPI и веб-сервера Uvicorn. С помощью одной единственной команды CLI ты можешь легко настроить конечную точку сервиса модели с DeepSparse. Сервер поддерживает любой конвейер из DeepSparse, включая обнаружение объектов с помощью YOLOv5, что позволяет тебе отправлять исходные изображения на конечную точку и получать ограничивающие рамки.

Запусти сервер с прунинг-квантованной моделью YOLOv5s:

deepsparse.server \
  --task yolo \
  --model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none

Пример запроса с использованием пакета requests в Python:

import json

import requests

# list of images for inference (local files on client side)
path = ["basilica.jpg"]
files = [("request", open(img, "rb")) for img in path]

# send request over HTTP to /predict/from_files endpoint
url = "http://0.0.0.0:5543/predict/from_files"
resp = requests.post(url=url, files=files)

# response is returned in JSON
annotations = json.loads(resp.text)  # dictionary of annotation results
bounding_boxes = annotations["boxes"]
labels = annotations["labels"]

CLI для аннотирования

Ты также можешь использовать команду annotate, чтобы движок сохранил аннотированное фото на диск. Попробуй --source 0, чтобы аннотировать поток с твоей веб-камеры в реальном времени!

deepsparse.object_detection.annotate --model_filepath zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none --source basilica.jpg

Запуск приведенной выше команды создаст папку annotation-results и сохранит внутри аннотированное изображение.

YOLOv5 detection results with bounding boxes

Бенчмаркинг производительности

Мы сравним пропускную способность DeepSparse и ONNX Runtime на модели YOLOv5s, используя скрипт бенчмаркинга DeepSparse.

Тесты производительности были проведены на инстансе AWS c6i.8xlarge (16 ядер).

Сравнение производительности при размере пакета 32

Базовая линия ONNX Runtime

При размере пакета 32 ONNX Runtime достигает 42 изображений/сек со стандартной плотной YOLOv5s:

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1 -e onnxruntime

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
# Batch Size: 32
# Scenario: sync
# Throughput (items/sec): 41.9025

Производительность плотной модели в DeepSparse

Хотя DeepSparse показывает лучшую производительность с оптимизированными разреженными моделями, он также хорошо работает со стандартной плотной YOLOv5s.

При размере пакета 32 DeepSparse достигает 70 изображений/сек со стандартной плотной YOLOv5s, что является улучшением производительности в 1,7 раза по сравнению с ORT!

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 32 -nstreams 1

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
# Batch Size: 32
# Scenario: sync
# Throughput (items/sec): 69.5546

Производительность разреженной модели в DeepSparse

Когда к модели применяется разреженность, прирост производительности DeepSparse по сравнению с ONNX Runtime становится еще более значительным.

При размере пакета 32 DeepSparse достигает 241 изображения/сек с прунинг-квантованной YOLOv5s, что является улучшением производительности в 5,8 раза по сравнению с ORT!

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 32 -nstreams 1

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
# Batch Size: 32
# Scenario: sync
# Throughput (items/sec): 241.2452

Сравнение производительности при размере пакета 1

DeepSparse также способен получить ускорение по сравнению с ONNX Runtime для сценария с размером пакета 1, чувствительного к задержкам.

Базовая линия ONNX Runtime

При размере пакета 1 ONNX Runtime достигает 48 изображений/сек со стандартной плотной YOLOv5s.

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none -s sync -b 1 -nstreams 1 -e onnxruntime

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
# Batch Size: 1
# Scenario: sync
# Throughput (items/sec): 48.0921

Производительность разреженной модели в DeepSparse

При размере пакета 1 DeepSparse достигает 135 изображений/сек с прунинг-квантованной YOLOv5s, прирост производительности в 2,8 раза по сравнению с ONNX Runtime!

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none -s sync -b 1 -nstreams 1

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none
# Batch Size: 1
# Scenario: sync
# Throughput (items/sec): 134.9468

Поскольку инстансы c6i.8xlarge имеют инструкции VNNI, пропускная способность DeepSparse может быть дополнительно увеличена, если веса прунятся блоками по 4.

При размере пакета 1 DeepSparse достигает 180 изображений/сек с прунинг-квантованной YOLOv5s с блоками по 4, что является приростом производительности в 3,7 раза по сравнению с ONNX Runtime!

deepsparse.benchmark zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni -s sync -b 1 -nstreams 1

# Original Model Path: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni
# Batch Size: 1
# Scenario: sync
# Throughput (items/sec): 179.7375

Начало работы с DeepSparse

Исследования или тестирование? DeepSparse Community предоставляется бесплатно для исследований и тестирования. Начни работу с их документацией.

Для получения дополнительной информации о развертывании YOLOv5 с помощью DeepSparse ознакомься с документацией DeepSparse от Neural Magic и записью в блоге Ultralytics об интеграции DeepSparse.

Комментарии