Как установить tensorrt ubuntu

Обновлено: 03.07.2024

В этой статье вы узнаете, как установить и использовать TensorFlow на Ubuntu 18.04 или 16.04. Рассмотрим правильную инсталляцию TensorFlow в виртуальную среду Python или в контейнер Docker. Принципы установки работают в системах Ubuntu и Debian.

Это комплексная платформа с открытым исходным кодом, предназначенная для машинного обучения. Например, TensorFlow может использоваться при построении и обучении нейронных сетей. Благодаря всеобъемлющей и гибкой системе инструментов, библиотек, а также ресурсов сообщества.

TensorFlow позволяет разработчикам использовать самые последние технологии машинного обучения. Теперь стало легче создавать и развертывать приложения на базе машинного обучения. Поисковый гигант Google разработал данную платформу для ранжирования поиска в системе машинного обучения. TensorFlow доступна в виртуальной среде Python или в контейнере Docker. Также можно установить с Anaconda. Для установки вам потребуется уже установленный Python 3.3 и выше, а также Git.

Установка TensorFlow Ubuntu в виртуальную среду Python 3

Шаг 1. Обновление списка пакетов

Убедитесь, что индекс APT по умолчанию обновлен. Для этого выполните следующую команду:

sudo apt update
sudo apt upgrade -y

Шаг 2. Установка Python

Установите Python 3 и Python venv с помощью следующей команды.

sudo apt install python3
sudo apt install python3-pip
sudo apt install python3-venv


После установки Python 3 проверьте, какая версия Python установлена, введя команду:


Шаг 3. Виртуальная среда

Необходимо создать виртуальную среду Python с именем tenorflow_env. Для этого введите следующую команду:

mkdir tensorflow_env
cd tensorflow_env
python3 -m venv my_tensorflow


Эта команда создаст новый каталог my_tensorflow. В нем будут все пакеты, которые вы устанавливаете, пока активирована среда Python.

Теперь нужно активировать виртуальную среду. Иначе мы не сможем ее использовать:


Шаг 4. Установка tensorflow

Осталось просто установить TensorFlow в виртуальной среде, запустив команду инсталляции и обновления до последней версии платформы:

pip3 install --upgrade tensorflow


Для проверки правильности установки и выведения в терминал версии TensorFlow, просто запустите следующую команду:

python -c 'import tensorflow as tf; print(tf.__version__)'


Если все совпадает с изображением на скриншоте, значит вы сделали все правильно.

Установка TensorFlow с помощью Docker

Еще один способ установки TensorFlow – инсталляция в docker-контейнер. Конечно, для начала нужно установить в Ubuntu сам Docker. После этого загрузите файл образа TensorFlow в контейнер Docker, выполнив следующие шаги. Сначала надо загрузить образ TensorFlow для Docker:

sudo docker pull tensorflow/tensorflow

После загрузки образа, запустите его с помощью команды:

docker run -it -p 8888:8888 tensorflow/tensorflow


Больше информации об установке TensorFlow в Docker вы найдете на официальном сайте.

Установка TensorFlow с через pip 3

Существует способ установки с помощью пакетного менеджера pip3. Для этого введите следующую команду:

pip3 install tensorflow


Создание простой программы TensorFlow

После завершения установки проверьте, в каком состоянии находится TensorFlow. Вы можете написать простой «Hello world» код – testTensorFlow.py с помощью текстового редактора vim. Введите команду ниже:

Далее нужно сохранить и закрыть файл. Затем выполните файл Python следующей командой:


Выводы

Теперь вы знаете, как установитьTensorFlow в Ubuntu 18.04 или Debian. Как видите, всё не очень сложно и вам доступно несколько способов. За подробной информацией обращайтесь на официальный сайт.

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

image


Больно только в первый раз!

