Deep Learning Inference Benchmark — измеряем скорость работы моделей глубокого обучения

Перед разработчиками встает задача определения производительности железа в задаче исполнения глубоких моделей. Например, хочется решить проблему анализа пола-возраста покупателей, которые заходят в магазин, чтобы в зависимости от этого менять оформление магазина или наполнение товаром. Вы уже знаете какие модели хотите использовать в вашем ПО, но до конца не понятно как выбрать железо. Можно выбрать самый топ и переплачивать как за простаивающие мощности, так и за электроэнергию. Можно взять самый дешевый i3 и потом вдруг окажется, что он может вывезти каскад из нескольких глубоких моделей на 8 камерах. А может быть камера всего одна, и для решения задачи достаточно Raspberry Pi с Movidius Neural Compute Stick? Поэтому хочется иметь инструмент для оценки скорости работы вашего инференса на разном железе, причем еще до начала обучения.
В целом можно выделить три направления работы с глубокими моделями:
- Обучение. На обучение глубоких моделей уходит требуется много, очень много, а иногда и очень-очень много вычислительной мощности. Начиная с первой ласточки AlexNet (61 миллион параметров), и заканчивая GPT-3 с 175 миллиардами параметров.
- Transfer Learning. Берем существующую модель (как правило решающую задачу классификации), и используем ее в качестве основы для собственной модели. Количество ресурсов для дообучения или переобучения можно значительно уменьшить по сравнению с обучением с нуля.
- Использование моделей глубокого обучения в работе (Inference). Для использования глубоких моделей в прикладных задачах требуется минимизировать использование ресурсов. Решается это различными способами: использование оптимизированных библиотек, которые максимально плотно заполняют конвейер процессора вычислениями; конвертация параметров модели из fp32 в fp16, int8 или даже int1; использование специализированных ускорителей (GPU, TPU, FPGA, нейронные сопроцессоры).
Общую схему решения задач с использованием глубокого обучения можно представить следующим образом:

