Развертывание YOLOv5 с помощью DeepSparse от Neural Magic#
Добро пожаловать в мир AI, поставляемого в виде программного обеспечения.
В этом руководстве объясняется, как развернуть YOLOv5 с помощью DeepSparse от Neural Magic.
DeepSparse — это среда выполнения инференса с исключительной производительностью на CPU. Например, по сравнению с базовым показателем ONNX Runtime DeepSparse обеспечивает ускорение YOLOv5s в 5,8 раза при работе на той же машине!
Впервые твои рабочие нагрузки глубокого обучения могут соответствовать требованиям производительности промышленной эксплуатации без сложностей и затрат, связанных с аппаратными ускорителями. Проще говоря, DeepSparse обеспечивает производительность GPU и простоту программного обеспечения:
- Гибкое развертывание: обеспечь стабильную работу в облаке, дата-центре и на периферийных устройствах с любым поставщиком оборудования — от Intel до AMD и ARM
- Неограниченная масштабируемость: масштабируйся вертикально до сотен ядер, горизонтально с помощью стандартного Kubernetes или полностью абстрагируй инфраструктуру с помощью Serverless
- Простая интеграция: используй понятные API для интеграции модели в приложение и мониторинга ее работы в продуктивной среде
Как DeepSparse достигает производительности уровня GPU?#
DeepSparse использует разреженность модели для повышения производительности.
Разреживание с помощью прореживания и квантования — это широко изученная методика, которая позволяет на порядок уменьшить размер сети и вычислительные ресурсы, необходимые для ее выполнения, сохраняя при этом высокую точность. 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, переданную одним из следующих способов:
- Заглушка SparseZoo, идентифицирующая файл ONNX в SparseZoo
- Локальный путь к модели ONNX в файловой системе
В приведенных ниже примерах используются стандартные плотная и прореженно-квантованная контрольные точки 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, который принимает исходные изображения и выдает ограничивающие рамки.
Создай 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, который полностью исключает зависимости от графического интерфейса:
pip install ultralytics-opencv-headlessHTTP-сервер#
DeepSparse Server работает поверх популярного веб-фреймворка FastAPI и веб-сервера Uvicorn. С помощью всего одной команды CLI ты можешь легко настроить конечную точку сервиса модели с DeepSparse. Server поддерживает любой Pipeline из DeepSparse, включая обнаружение объектов с YOLOv5, что позволяет отправлять на конечную точку исходные изображения и получать ограничивающие рамки.
Запусти Server с прореженно-квантованной YOLOv5s:
deepsparse.server \
--task yolo \
--model_path zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-noneПример запроса с использованием пакета requests для Python:
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 и сохранит внутри нее аннотированное изображение.
Сравнительное тестирование производительности#
Мы сравним пропускную способность 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 см. в документации Neural Magic по DeepSparse и статье в блоге Ultralytics об интеграции с DeepSparse.