Предлагаю поставить задачу таким образом: нам необходимо разметить датасет, обучить на нём сеть RetinaNet/Unet на Pytorch1.3+, преобразовать полученные веса в ONNX, далее сконвертировать их в engine TensorRT и всё это дело запустить в docker, желательно на Ubuntu 18 и крайне желательно на ARM(Jetson)* архитектуре, тем самым минимизируя ручное развертывание окружения. В итоге мы получим контейнер готовый не только к экспорту и обучению RetinaNet/Unet, но и к полноценной разработке и обучению классификации, сегментации со всей необходимой обвязкой.

Этап 1. Подготовка окружения

Здесь важно заметить, что в последнее время я полностью ушёл от использования и развертывания хоть каких-то библиотек на desktop машине, как впрочем и на devbox. Единственное, что приходится создавать и устанавливать — это python virtual environment и cuda 10.2 (можно ограничиться одним драйвером nvidia) из deb.

Предположим, что у вас свежеустановленная Ubuntu 18. Установим cuda 10.2(deb), подробно на процессе установки я останавливаться не буду, официальной документации вполне достаточно.


Username просто копируем. Ну вот, считай, среда развернута!

Этап 2. Сборка контейнера docker

На втором этапе нашей работы мы соберем docker и познакомимся с его внутренностями.
Перейдём в корневую папку по отношению к проекту retina-examples и выполним


Мы собираем docker пробрасывая в него текущего юзера — это очень полезно если вы будете что-то писать на смонтированный VOLUME с правами текущего юзера, иначе будет root и боль.

Пока собирается docker, давайте изучим Dockerfile:


Как видно из текста, мы берем все наши любимые либы, компилируем retinanet, накидываем базовых инструментов для удобства работы с Ubuntu и настраиваем сервер openssh. Первой строкой идет как раз наследование образа nvidia, для которого мы делали логин в NGC Cloud и который содержит Pytorch1.3, TensorRT6.x.x.x и еще кучу либ, позволяющих скомпилировать cpp исходники нашего детектора.

Этап 3. Запуск и отладка контейнера docker

Перейдем к основному кейсу использования контейнера и среды разработки, для начала запустим nvidia docker. Выполним:


Теперь контейнер доступен по ssh <curr_user_name>@localhost. После успешного запуска, открываем проект в PyCharm. Далее открываем

image


Шаг 1

image

Шаг 2

image

Шаг 3

Выбираем всё как на скриншотах,


— это будет ln на Python3.6 и


Жмём финиш, ожидаем индексирование, и всё, среда готова к использованию!

ВАЖНО. Сразу после индексирования вытянуть из docker скомпилированные файлы для Retinanet. В контектсном меню в корне проекта выберем пункт


Появятся один файл и две папки build, retinanet.egg-info и _С.so

image

Если ваш проект выглядит так, то среда видит все необходимые файлы и мы готовы, к обучению RetinaNet.

Этап 4. Размечаем данные и обучаем детектор

Для разметки я, в основном, использую supervise.ly — приятная и удобная тулза, в последнее време кучу косяков пофиксили и она стала существенно лучше себя вести.

Предположим что вы разметили датасет и скачали его, но сразу засунуть его в наш RetinaNet не выйдет, так как он в собственном формате и для этого нам необходимо сконвертировать его в COCO. Тулза для конвертации находится в:


Обратите внимание, что Category в скрипте это пример и вам необходимо вставить свои (категорию background добавлять не надо)


Авторы оригинального репозитория почему-то решили, что ничего кроме COCO/VOC вы обучать для детекции не будете, поэтому пришлось немного подредактировать исходный файл


Добавив тутда любимые аугментации albumentations.readthedocs.io/en/latest и выпилить жёстко вшитые категории из COCO. Также есть возможность кропнуть большие области детекции, если вы на больших картинках ищите маленькие объекты, у вас маленький датасет =), и ничего не работает, но об этом в другой раз.

В общем train loop тоже слабенький, изначально он не сохранял чекпоинты, юзал какой-то ужасный scheduler и т.д. Но теперь вам осталось только выбрать backbone и выполнить


В консоле увидите:


Что бы изучить весь набор параметров посмотрите


