ML СОВЕТЫ И ТРЮКИ / TPAT

Как преобразовать вашу пользовательскую модель в TensorRT

Облегчите свою боль TensorRT с помощью TPAT

Если вы когда-либо работали с TensorRT, то наверняка сталкивались с ошибкой, похожей на эту, верно?

[E] [TRT] UffParser: ошибка валидатора: изменение размера/ResizeNearestNeighbor: неподдерживаемая операция _ResizeNearestNeighbor

В этом блоге мы покажем вам, как преобразовать вашу модель с пользовательскими операторами в TensorRT и как избежать этих ошибок!

Nvidia TensorRT в настоящее время является наиболее широко используемой структурой вывода графических процессоров, которая позволяет оптимизировать модели машинного обучения, созданные с использованием Pytorch, Tensorflow, mxnet или PaddlePaddle, для их эффективного запуска на Аппаратное обеспечение NVIDIA. Хорошо известно, что логический вывод с использованием графиков TensorRT значительно повышает скорость вывода и пропускную способность по сравнению с собственным запуском моделей.

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

Инструмент автоматической генерации подключаемого модуля TensorRT — TPAT

Недавно Tencent и NVIDIA анонсировали TensorRT Plugin Autogen Tool -TPAT, инструмент с открытым исходным кодом, который может поддерживать всех операторов в формате Open Neural Network Exchange (ONNX), и генерировать подключаемые модули TensorRT от начала до конца.

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

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

Единственные входные данные, которые требуются TPAT, — это модель ONNX и сопоставление имен для пользовательских операторов. Процесс оптимизации TPAT основан на компиляторе глубокого обучения TVM, который выполняет автоматическую настройку операторов фиксированной формы и автоматически генерирует высокопроизводительное ядро ​​CUDA. Записываются необходимые параметры ядра CUDA и среды выполнения. в шаблоне подключаемого модуля TensorRT и используется для создания динамической библиотеки ссылок, которую можно напрямую загрузить в TensorRT для запуска.

TPAT — действительно фантастический инструмент, поскольку он предлагает следующие преимущества по сравнению с написанными от руки плагинами и собственными операторами TensorRT:

улучшенный охват операторов:поддерживаются все операторы ONNX, Tensorflow и PyTorch.

полная автоматизация: сквозное полностью автоматическое создание пользовательских подключаемых модулей TensorRT.

высокая производительность: производительность большинства операторов превышает производительность написанных вручную или оригинальных плагинов TensorRT.

Использование TPAT на NVIDIA Jetson AGX Xavier

Чтобы оптимизировать вашу модель с помощью TPAT и TensorRT и запустить ее на NVIDIA Jetson AGX Xavier, вам следует использовать следующий Dockerfile вместо файла, содержащегося в репозитории TPAT, чтобы успешно создать образ TPAT Docker.

