Развертывание Ultralytics YOLOv5 с помощью DeepSparse от Neural Magic для достижения производительности уровня GPU на CPU
Усиль обучение и развертывание модели Ultralytics YOLOv5 с помощью DeepSparse от Neural Magic для достижения производительности уровня GPU на CPU. Получи более быстрое и масштабируемое развертывание YOLOv5.

Хочешь ускорить обучение и развертывание своих моделей YOLOv5? Мы поможем! Представляем нашего нового партнера — Neural Magic. Поскольку Neural Magic предоставляет программные инструменты, ориентированные на максимальную производительность моделей и простоту рабочих процессов, наше сотрудничество для создания решения, улучшающего процесс развертывания YOLOv5, было вполне естественным.
DeepSparse — это среда выполнения для инференса на CPU от Neural Magic, которая использует разреженность (sparsity) и вычисления с низкой точностью в нейронных сетях для обеспечения исключительной производительности на обычном оборудовании. Например, по сравнению с базовым ONNX Runtime, DeepSparse обеспечивает ускорение YOLOv5s в 5.8 раза на той же машине!

Впервые твои рабочие нагрузки глубокого обучения могут соответствовать производственным требованиям к производительности без сложности и затрат на аппаратные ускорители. Проще говоря, DeepSparse дает тебе производительность GPU и простоту программного обеспечения:
- Гибкое развертывание: Стабильная работа в облаке, центрах обработки данных и на периферийных устройствах с любым аппаратным обеспечением
- Бесконечная масштабируемость: Масштабируйся с помощью стандартного Kubernetes, вертикально до сотен ядер или полностью абстрактно с использованием serverless
- Простая интеграция: Используй понятные API для встраивания модели в приложение и её мониторинга в продакшене
Link to this sectionДостигай производительности уровня GPU на обычных CPU#
DeepSparse использует разреженность модели для достижения ускорения.
Разреживание (sparsification) за счет прунинга (pruning) и квантования (quantization) позволяет на порядки сократить объем и вычислительную мощность, необходимые для выполнения сети, сохраняя при этом высокую точность. DeepSparse учитывает разреженность, пропуская операции умножения-сложения с нулями и уменьшая объем вычислений в проходе forward. Поскольку разреженные вычисления ограничены скоростью памяти, DeepSparse выполняет сеть по глубине, разбивая задачу на «столбцы тензоров» (Tensor Columns) — вертикальные полосы вычислений, которые помещаются в кэш.

Разреженные сети со сжатыми вычислениями, выполняемые по глубине в кэше, позволяют DeepSparse обеспечить производительность уровня GPU на CPU!
Link to this sectionСоздай разреженную версию YOLOv5, обученную на твоих данных#
В репозитории моделей с открытым исходным кодом от Neural Magic, SparseZoo, содержатся предварительно разреженные чекпоинты каждой модели YOLOv5. Используя SparseML, который интегрирован с Ultralytics, ты можешь дообучить (fine-tune) разреженный чекпоинт на своих данных с помощью одной команды CLI.
Link to this sectionРазвертывание YOLOv5 с помощью DeepSparse#
Link to this sectionУстановка DeepSparse#
Выполни следующую команду для установки DeepSparse. Мы рекомендуем использовать виртуальное окружение с Python.
pip install deepsparse[server,yolo,onnxruntime]Link to this sectionПолучи файл ONNX#
DeepSparse принимает модель в формате ONNX, передаваемую как:
- Локальный путь к модели ONNX
- Заглушка (stub) SparseZoo, которая идентифицирует модель в SparseZoo
Мы сравним стандартную плотную (dense) YOLOv5s с прунинг-квантованной YOLOv5s, идентифицируемой следующими заглушками SparseZoo:
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none
zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-noneLink to this sectionРазвертывание модели#
DeepSparse предлагает удобные API для интеграции твоей модели в приложение.
Чтобы попробовать примеры развертывания ниже, скачай пример изображения и сохрани его как basilica.jpg с помощью следующей команды:
wget -O basilica.jpg https://raw.githubusercontent.com/neuralmagic/deepsparse/main/src/deepsparse/yolo/sample_images/basilica.jpgLink to this sectionPython API#
Пайплайны (Pipelines) объединяют предобработку и пост-обработку вывода вокруг среды выполнения, предоставляя понятный интерфейс для добавления DeepSparse в приложение. Интеграция DeepSparse-Ultralytics включает готовый к использованию Пайплайн, который принимает «сырые» изображения и выводит ограничивающие рамки (bounding boxes).
Создай Пайплайн и запусти инференс:
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)Если ты запускаешь код в облаке, ты можешь столкнуться с ошибкой, что open-cv не может найти libGL.so.1. Запуск следующей команды в Ubuntu устранит проблему:
apt-get install libgl1-mesa-glxLink to this sectionHTTP сервер#
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Пример запроса с использованием пакета requests в Python:
import requests, json
# 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"]Link to this sectionAnnotate 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 и сохранит в ней аннотированное изображение.

Link to this sectionБенчмаркинг производительности#
Используя скрипт бенчмаркинга DeepSparse, мы сравним пропускную способность DeepSparse с ONNX Runtime на YOLOv5s.
Бенчмарки были запущены на инстансе AWS c6i.8xlarge (16 ядер).
Link to this sectionСравнение производительности на батче 32#
Link to this sectionБазовая линия 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Путь к исходной модели: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none Размер батча: 32 Сценарий: sync Пропускная способность (элементов/сек): 41.9025
Link to this sectionПроизводительность плотной модели в 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Путь к исходной модели: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none Размер батча: 32 Сценарий: sync Пропускная способность (элементов/сек): 69.5546
Link to this sectionПроизводительность разреженной модели в 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Путь к исходной модели: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none Размер батча: 32 Сценарий: sync Пропускная способность (элементов/сек): 241.2452
Link to this sectionСравнение производительности на батче 1#
DeepSparse также способен получить преимущество в скорости по сравнению с ONNX Runtime для чувствительного к задержкам сценария с батчем 1.
Link to this sectionБазовая линия 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Путь к исходной модели: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/base-none Размер батча: 1 Сценарий: sync Пропускная способность (элементов/сек): 48.0921
Link to this sectionПроизводительность разреженной модели в DeepSparse#
Когда к модели применяется разреженность, прирост производительности DeepSparse по сравнению с ONNX Runtime становится еще существеннее.
При батче 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Путь к исходной модели: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none Размер батча: 1 Сценарий: sync Пропускная способность (элементов/сек): 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Путь к исходной модели: zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned35_quant-none-vnni Размер батча: 1 Сценарий: sync Пропускная способность (элементов/сек): 179.7375
И вуаля! Ты готов оптимизировать развертывание YOLOv5 с помощью DeepSparse.
Link to this sectionНачни работу с YOLOv5 и DeepSparse#
Чтобы связаться с нами, присоединяйся к нашему сообществу и оставляй свои вопросы и комментарии. Ознакомься с репозиторием Ultralytics YOLOv5 и полной документацией Neural Magic по развертыванию YOLOv5.
В Ultralytics мы сотрудничаем с другими стартапами, чтобы финансировать исследования и разработку наших потрясающих инструментов с открытым исходным кодом, таких как YOLOv5, и поддерживать их бесплатными для всех. Эта статья может содержать партнерские ссылки на этих партнеров.






