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_hot
operator в 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], если у вас есть какие-либо вопросы!
Рекомендации
- TPAT — инструмент автоматической генерации плагинов TensorRT (https://github.com/Tencent/TPAT)
- Инструмент автоматической генерации подключаемого модуля TensorRT с открытым исходным кодом Tencent и NVIDIA TPAT (https://www.codetd.com/en/article/13743533)