FROM nvcr.io/nvidia/l4t-tensorflow:r32.4.4-tf1.15-py3
RUN apt-get update && apt-get install build-essential cmake -y
RUN wget -O "clang+llvm-9.0.1-aarch64-linux-gnu.tar.xz" https://github.com/llvm/llvm-project/releases/download/llvmorg-9.0.1/clang+llvm-9.0.1-aarch64-linux-gnu.tar.xz \
&& tar -xvf clang+llvm-9.0.1-aarch64-linux-gnu.tar.xz && mkdir -p /usr/local/llvm/ \
&& mv clang+llvm-9.0.1-aarch64-linux-gnu/* /usr/local/llvm/
RUN python3 -m pip install --upgrade pip
RUN pip3 install buildtools onnx==1.10.0
RUN pip3 install pycuda nvidia-pyindex
RUN apt-get install git
RUN pip install onnx-graphsurgeon onnxruntime==1.9.0 tf2onnx xgboost==1.5.2
RUN git clone --recursive https://github.com/Tencent/TPAT.git /workspace/TPAT && cd /workspace/TPAT/3rdparty/blazerml-tvm && mkdir build && cp cmake/config.cmake build && cd build
RUN sed -i 's/set(USE_LLVM OFF)/set(USE_LLVM \/usr\/local\/llvm\/bin\/llvm-config)/g' /workspace/TPAT/3rdparty/blazerml-tvm/build/config.cmake
RUN sed -i 's/set(USE_CUDA OFF)/set(USE_CUDA ON)/g' /workspace/TPAT/3rdparty/blazerml-tvm/build/config.cmake
RUN cd /workspace/TPAT/3rdparty/blazerml-tvm/build/ && cmake .. && make -j8
ENV TVM_HOME="/workspace/TPAT/3rdparty/blazerml-tvm/"
ENV PYTHONPATH="$TVM_HOME/python:${PYTHONPATH}"

Вы можете создать образ Docker с помощью следующей команды:

sudo docker build . -t tpat:master

Примечание. Вам следует подключить внешнее хранилище и создать образ Docker на нем, так как сам образ довольно большой, а встроенная память AGX ограничена.

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

sudo docker run --gpus all --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 -it tpat:master

После запуска контейнера вы должны убедиться, что вычислительные возможности в Makefile TPAT соответствуют вычислительным возможностям вашего устройства. Для успешной сборки плагинов TPAT на Jetson AGX Xavier в этой строке нужно заменить -arch=sm_75 на -arch=sm_72.

Теперь у вас должно быть все необходимое для автоматического создания пользовательских плагинов для вашей модели с помощью TPAT!

Как создать собственный плагин TensorRT с помощью TPAT?

Чтобы оптимизировать некоторых операторов в модели, использующей TPAT на Jetson Xavier AGX, выполните следующие шаги.

Во-первых, вы должны запустить скрипт onnx_to_plugin.py, который ожидает следующие параметры:

usage: onnx_to_plugin.py [-h] -i INPUT_MODEL_PATH -o OUTPUT_MODEL_PATH
                         [-n [NODE_NAMES [NODE_NAMES ...]]]
                         [-t [NODE_TYPES [NODE_TYPES ...]]]
                         [-p PLUGIN_NAME_DICT]
optional arguments:
  -h, --help            show this help message and exit
  -i INPUT_MODEL_PATH, --input_model_path INPUT_MODEL_PATH
                        Please provide input onnx model path
  -o OUTPUT_MODEL_PATH, --output_model_path OUTPUT_MODEL_PATH
                        Please provide output onnx model path which used for
                        tensorrt
  -n [NODE_NAMES [NODE_NAMES ...]], --node_names [NODE_NAMES [NODE_NAMES ...]]
                        Please provide the operator name that needed to
                        generate tensorrt-plugin
  -t [NODE_TYPES [NODE_TYPES ...]], --node_types [NODE_TYPES [NODE_TYPES ...]]
                        Please provide the operator type that needed to
                        generate tensorrt-plugin
  -p PLUGIN_NAME_DICT, --plugin_name_dict PLUGIN_NAME_DICT
                        Please provide the dict of op name and plugin name
                        that will be generated by TPAT, such as : {"op_name" :
                        "plugin_name"}

Мы предоставляем пример команды, которая оптимизирует loop_function_1/OneHotEncoding/one_hotoperator в model.onnx графе и выводит model_tpat.onnx граф, содержащий оптимизированные tpat_onehot операторы:

OPENBLAS_CORETYPE=ARMV8 python3 onnx_to_plugin.py \
 -i “model.onnx” \
 -o “model_tpat.onnx” \ 
 -p “{\”loop_function_1/OneHotEncoding/one_hot\” : \”tpat_onehot\”}”

Результатом выполнения этой команды является оптимизированный граф ONNX, в котором неподдерживаемый оператор заменяется оператором, созданным TPAT. Вы можете найти динамическую библиотеку операторов, созданную TPAT, в TPAT/python/trt_plugin/lib/, и она должна называться tpat_onehot.so .

Примечание. Перед командой, запускающей сценарий преобразования TPAT, необходимо добавить OPENBLAS_CORETYPE=ARMV8, чтобы устранить проблему, возникающую на устройствах Jetson Xavier AGX.

Оптимизация графа TPAT-ONNX в TensorRT

trtexec — это инструмент для быстрого использования TensorRT без необходимости разработки собственного приложения. Инструмент trtexec имеет три основных назначения:

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


Вы можете использовать следующую команду trtexec для преобразования модели в формат плана TensorRT:

trtexec --onnx=model_tpat.onnx \
        --saveEngine=model.plan \
       --buildOnly --verbose --fp16 \
       --workspace=6000 --noTF32 \
       --plugins=”./python/trt_plugin/lib/tpat_onehot.so”

Обратите внимание, что вы должны указать путь к операторам, оптимизированным для TPAT.

После успешного преобразования модели вы можете использовать следующую команду для измерения производительности модели TensorRT:

trtexec --loadEngine=model.plan \
        --verbose --workspace=4096 \ 
        --streams=16 --threads \
        --plugins=”./python/trt_plugin/lib/tpat_onehot.so”

Вот и все, вы успешно преобразовали оператор, который не поддерживается TensorRT, используя TPAT, и оптимизировали график TensorRT. Вы можете попробовать представленный процесс и поделиться своими мыслями и результатами в комментариях!

Мы надеемся, что вы нашли эту запись в блоге полезной. Ознакомьтесь с некоторыми другими блогами, написанными нашей командой в Forsight, и не стесняйтесь обращаться к нам по адресу [email protected], если у вас есть какие-либо вопросы!









Рекомендации

  1. TPAT — инструмент автоматической генерации плагинов TensorRT (https://github.com/Tencent/TPAT)
  2. Инструмент автоматической генерации подключаемого модуля TensorRT с открытым исходным кодом Tencent и NVIDIA TPAT (https://www.codetd.com/en/article/13743533)