В этом посте мы подробно расскажем о том, как мы измерили на стандартном облачном оборудовании пропускную способность и задержку пяти моделей ResNet-50 v1, оптимизированных для вывода данных ЦП. К концу поста вы сможете воспроизвести эти тесты, используя инструменты, доступные в репозитории Neural Magic на GitHub.

На прошлой неделе мы выпустили поддержку ResNet-50, поддержка YOLOv3 появится через несколько недель, а в ближайшие месяцы за ней последуют BERT и другие модели трансформаторов. Мы настоятельно рекомендуем вам попробовать неподдерживаемые модели и сообщить нам через очередь проблем на GitHub, поскольку мы упорно работаем над расширением нашего предложения по разреженным и разреженно-квантованным моделям.

Дополнительную информацию о ResNet, его обычном использовании, текущих ограничениях и подробностях о том, как Neural Magic изначально повысило производительность и экономичность моделей ResNet, см. В нашем предыдущем посте.

Введение в разрежение

Платформа Deep Sparse от Neural Magic предоставляет набор программных инструментов для выбора, построения и запуска разреженных моделей глубокого обучения на ресурсах ЦП. Воспользовавшись «разрежением», есть несколько способов подключения к DeepSparse Engine, который запускает разреженные модели, такие как ResNet-50, на ускоренных скоростях на процессорах. Итак, что такое спарсификация и почему вам это нужно?

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

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

  1. Скачайте рецепт и разреженную модель из SparseZoo.
  2. Как вариант, создайте рецепт своей модели с помощью Sparsify.
  3. Примените свой рецепт с помощью всего нескольких строк кода, используя SparseML.
  4. Наконец, для повышения производительности на уровне графического процессора на ЦП вы можете развернуть свою модель с разреженным квантованием с помощью DeepSparse Engine.

Вот полный поток продуктов Deep Sparse и различные пути к разреженному ускорению. Мы сосредоточим это обсуждение на том, как взять модель SparseZoo, а именно разреженно-квантованную ResNet-50, и протестировать ее с помощью DeepSparse Engine:

ResNet-50 v1: Бенчмаркинг с DeepSparse Engine

Подход

Чтобы заполнить SparseZoo, мы начали с предварительно обученного базового уровня ResNet-50 из подпакета torchvision models. Разреженные и квантованные модели были затем настроены с использованием наших воспроизводимых рецептов для восстановления точности, близкой к базовой.

Мы определяем три категории восстанавливаемости, чтобы облегчить понимание компромиссов, достигнутых в процессе разрежения:

  • Консервативный: точность сохранена на 100% от исходного уровня.
  • Умеренный: точность сохраняется ›= 99% от исходного уровня
  • Агрессивный: сохраняется точность ›= 95% от исходного уровня

У каждой модели в SparseZoo есть своя заглушка, которая определяет категорию восстанавливаемости. Посетите документацию SparseZoo по моделям, чтобы узнать больше о структуре заглушки:

Настройка оборудования и окружающая среда

DeepSparse Engine полностью независим от инфраструктуры и предназначен для подключения от периферийных развертываний к модельным серверам. Пока у него есть «правильные» процессоры (80% всего предложения Intel на сегодняшний день) с правильным набором инструкций для обеспечения производительности, такие как AVX-512, мы можем работать на любой облачной платформе. DeepSparse Engine автоматически использует наиболее эффективный набор инструкций для этой задачи.

Для этого упражнения эти тесты были запущены на экземпляре AWS c5.12xlarge с современным процессором Intel с поддержкой команд векторной нейронной сети AVX-512 (AVX-512 VNNI). Он разработан для ускорения рабочих нагрузок INT8, что позволяет увеличить скорость до 4 раз при переходе от логического вывода FP32 к INT8.

Мы использовали Ubuntu 20.04.1 LTS в качестве операционной системы с Python 3.8.5. Все зависимости тестирования содержатся в DeepSparse Engine, который можно установить с помощью

pip3 install deepsparse

Доступна более подробная информация о DeepSparse Engine и совместимом оборудовании.

Вы можете найти сценарий Python, используемый для генерации чисел DeepSparse в репозитории DeepSparse Engine на GitHub.

Контрольные измерения

