Развертывание Ultralytics YOLOv5 с DeepSparse от Neural Magic для производительности класса GPU на центральных процессорах

Команда Ultralytics

5 минут чтения

5 января 2023 г.

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

Хотите ускорить процесс обучения и внедрения моделей YOLOv5? Мы поможем вам! Представляем вам нашего нового партнера, компанию Neural Magic. Поскольку Neural Magic предоставляет программные инструменты, в которых особое внимание уделяется максимальной производительности моделей и простоте рабочего процесса, вполне естественно, что мы объединились, чтобы предложить решение, которое сделает процесс развертывания YOLOv5 еще лучше.

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

Сравнение производительности YOLOv5 с DeepSparse

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

  1. Гибкость развертывания: Последовательная работа в облаке, центре обработки данных и на границе с любым поставщиком оборудования
  2. Бесконечная масштабируемость: Масштабирование с помощью стандартного Kubernetes, вертикальное масштабирование до 100 тысяч ядер или полная абстракция с помощью бессерверных технологий.
  3. Простая интеграция: Используйте чистые API для интеграции вашей модели в приложение и ее мониторинга в производстве

Достигайте производительности класса GPU на центральных процессорах.

DeepSparse использует преимущества разреженности модели для ускорения работы.

Разрежение с помощью обрезки и квантования позволяет на порядок сократить размер и количество вычислений, необходимых для выполнения сети, при сохранении высокой точности. DeepSparse ориентируется на разреженность, пропуская умножение-добавление на ноль и сокращая объем вычислений в прямом проходе. Поскольку разреженные вычисления занимают много памяти, DeepSparse выполняет сеть в глубину, разбивая задачу на тензорные столбцы, которые представляют собой вертикальные полосы вычислений, помещающиеся в кэш.

Сеть YOLOv5 с глубоким разбросом и сверхвысокой точностью

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

Создание разреженной версии YOLOv5, обученной на пользовательских данных

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

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

Установите DeepSparse

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

pip install deepsparse[server,yolo,onnxruntime]

Соберите файл ONNX

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

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

Мы сравним стандартные плотные YOLOv5 с обрезанными квантованными YOLOv5, обозначенными следующими шлейфами 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

API Python

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

Создайте конвейер и запустите вывод:

из deepsparse import Pipeline

# список изображений в локальной файловой системе
images = ["basilica.jpg"]

# создать конвейер
model_stub = "zoo:cv/detection/yolov5-s/pytorch/ultralytics/coco/pruned65_quant-none"
yolo_pipeline = Pipeline.create(
task="yolo",
model_path=model_stub,
)

# выполняем вывод на изображениях, получаем ограничительные рамки + классы
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-glx

HTTP-сервер

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:

импорт запросов, json

# список изображений для вывода (локальные файлы на стороне клиента)
path = ['basilica.jpg']
files = [('request', open(img, 'rb')) for img in path]

# отправляем запрос по HTTP на конечную точку /predict/from_files
url = 'http://0.0.0.0:5543/predict/from_files'
resp = requests.post(url=url, files=files)

# ответ возвращается в JSON
annotations = json.loads(resp.text) # словарь результатов аннотаций
bounding_boxes = annotations["boxes"]
labels = annotations["labels"]

Annotate 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

Эталонная производительность

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

Бенчмарки выполнялись на экземпляре AWS c6i.8xlarge (16 ядер).

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

Базовый уровень времени выполнения ONNX

При партии 32 ONNX Runtime достигает скорости 42 изображения/с при использовании стандартных плотных YOLOv5:

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

Производительность DeepSparse Dense

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

При партии 32 DeepSparse достигает 70 изображений/с со стандартной плотностью YOLOv5, чтов 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

Производительность DeepSparse Sparse

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

В партии 32 DeepSparse достигает скорости 241 изображение/с с обрезанным и квантованным YOLOv5, чтов 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

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

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

Базовый уровень времени выполнения ONNX

В партии 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

Производительность DeepSparse Sparse

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

В партии 1 DeepSparse достигает скорости 135 изображений/с с обрезанным и квантованным YOLOv5, чтов 2,8 раза превышает производительность ONNX Runtime!

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
> Размер партии: 1
> Сценарий: sync
> Пропускная способность (элементов/сек): 134.9468

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

В партии 1 DeepSparse достигает 180 элементов/с с 4-блочным обрезанно-квантованным YOLOv5 -прирост производительности в 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.

Начните работу с YOLOv5 и DeepSparse

Чтобы связаться с нами, присоединяйтесь к нашему сообществу и оставляйте нам свои вопросы и комментарии. Ознакомьтесь с репозиторием Ultralytics YOLOv5 и полной документацией Neural Magic по развертыванию YOLOv5.

В Ultralytics мы на коммерческой основе сотрудничаем с другими стартапами, которые помогают нам финансировать исследования и разработку наших замечательных инструментов с открытым исходным кодом, таких как YOLOv5, чтобы они оставались бесплатными для всех. Эта статья может содержать партнерские ссылки на этих партнеров.

Давайте вместе построим будущее
искусственного интеллекта!

Начните свое путешествие в будущее машинного обучения

Начните бесплатно
Ссылка копируется в буфер обмена