Развертывание YOLOv5 с помощью DeepSparse от Neural Magic#
Добро пожаловать в эру программно-определяемого ИИ.
В этом руководстве объясняется, как развернуть YOLOv5 с помощью DeepSparse от Neural Magic.
DeepSparse — это среда выполнения (runtime) для инференса, обеспечивающая исключительную производительность на CPU. Например, по сравнению с базовым показателем ONNX Runtime, DeepSparse дает ускорение в 5.8 раза для YOLOv5s на той же самой машине!
Впервые твои рабочие нагрузки deep learning могут соответствовать требованиям производительности в продакшене без сложностей и затрат на аппаратные ускорители. Проще говоря, DeepSparse дает тебе производительность GPU и простоту софта:
- Гибкое развертывание: работай стабильно в облаке, центрах обработки данных и на периферии (edge) с любым оборудованием от Intel до AMD и ARM
- Бесконечная масштабируемость: масштабируй вертикально до сотен ядер, горизонтально с помощью стандартного Kubernetes или полностью абстрагируйся с помощью Serverless
- Простая интеграция: понятные API для встраивания модели в приложение и ее мониторинга в продакшене
Как DeepSparse достигает производительности уровня GPU?#
DeepSparse использует разреженность (sparsity) моделей для повышения производительности.
Разрежение (sparsification) путем прунинга и квантования — это широко изучаемый метод, позволяющий в разы сократить размер и объем вычислений, необходимые для выполнения сети, при сохранении высокой точности. DeepSparse учитывает разреженность, то есть пропускает обнуленные параметры, сокращая объем вычислений в прямом проходе. Поскольку разреженные вычисления теперь ограничены памятью, DeepSparse выполняет сеть по глубине, разбивая задачу на Tensor Columns — вертикальные полосы вычислений, которые помещаются в кэш.
Разреженные сети со сжатыми вычислениями, выполняемые по глубине в кэше, позволяют 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, которая передается либо как:
- Стаб (stub) 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.jpgPython 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-headlessHTTP сервер#
DeepSparse Server работает на базе популярного веб-фреймворка FastAPI и веб-сервера Uvicorn. С помощью всего одной команды CLI ты можешь легко настроить эндпоинт службы моделей с помощью DeepSparse. Сервер поддерживает любой пайплайн из DeepSparse, включая обнаружение объектов с помощью YOLOv5, позволяя отправлять необработанные изображения на эндпоинт и получать ограничивающие рамки.
Запусти сервер с прунинг-квантованной моделью YOLOv5s:
deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-noneПример запроса с использованием пакета Python requests:
import json
from contextlib import ExitStack
import requests
# list of images for inference (local files on client side)
path = ["basilica.jpg"]
# send request over HTTP to /predict/from_files endpoint
url = "http://0.0.0.0:5543/predict/from_files"
with ExitStack() as stack:
files = [("request", stack.enter_context(open(img, "rb"))) for img in path]
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 и сохранит внутри аннотированное изображение.
Бенчмаркинг производительности#
Мы сравним пропускную способность (throughput) 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 (dense)#
Хотя 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 (sparse)#
Когда к модели применяется разреженность, прирост производительности 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 (sparse)#
При размере батча 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 элементов/сек с 4-блочной прунинг-квантованной YOLOv5s — это прирост производительности в 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 ознакомься с документацией Neural Magic по DeepSparse и постом в блоге Ultralytics об интеграции DeepSparse.