Сохраняя это как можно более простым, эталонный тест измеряет полное сквозное время подачи входного пакета в двигатель и получения прогнозируемого выходного сигнала с полной точностью FP32.

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

Вот полный раздел синхронизации с сайта deepsparse / engine.py

start = time.time()
out = self.run(batch)
end = time.time()

ResNet-50 v1 Результаты пропускной способности

Для сценария пропускной способности мы использовали размер пакета 64 со случайным вводом с использованием всех доступных ядер.

Этот блок кода воспроизводит тестовую среду, в которой SPARSEZOO_MODEL_STUB заменен из таблицы выше.

from deepsparse import benchmark_model
import numpybatch_size = 64
sample_inputs = [numpy.random.randn(batch_size, 3, 224, 224).astype(numpy.float32)]results = benchmark_model(
    “SPARSEZOO_MODEL_STUB”,
    sample_inputs,
    batch_size=batch_size,
)
print(results)

В качестве примера подстановки это тестовая команда для Pruned Moderate FP32 ResNet-50:

results = benchmark_model(
"zoo:cv/classification/resnet_v1-50/pytorch/sparseml/imagenet/pruned-moderate",
    sample_inputs,
    batch_size=batch_size,
)
print(results)

ResNet-50 v1 Результаты задержки

Для сценария задержки мы использовали размер пакета 1 со случайным вводом с использованием всех доступных ядер.

Этот блок кода воспроизводит тестовую среду, в которой SPARSEZOO_MODEL_STUB заменен из приведенной выше таблицы.

from deepsparse import benchmark_model
import numpybatch_size = 1
sample_inputs = [numpy.random.randn(batch_size, 3, 224, 224).astype(numpy.float32)]results = benchmark_model(
    “SPARSEZOO_MODEL_STUB”,
    sample_inputs,
    batch_size=batch_size,
)
print(results)

Попробуйте прямо сейчас: Benchmark ResNet-50

Вот инструкции, чтобы воспроизвести этот опыт и результаты. После приобретения инфраструктуры выполнение этого упражнения займет у вас примерно 15–30 минут.

1. Зарезервируйте экземпляр c5.12xlarge на AWS; мы использовали Amazon Ubuntu 20.04 AMI

2. Установите pip и venv, если он еще не установлен с

sudo apt update && sudo apt install python3-pip python3-venv

3. Создайте и активируйте виртуальную среду для Python.

python3 -m venv benchmark-env && source benchmark-env/bin/activate

4. Установите DeepSparse Engine, запустив

pip3 install deepsparse

5. Клонируйте репозиторий DeepSparse Engine; он будет включать сценарий тестирования для воспроизведения чисел ResNet-50:

git clone https://github.com/neuralmagic/deepsparse.git

6. Воспроизведите сценарии пропускной способности и задержки, запустив сценарии Python:

python3 deepsparse/examples/benchmark/resnet50_benchmark.py --batch_size=64python3 deepsparse/examples/benchmark/resnet50_benchmark.py --batch_size=1

Оба сценария будут загружать различные разреженно-квантованные модели ResNet-50 из SparseZoo, сравнивать их с заданным размером пакета и распечатывать результаты итераций следующим образом:

Выводы

Модели с разреженным квантованием, такие как наши модели ResNet-50, обеспечивают привлекательные результаты производительности для тех, кто использует варианты классификации изображений и обнаружения объектов. С инструментами, легко доступными в GitHub, как вы можете видеть из результатов, использование моделей, использующих такие методы, как обрезка и квантование, может обеспечить ускорение более чем в 7 раз при использовании DeepSparse Engine с совместимым оборудованием.

ResNet-50 на этом не заканчивается. Neural Magic постоянно расширяет границы возможного с помощью разбиения на новые модели и наборы данных. Результаты этих улучшений помещаются в наши репозитории с открытым исходным кодом, чтобы все могли извлечь выгоду из включения новых эффективных моделей, последовательно добавляемых в SparseZoo, и новых методов, добавляемых в Sparsify и SparseML для работы с вашими собственными моделями.

Следующий шаг: перенести обучение

Чтобы перенести обучение ResNet-50 на свои данные, посетите наш пример в GitHub.

Ресурсы и дополнительная информация