Глубокое обучение имеет широкий спектр приложений, таких как самоуправляемые автомобили, воздушное наблюдение, решения для распознавания лиц в реальном времени, решения для обработки языка в реальном времени и многие другие. Но есть только одно сходство между этими приложениями. РЕАЛЬНОЕ ВРЕМЯ. Учитывая потребность в производительности (пропускной способности) этих моделей в реальном времени, нам необходимо оптимизировать обученную модель, чтобы она была облегченной, но обеспечивала точность, близкую к обучающей.

TensorRT — это платформа глубокого обучения для логического вывода от NVIDIA. Он построен на модели программирования NVIDIA CUDA, которая помогает нам использовать огромную параллельную производительность, предлагаемую графическими процессорами NVIDIA. Модели глубокого обучения практически из всех популярных фреймворков можно анализировать и оптимизировать для получения выводов с низкой задержкой и высокой пропускной способностью на графических процессорах NVIDIA с использованием TensorRT.

С TensorRT мы можем легко выполнять различные оптимизации. Ниже приведены несколько важных оптимизаций, которые можно выполнить с помощью TensorRT.

1. Вывод смешанной точности

2. Слияние слоев

3. Пакетирование

Вывод смешанной точности

Single Precision Floating Point или FP32 — это выбор точности, когда речь идет об обучении глубокому обучению.

FP32 имеет 8 бит для представления экспоненты и 23 бита для представления дроби, что идеально подходит для всех этих вычислений и обновлений градиента. Во время логического вывода, если модель дает точность, близкую к тренировочной, и если она в два раза тяжелее, чем во время обучения, то у нас есть преимущество в меньшем использовании памяти и высокой пропускной способности. С помощью TensorRT мы можем создать производственную модель с точностью FP16 или INT 8 или INT 4.

Слияние слоев

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

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

Пакетная обработка

Графические процессоры имеют тысячи вычислительных ядер; просто нам нужно использовать их эффективно. Планируя правильный размер пакета наших входных данных на основе целевой платформы развертывания, мы можем оптимально использовать огромное количество доступных ядер.

Мой эксперимент с TensorRT

Я попробовал поэкспериментировать с TensorRT, и результаты оказались такими же хорошими, как заявляет NVIDIA. Я использовал графический процессор NVIDIA GeForce GTX 1650 и контейнер PyTorch от NGC. О NGC я напишу отдельную статью позже. Контейнер PyTorch поставляется со всеми библиотеками, которые мне нужны для моего эксперимента, устраняя все эти препятствия при установке.

Для этого эксперимента я использовал набор данных CIFAR10 и простую CNN, созданную на заказ. Достижение точности 95%+ не входило в цели этой работы. Итак, я не особо зацикливался на архитектуре и гиперпараметрах, но мне было интересно поработать с TensorRT и ощутить прирост производительности, который он дает.

Процесс

  1. Обучите CNN на наборе данных CIFAR10
  2. Сохраните лучшую модель в формате .pth
  3. Создать .onnx версию сохраненной модели
  4. Из модели ONNX создайте механизм TensorRT и сохраните его как файл .plan для повторного использования.
  5. Используйте движок TensorRT для высокопроизводительного глубокого обучения.

Я прикрепил ссылку GitHub к своей записной книжке Jupyter, которая использовалась для этого эксперимента.



Мои наблюдения с использованием движка TensorRT с точностью FP16

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

2. Когда я увеличил глубину модели до 20 слоев свертки, за которыми следуют соответствующие слои ReLU и пара полносвязных слоев, я смог увидеть значительный прирост производительности. Я заметил увеличение пропускной способности в 3 раза.

3. Движок TensorRT был примерно вдвое меньше родной модели PyTorch, как и ожидалось.

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