Из лекции курса по современным методам и технологиям глубокого обучения в компьютерном зрении
Как правило, требования по скорости заложены еще на этапе постановки задачи, и хочется еще до начала обучения или дообучения узнать «уложится» или нет предполагаемая модель в доступные для инференса ресурсы. И для решения этой задачи был создан DLI benchmark.
DLI benchmark
В рамках лаборатории ITLab студентами ННГУ им. Н.И.Лобачевского был разработан открытый фреймворк DLI (https://github.com/itlab-vision/dl-benchmark), который позволяет запустить измерение производительности большого количества разных моделей на доступном железе.
Основные требования, которые были заложены на этапе разработки:
- Измерять время работы того, как модель будет работать в реальном Python приложении.
Мы включили в подсчет времени собственно исполнение модели и копирование обрабатываемых данных из python в библиотеку инференса (это может показать влияние на маленьких моделях). - Обладать модульной архитектурой, чтобы иметь возможность включать в тестирование новые фреймворки, новые модели, новое железо.
Архитектура фреймворка
- Target Hardware — устройства для выполнения замеров. Предполагается, что на этом компьютере установлено необходимое программное обеспечение (сейчас это делается в Docker) и подготовлен набор моделей для тестирования.
- FTP-сервер — хранит конфигурации тестов для каждого тестируемого устройства и результаты измерений.
- Integrator — это компонент, предназначенный для сбора результатов производительности.

Схема со страницы проекта
Алгоритм работы DLI-benchmark:
- Интегратор создает структуру каталогов на FTP-сервере и генерирует файлы конфигурации тестов для инференса на доступных машинах
- Интегратор запускает анализ производительности на каждом устройстве. Анализ производительности на конкретном устройстве включает получение файла конфигурации тестов и последовательное выполнение тестов для каждой модели в отдельном процессе. Измерения производительности собираются во время тестов.
- По завершении тестов результаты производительности копируются из FTP-сервер.
- После того, как бенчмарк завершит все тесты на всём оборудовании, полученные результаты сохраняются в виде csv-таблицы, которая автоматически конвертируется в html-страницу для сайта проекта.
Типы экспериментов
В целом разработчикам привычен синхронный вариант работы программы, когда сначала читается картинка из файла, масштабируется под размер входа сети, вызывается функция run или forward , и цикл начинается сначала.
При обработке картинок по одной вычислительное устройство очень часто недогружено. Можно подать два изображения одной пачкой (batch=2), тогда они обработаются быстрее чем два изображения по отдельности. При увеличении размера пачки производительность сначала начнет расти, а потом падать, и определить лучший размер пачки весьма полезно.
В современных фреймворках поддерживается асинхронный режим работы, когда не нужно дожидаться конца обработки предыдущего изображения, можно новую картинку начать обрабатывать сразу после поступления. При использовании асинхронного API в OpenVINO можно создавать реквесты по 1 картинке независимо и при этом получать по прежнему высокую производительность и при этом низкие задержки. Возможность получать высокую производительность, сохраняя при этом низкие задержки, открывает новые возможности для инференса глубоких моделей на многосокетных высокопроизводительных системах.
Метрики производительности
- Латентность или задержка (Latency) — медианное время обработки одной пачки картинок.
- Среднее время одного прохода (Average time of a single pass) — отношение общего времени обработки всех пачек к числу итераций цикла тестирования.
- Среднее количество кадров, обрабатываемых за секунду (Frames per Second, FPS) — отношение размера пачки изображений к латентности.
В случае когда мы можем подавать несколько картинок независимо друг от друга (асинхронный запуск на обработку), мы используем другие метрики производительности.
- Среднее время одного прохода (Average time of a single pass) — отношение времени обработки всех пачек к количеству итераций цикла тестирования. Представляет собой время выполнения одновременно созданных пачек на устройстве.
- Среднее количество кадров, обрабатываемых за секунду (Frames per Second, FPS) — отношение произведения размера пачки изображений и числа итераций ко времени обработки всех пачек.
Анализ результатов
В ходе экспериментов мы попробовали бенчмарк на различном оборудовании: CPU i7-7700K, i5-8600K, i3-7100, i7-8700, i3-8100, GPU Intel HD Graphics 630, Intel Neural Compute Stick 2.
Пока опубликовали результаты только для фреймворка OpenVINO. Докеры бенчмарка с Caffe, TensofFlow и PyTorch в разработке.
Для демонстрации примеров работы возьмем модель ResNet-152 — это очень объемная модель, которая решает задачу классификации ImageNet.
На графике ниже представлена время обработки одной пачки картинок в различных режимах. На данном графике по оси X отложено количество потоков процессора, которые были использованы для обработки изображений, а по оси Y — среднее время обработки (или задержка, latency) одной пачки изображений. На этом графике мы видим, что при удвоении использованных потоков скорость обработки увеличивается примерно в два раза — это означает отличную параллеллизацию в обработке изображений. Что важно, параллелизация показывает хорошие результаты и для большой пачки картинок, и для одиночной картинки.

Чтобы посчитать FPS (сколько в среднем картинок в секунду обработает процессор в каждом режиме работы) нужно количество картинок в пачке разделить на время обработки одной пачки. Эти данные мы приведем в таблице ниже.

Взглянув на эти цифры, мы видим, что если мы будем использовать все 6 ядер процессора, что при обработке картинок пачками по 8 штук производительность возрастает на 20% из-за более плотной упаковки вычислений. Но в прикладном ПО не слишком хочется писать дополнительные функции, чтобы собирать картинки в пачки, да и задержки тогда возрастают…
В этом случае нам на помощь приходит асинхронный запуск нескольких картинок на обработку! OpenVINO поддерживает возможность не собирать из картинок большую пачку, а подавать картинки независимо друг от друга не дожидаясь завершения обработки предыдущей. В данном режиме вы задаете в программе количество «стримов» (это не поток процессора; это сущность, которая захватывает один или несколько потоков процессора и обрабатывает в себе картинку), и можете независимо запускать на обработку картинки по мере поступления.

С использованием OpenVINO в асинхронном режиме с размером пачки в 1 картинку мы почти достигаем производительности, полученной в синхронном режиме с размером пачки 8, при этом почти не меняя код запуска моделей.
Результаты производительности 63 моделей на CPU, Intel GPU и Intel Neural Compute Stick 2 собраны в HTML-таблиц, посмотреть их можно здесь:
http://hpc-education.unn.ru/en/dli
Пока мы измеряли только производительность моделей, сконвертированных в OpenVINO. Уже пишется код для тестирования моделей Caffe, и в разработке другие библиотеки глубокого обучения.
Кустикова Валентина, Васильев Евгений, Хватов Александр, Кумбрасьев Павел
Изображения в статье взяты из публикации: Kustikova V., Vasilyev E., Khvatov A., Kumbrasiev P., Rybkin R., Kogteva N. DLI: Deep Learning Inference Benchmark // Communications in Computer and Information Science. V. 1129. 2019. P. 542-553. https://link.springer.com/chapter/10.1007/978-3-030-36592-9_44
- компьютерное зрение
- глубокое обучение
- бенчмарк
- производительность
- openvino
- intel
- Блог компании Intel
- Высокая производительность
- Python
- Программирование
- Машинное обучение
Термины и сокращения
Application Programming Interface — программный интерфейс приложений, описание способов для обмена данными между приложениями.
Comma-Separated Values — текстовый формат для представления табличных данных.
Процесс инференса модели без осуществления деплоя с использованием исходных данных в виде ссылки на датасет на бакете пользователя с последующей отгрузкой результата на бакет пользователя.
Хранилище репозиториев с образами, которые загружены на платформу ML Space и могут быть использованы в ее модулях.
Graphics processing unit — графический процессор, предназначенный для обработки графики и высокопроизводительных вычислений.
Hadoop Distributed File System — файловая система, предназначенная для хранения файлов больших размеров, поблочно распределенных между узлами вычислительного кластера.
HyperText Transfer Protocol — протокол передачи данных по схеме «запрос-ответ».
Структура, хранящая метаинформацию о стандартных файлах, каталогах или других объектах файловой системы, кроме непосредственно данных и названия. Используется во всех ОС UNIX файловых системах.
JavaScript Object Notation — текстовый формат обмена данными, основанный на JavaScript.
Серверное приложение, позволяющее запускать Jupyter Notebook и JupyterLab — командные графические оболочки для интерактивных вычислений.
Среда разработки, в которой код можно разбить по ячейкам, выполнять их в любом порядке и сразу видеть результат. Файл Jupyter Notebook сохраняется с расширением .ipynb .
Собственное горячее хранилище в каждом регионе размещения вычислительных ресурсов. Точкой монтирования NFS-хранилища по умолчанию является текущий рабочий каталог пользователя /home/jovyan .
Representational State Transfer — набор архитектурных принципов для построения распределенных масштабируемых веб-сервисов.
Сервис хранения объектов, разработанный компанией Amazon.
Secure Shell — сетевой протокол для удаленного управления операционной системой и туннелирования TCP-соединений. Шифрует весь трафик, включая передаваемые пароли.
Выделенная часть ресурсов, закрепленная за одним определенным клиентом.
Процесс выполнения запросов ML-моделью, при котором входящие запросы ставятся в очередь и обрабатываются асинхронно, то есть не дожидаясь подтверждения о полном завершении задач предыдущего шага. Асинхронный инференс необходимо использовать для запросов с большим объемом вычислений, обработки больших объемов данных, длительным временем обработки и при наличии требований работы в режиме реального времени. Асинхронная обработка также позволяет оптимально реализовать преимущества автомасштабирования.
Образ, содержащий набор фреймворков и библиотек для использования в одном из модулей ML Space, заранее созданный командой ML Space. Базовые образы могут служить в качестве основы для создания кастомных образов или использоваться непосредственно для запуска окружений и задач.
Логическая сущность, соответствующая экземпляру облачного объектного хранилища, которая служит для хранения и организации объектов.
Среда совместного управления данными и артефактами машинного обучения (задачами, экспериментами, деплоями) на платформе ML Space.
Набор данных, используемых в том числе для решения задач машинного обучения. Датасетами, как правило, являются наборы табличных данных. Датасет может состоять из коллекции файлов или документов, с метками или без них.
Процесс развертывания сервиса, осуществляющего инференс модели или выполняющего другие функции, в тестовую или промышленную эксплуатацию.
Сущность, порождающая запуск одного или группы контейнеров, в которых производится распределенное обучение модели машинного обучения.
Процесс исполнения обученных моделей машинного обучения для получения предсказаний на данных, поданных на вход модели.
Сегмент, из которого передается информация.
Образ, собранный пользователем самостоятельно средствами платформы ML Space или загруженный на нее. Сохраняет или наследует необходимый для использования в модулях ML Space набор фреймворков и библиотек.
Совокупность драйвера и настроек подключения к экземплярам, обладающим возможностью хранения файлов, например к базам данных и файловым хранилищам.
Стандартная единица программного обеспечения, в которую упаковано приложение со всеми необходимыми для его работы зависимостями — кодом приложения, средой запуска, системными инструментами, библиотеками и настройками. Контейнеры разворачиваются из образов.
Процесс создания математических моделей данных, которые обладают возможностью решать задачи прогнозирования без использования непосредственных инструкций за счет применения решений множества сходных задач.
Сегмент, в который осуществляется перенос информации.
Единица хранения данных. Объектом может быть один или несколько файлов, а также папка.
Процесс подключения к источнику и перемещение данных в место назначения согласно заданным правилам и с определенной периодичностью.
Группа из одного или нескольких контейнеров с общим хранилищем и другими ресурсами, а также сетью и настройками для управления контейнерами. Является минимальной единицей в объектной модели Kubernetes.
Задача на выгрузку данных из указанного источника и трансфер этих данных в предполагаемое место назначения с возможностью настроить периодичность переноса.
Процесс предварительной обработки данных, включающий одну или несколько стадий: очистка, заполнения пропусков, создание или удаление признаков, слияние, трансформация данных.
Регион размещения вычислительных ресурсов
Группа ресурсов, доступная для использования в модулях платформы ML Space. Регионы различаются по доступности в модулях, типу и количеству предоставляемых ресурсов, подключенным хранилищам и тарификации. На платформе доступны следующие регионы:
- Cloud.Region.CPU (CPU).
- Cloud.Region.A100 (GPU Tesla A100).
- Cloud.Region.A100&CPU.
- Christofari.V100.
- Christofari.A100.
Неизменяемая сущность Docker, из которой разворачивается контейнер с окружением или сервисом. Его можно рассматривать как набор файлов, необходимых для запуска и работы приложения. Алгоритм сборки образа описывается в файле dockerfile.
Образ для задачи обучения
Образ, предназначенный для запуска задач обучения в модуле Environments.
Подготовленная среда для осуществления процесса обучения моделей или запуска другого кода в интерактивном режиме. Окружения в платформе ML Space представляют собой запущенные контейнеры Docker с установленными Jupyter Server, необходимыми фреймворками машинного обучения и вспомогательными библиотеками Python.
Промежуточные результаты, или контрольные точки обучения, которые содержат информацию о конфигурации модели, ее переменных, градиентах и весах.
Что такое инференс? Нейрословарь. Выпуск 4
В своих разработках «Криптонит» активно использует искусственные нейронные сети. Поэтому мы решили расшифровать связанные с этой сферой термины и их практический смысл. Все материалы из этой рубрики подготовлены при помощи наших экспертов из лаборатории больших данных.
Термин «инференс» в зависимости от контекста может употребляться в разных значениях. С точки зрения разработчика инференс — это третий этап жизненного цикла искусственной нейронной сети (после её обучения и развёртывания).
Часто инференсом называют процесс работы уже обученной нейросети на конечном устройстве, или её логический вывод (конечный результат обработки данных).
С понятием «инференс» тесно связаны две следующие характеристики нейросетей.
Скорость инференса — важная метрика для сравнения производительности решений на базе ИИ. Она оценивается для разных нейросетей на одинаковом оборудовании, либо наоборот: для одной и той же нейросети на разном железе (например, на ядрах архитектур x86-64 и ARM, с ускорением на ГП и без него).
Точность инференса — количественная оценка, обычно выражаемая в процентах. Она показывает, насколько результат работы нейросети соответствует истине. Например, сколько слов нейросеть правильно распознала в аудиозаписи, или сколько дорожных знаков интерпретировала верно.
При разработке нейросетей одновременно стараются повысить как скорость, так и точность инференса. Именно по этим характеристикам их оценивает конечный потребитель.
Профессиональная конференция разработчиков высоконагруженных систем
11-я ежегодная конференция для разработчиков highload-систем, которая соберет 2 700 участников из разных регионов России и мира. Мероприятие направлено на обмен знаниями о технологиях, позволяющих одновременно обслуживать многие тысячи и миллионы пользователей.
Программа охватывает такие аспекты веб-разработок, как архитектуры крупных проектов, базы данных и системы хранения, системное администрирование, нагрузочное тестирование, эксплуатация крупных проектов и другие направления, связанные с высоконагруженными системами.
- Главная
- →
- Нейронные сети, искусственный интеллект
Нейронные сети: быстрый инференс на GPU с помощью TensorRT (демо)
Нейронные сети, искусственный интеллект
Доклад принят в Программу конференции
— Исследователь и разработчик в областях машинного обучения, нейронных сетей, компьютерного зрения и обработки сигналов.
— Занимался задачами, связанными с медицинскими изображениями, распознаванием, обработкой изображений, 3D-анимацией.
— Время от времени читает вводные научно-популярные лекции по Deep Learning.
Тезисы
Зал «Москва»
8 ноября, 11:00
Современные нейронные сети базируются на высоконагруженных вычислениях. Для быстрого обучения и инференса (прямого распространения) важны как аппаратное обеспечение, так и программное. Современные фреймворки, используемые для построения и обучения нейронных сетей, могут жертвовать производительностью в пользу большей гибкости. Поэтому для внедрения обученной нейронной сети может потребоваться её оптимизация. В докладе будет продемонстрирована возможность быстрого инференса обученной модели на GPU с помощью библиотеки TensorRT.
План доклада:
— Краткое введение в свёрточные нейронные сети.
— Быстрый инференс с помощью TensorRT: описание библиотеки и её особенностей.
— Демонстрация построения и обучения нейронной сети на TensorFlow.
— Демонстрация конвертации обученной модели в TensorRT для последующего быстрого инференса.