В общем они стандартные для детекции, и у них есть описание. Запустите обучение и дождитесь результатов. Пример инференса можно посмотреть в:


или выполнить команду:


В репозитории уже встроен Focal Loss и несколько backbone, а так же легко впиливаются свои


В табличке авторы приводят некоторые характеристики:

image

Также есть backbone ResNeXt50_32x4dFPN и ResNeXt101_32x8dFPN, взятый из torchvision.
Надеюсь с детекцией немного разобрались, но стоит обязательно прочитать официальную документацию, чтобы понять режимы экспорта и логирования.

Этап 5. Экспорт и инференс моделей Unet c энкодером Resnet

Основная проблема при экспорте Unet-like моделей из ONNX в TensoRT — это необходимость задавать фиксированный размер Upsample или пользоваться ConvTranspose2D:


С помощью этого преобразования можно сделать это автоматически при экспорте в ONNX, но уже в 7 версии TensorRT эту проблему решили, и нам осталось ждать совсем немного.

Когда я начал использовать docker у меня были сомнения на счёт его производительности для моих задач. В одном из моих агрегатов сейчас довольно большой сетевой трафик создаваемый несколькими камерами.

image

Разные тесты на просторах интернета говорили об относительно большом overhead на сетевое взаимодействие и запись на VOLUME, плюс ко всему неведомый и страшный GIL, а так как съемка кадра, работа драйвера и передача по сети кадра являются атомарной операцией в режиме hard real-time, задержки в сети для меня очень критичны.

Но всё обошлось =)

P.S. Остаётся добавить ваш любимый трейн луп для сегментации и в продакшен!

Благодраности

Спасибо сообществу ods.ai, без него невозможно развиваться! Огромное спасибо n01z3, надоумевшему меня заняться DL, за его бесценные советы и чрезвычайный профессионализм!

Используйте в production оптимизированные модели!


Aurorai, llc

В этом туториале мы рассмотрим совместную работу библиотеки PuzzleLib с библиотекой TensorRT от NVIDIA. TensorRT позволяет строить архитектуру нейронной сети более оптимальным образом и квантизировать входные данные для сети, что дает нам либо то же, либо чуть более низкое качество работы сети и существенный прирост в скорости инференсв сети на GPU NVIDIA.

Установка TensorRT¶

  1. OS - Ubuntu 16.04/18.04 или Windows 10;
  2. Cuda 10.2 (можно по аналогии более ранние, начиная с 10.0+);
  3. CuDNN 7.6 (нужная версия cuDNN указана в названии соответствующего архива TensoRT)
  4. TensorRT 7.0 (можно по аналогии более ранние, начиная с 6.0+).

Для Windows 10 понадобится Visual Studio 2017. Инсталлятор бесплатной версии можно скачать
здесь. Следуем инструкциям инсталлятора. В момент выборка модулей сборки – выбираем только минимальный модуль для c++ (поставить галочку в соответствующем чек боксе).

  1. Проходим по ссылке с официального сайта NVIDIA с TensorRT 7.0. Логинимся или регистрируемся на сайте (это быстро).
  2. Прогружается страница с необходимой версией TensorRT . Жмем галку в чек-боксе "I Agree To the Terms of the NVIDIA TensorRT License Agreement".
  3. Жмем на ссылку "TensorRT 7.0" - выпадет список из вариантов установки TensorRT .

При установке на Ubuntu 16.04 (18.04 по аналогии) к предыдущимм трем пунктам добавьте еще три:

U4. В TensorRT 7.0 for Linux => Tar File Install Packages For Linux x86 скачиваем TensorRT 7.0.0.11 for Ubuntu 16.04 and CUDA 10.2 tar package U5. Распаковываем в терминале архив и копируем часть содержимого:

U6. Устанавливаем codepy и libboost (если они еще не установлены):

При установке на Windows 10 добавьте к самым первым трем пунктам еще пять:

W4. В TensorRT 7.0 For Windows в Windows ZIP Package скачиваем Windows10 and CUDA 10.2 zip package
W5. Распаковываем архив. Все папки, кроме lib, переносим с заменой в папку: C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2 (по умолчанию, Cuda ставится именно туда).
W6. Все .dll файлы из папки lib переносим в папку C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\bin
W7. Все .lib файлы из папки lib кладем в папку C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.2\lib\x64
W8. Устанавливаем codepy (если он еще не установлен):

Сборка Driver¶

В библиотеке PuzzleLib есть папка Converter/TensorRT - это и есть мостик между PuzzleLib и TensorRT . Этот модуль может конвертировать нейросетевые веса PuzzleLib в TensorRT engines , чем обеспечивает ускорение инференса сетей на NVIDIA GPU. Запустите скрипт PuzzleLib/Converter/TensorRT/Source/Build.py. Он сгенерирует Driver.so в случае Ubuntu или Driver.pyd в случае Windows. В этих бинарниках содержатся все низкоуровневые функции конвертации.

TensorRT float32¶

Нам понадобится скрипт PuzzleLib/Converter/TensorRT/Tests/ResNet50Test.py. Перед его запуском нужно скачать веса обученной модели ResNet-50-model.hdf и положить в папку PuzzleLib/Converter/TensorRT/TestData.

Скрипт начинается с импорта всех необходимых для его работы модулей и функций:

Подгружаем веса предобученной модели ResNet-50:

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

Самая важная функция - построение engine-файла, который заменит hdf-файл (и который, в дальнейшем, будет использоваться в качестве весов обученной модели для инференса сети). После отработки этой функции в папке PuzzleLib/Converter/TensorRT/TestData появится engine-файл по типу ResNet-50.float32.1-3-224-224.1-1000.GeForce_GTX_1080.engine.

Название engine-файла содержит в себе следующую информацию:

  • ResNet - 50 - архитектура использованной сети
  • float32 - формат данных, поданных сети на вход (может быть float32, float16 и int8)
  • 1 - 3 - 224 - 224 - размерность батча данных, поданных сети на вход (размерность входного тензора сети, сконвертированной в engine)
  • 1 - 1000 - размерность данных, полученных на выходе сети (размерность выходного тензора сети, сконвертированной в engine)
  • GeForce_GTX_1080 - видеокарточка, на которой были произведены рассчеты

Сравниваем результаты работы сети с весами из hdf-файла и сети с весами из engine-файла формата float32 на 1 изображении:

Должно получиться что-то вроде такого:

Как видим, результаты на одной и той же картинке совпадают (отличия в десятимиллионных долях не в счет).

В заключении, сравним время работы двух сетей на том же самом изображении:

Должно получиться что-то вроде такого:

TensorRT float32 отработал более чем в 6 раз быстрее. При этом, конечно, стоит помнить о том, что ResNet-50 хорошо поддается оптимизации с помощью fusion (более сложные и нетипичные сети оптимизируются хуже и ускоряются чуть менее резво). Float16 делается по аналогии - DataType . float32 нужно заменить на DataType . float16 . Но важно помнить, что данный формат не поддерживается на старых NVIDIA GPU (вылетит соответствующая ошибка).

TensorRT int8¶

Нам понадобится скрипт PuzzleLib/Converter/TensorRT/Tests/MnistLenetTest.py.

Скрипт начинается с импорта всех необходимых для его работы модулей и функций.

Функция построения архитектуры сети LeNet:

В данном примере, у нас нет весов обученной модели, поэтому будем обучать модель сами с помощью функции обучения:

Для сравнения результатов двух сетей (обычной и с весами из engine-файла), нам понадобится функция валидации:

Переходим к основной функции. Подгружаем данные для сети:

Фиксируем зерно генератора случайных чисел:

Загружаем модель LeNet без весов.

Для получения TensorRT int8 engine нужно откалиброваться на тех данных, которые имеют смысл для исходной сети (в данном случае - изображения с рукописным написанием цифр из датасета MNIST).

Переводим сеть в режим тестирования:

Существенными отличиями TensorRT int8 от TensorRT float32 являются:

  • формат данных
  • наличие калибровки у TensorRT int8
  • инференс int8 быстрее, но имеет более существенную погрешность в качестве (в некоторых задачах она может оказаться весьма ощутимой, для борьбы с этим нужно калиброваться на большом объеме данных)

Сравниваем результаты работы сети с весами из hdf-файла и сети с весами из engine-файла формата int8 на 1 изображении:

TensorRT int8 быстрее в 4 с лишним раза:

В заключении, сравним результаты работы сетей на всех данных:

Должно получиться примерно следующее:

Как видим, результаты ухудшились совсем незначительно.

Использование существующего engine-файла¶

Воспринимать engine-файл стоит так же, как и hdf-файл - веса сети. Единственным отличие в работе с ними заключается в подгрузке этого самого файла.

В дальнейшем, используем netEngine как net (пример инференса):

Поздравляю, вы прошли туториал по TensorRT и научились ускорять инференс на NVIDIA GPU!

Эта статья была написана по причине того, что текущая официальная страница установки для голой Ubuntu 18.04 GPU не делает работоспособной конфигурацию TensorFlow с CUDA и TensorRT. Поскольку мне надо было работать с frozen graph, который не поддерживается интерфейсом TensorFlow 2.x для оптимизации TensorRT, то ставилась версия 1.15 Tensorflow. Итак, приступим.

1. Начальные обновления плюс виртуальная среда.

Смотрим версию pip3. Она очень старая и не позволяет установить нужную версию TensorFlow:

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

sudo apt update

sudo apt install python3-dev python3-pip python3-venv

sudo apt-get update

sudo apt install python3-pip

И создаём виртуальную среду:

Переходим в среду:

Должен появиться слева текст venv:

Выйти из среды всегда можно командой deactivate, но пока нам этого не нужно, поскольку обновляем pip:

2. Устанавливаем TensorFlow

pip3 install tensorflow-gpu==1.15

Идёт скачивание и установка TensorFlow. Проблем здесь обычно не возникает.

3. NVIDIA драйвер

Необходимо скачать и установить драйвер NVIDIA. Можно сделать так, как указано на сайте TensorFlow, хотя всё равно установится более новая версия:

Перезагружаем и проверяем командой nvidia-smi:

4. Устанавливаем CUDA 10 и CUDNN

Для этого скачиваем его отсюда:

А затем выполняем команды:

sudo dpkg -i cuda-repo-ubuntu1804-10-0-local-10.0.130-410.48_1.0-1_amd64.deb

sudo apt-key add /var/ cuda-repo- 10-0-local-10.0.130-410.48/7fa2af80.pub

sudo apt-get update

sudo apt-get install cuda

Если у вас стоит более новая версия CUDA, и поэтому старая не ставится, то просто выполните эту команду

sudo apt-get install cuda-10-0

sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.0_amd64.deb

sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.0_amd64.deb

Проверяем работоспособность TensorFlow GPU

Где тестовый файл такой:

import tensorflow as tf

Результат у меня такой:

2020-07-05 15:56:13.343641: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/device:GPU:0 with 7184 MB memory) -> physical GPU (device: 0, name: GeForce RTX 2080 SUPER, pci bus id: 0000:01:00.0, compute capability: 7.5)
Found GPU at: /device:GPU:0

5. Устанавливаем TensorRT

  • sudo dpkg -i nv-tensorrt-repo-ubuntu1804-cuda10.0-trt5.1.5.0-ga-20190427_1-1_amd64.deb
  • sudo apt-key add /var/nv-tensorrt-repo-cuda10.0-trt5.1.5.0-ga-20190427/7fa2af80.pub
  • sudo apt-get update
  • sudo apt-get install libnvinfer5=5.1.5-1+cuda10.0
  • sudo apt-get install libnvinfer-dev=5.1.5-1+cuda10.0
  • sudo apt-mark hold libnvinfer5 libnvinfer-dev

TensorRT установлен. Проверяем, конвертируется ли модель (я конвертировал модель детектирования объектов).

Читайте также: