本教程将介绍如何在 NVIDIA Jetson 平台上安装 MMDeploy。该方法已经在以下 3 种 Jetson 模组上进行了验证:
- Jetson Nano
- Jetson TX2
- Jetson AGX Xavier
首先需要在 Jetson 模组上安装 JetPack SDK。 此外,在利用 MMDeploy 的 Model Converter 转换 PyTorch 模型为 ONNX 模型时,需要创建一个装有 PyTorch 的环境。 最后,关于编译工具链,要求 CMake 和 GCC 的版本分别不低于 3.14 和 7.0。
JetPack SDK 为构建硬件加速的边缘 AI 应用提供了一个全面的开发环境。 其支持所有的 Jetson 模组及开发套件。
主要有两种安装 JetPack SDK 的方式:
- 使用 SD 卡镜像方式,直接将镜像刻录到 SD 卡上
- 使用 NVIDIA SDK Manager 进行安装
你可以在 NVIDIA 官网上找到详细的安装指南。
这里我们选择 JetPack 4.6.1 作为装配 Jetson 模组的首选。MMDeploy 已经在 JetPack 4.6 rev3 及以上版本,TensorRT 8.0.1.6 及以上版本进行了测试。更早的 JetPack 版本与 TensorRT 7.x 存在不兼容的情况。
安装 Archiconda 而不是 Anaconda,因为后者不提供针对 Jetson 的 wheel 文件。
wget https://github.com/Archiconda/build-tools/releases/download/0.2.3/Archiconda3-0.2.3-Linux-aarch64.sh
bash Archiconda3-0.2.3-Linux-aarch64.sh -b
echo -e '\n# set environment variable for conda' >> ~/.bashrc
echo ". ~/archiconda3/etc/profile.d/conda.sh" >> ~/.bashrc
echo 'export PATH=$PATH:~/archiconda3/bin' >> ~/.bashrc
echo -e '\n# set environment variable for pip' >> ~/.bashrc
echo 'export OPENBLAS_CORETYPE=ARMV8' >> ~/.bashrc
source ~/.bashrc
conda --version
完成安装后需创建并启动一个 conda 环境。
# 得到默认安装的 python3 版本
export PYTHON_VERSION=`python3 --version | cut -d' ' -f 2 | cut -d'.' -f1,2`
conda create -y -n mmdeploy python=${PYTHON_VERSION}
conda activate mmdeploy
JetPack SDK 4+ 自带 python 3.6。我们强烈建议使用默认的 python 版本。尝试升级 python 可能会破坏 JetPack 环境。
如果必须安装更高版本的 python, 可以选择安装 JetPack 5+,其提供 python 3.8。
从这里下载 Jetson 的 PyTorch wheel 文件并保存在本地目录 /opt
中。
此外,由于 torchvision 不提供针对 Jetson 平台的预编译包,因此需要从源码进行编译。
以 torch 1.10.0
和 torchvision 0.11.1
为例,可按以下方式进行安装:
# pytorch
wget https://nvidia.box.com/shared/static/fjtbno0vpo676a25cgvuqc1wty0fkkg6.whl -O torch-1.10.0-cp36-cp36m-linux_aarch64.whl
pip3 install torch-1.10.0-cp36-cp36m-linux_aarch64.whl
# torchvision
sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev libavcodec-dev libavformat-dev libswscale-dev libopenblas-dev -y
sudo rm -r torchvision
git clone https://github.com/pytorch/vision torchvision
cd torchvision
git checkout tags/v0.11.1 -b v0.11.1
export BUILD_VERSION=0.11.1
pip install -e .
如果安装其他版本的 PyTorch 和 torchvision,需参考这里的表格以保证版本兼容性。
这里我们使用 CMake 截至2022年4月的最新版本 v3.23.1。
# purge existing
sudo apt-get purge cmake
sudo snap remove cmake
# install prebuilt binary
export CMAKE_VER=3.23.1
export ARCH=aarch64
wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VER}/cmake-${CMAKE_VER}-linux-${ARCH}.sh
chmod +x cmake-${CMAKE_VER}-linux-${ARCH}.sh
sudo ./cmake-${CMAKE_VER}-linux-${ARCH}.sh --prefix=/usr --skip-license
cmake --version
MMDeploy 中的 Model Converter 依赖于 MMCV 和推理引擎 TensorRT。 同时, MMDeploy 的 C/C++ Inference SDK 依赖于 spdlog, OpenCV, ppl.cv 和 TensorRT 等。 因此,接下来我们将先介绍如何配置 TensorRT。 之后再分别展示安装 Model Converter 和 C/C++ Inference SDK 的步骤。
JetPack SDK 自带 TensorRT。 但是为了能够在 Conda 环境中成功导入,我们需要将 TensorRT 拷贝进先前创建的 Conda 环境中。
cp -r /usr/lib/python${PYTHON_VERSION}/dist-packages/tensorrt* ~/archiconda3/envs/mmdeploy/lib/python${PYTHON_VERSION}/site-packages/
conda deactivate
conda activate mmdeploy
python -c "import tensorrt; print(tensorrt.__version__)" # 将会打印出 TensorRT 版本
# 为之后编译 MMDeploy 设置环境变量
export TENSORRT_DIR=/usr/include/aarch64-linux-gnu
# 将 cuda 路径和 lib 路径写入到环境变量 `$PATH` 和 `$LD_LIBRARY_PATH` 中, 为之后编译 MMDeploy 做准备
export PATH=$PATH:/usr/local/cuda/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64
你也可以通过添加以上环境变量至 ~/.bashrc
使得它们永久化。
echo -e '\n# set environment variable for TensorRT' >> ~/.bashrc
echo 'export TENSORRT_DIR=/usr/include/aarch64-linux-gnu' >> ~/.bashrc
echo -e '\n# set environment variable for CUDA' >> ~/.bashrc
echo 'export PATH=$PATH:/usr/local/cuda/bin' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64' >> ~/.bashrc
source ~/.bashrc
conda activate mmdeploy
-
安装 MMCV
MMCV 还未提供针对 Jetson 平台的预编译包,因此我们需要从源对其进行编译。
sudo apt-get install -y libssl-dev git clone --branch 2.x https://github.com/open-mmlab/mmcv.git cd mmcv MMCV_WITH_OPS=1 pip install -e .
-
安装 ONNX
不要安装最新的 ONNX,推荐的 ONNX 版本是 1.10.0。
# 以下方式二选一 python3 -m pip install onnx==1.10.0 conda install -c conda-forge onnx
如果安装时,出现如下的报错信息:
CMake Error at CMakeLists.txt:299 (message): Protobuf compiler not found
请根据如下指令,安装依赖项:
sudo apt-get install protobuf-compiler libprotoc-dev
-
安装 ONNX Runtime [可选]
访问 Jetson_Zoo#ONNX_Runtime 找到对应版本的 ONNX Runtime,然后下载并安装。
示例:
# Download pip wheel from location mentioned above
$ wget https://nvidia.box.com/shared/static/jy7nqva7l88mq9i8bw3g3sklzf4kccn2.whl -O onnxruntime_gpu-1.10.0-cp36-cp36m-linux_aarch64.whl
# Install pip wheel
$ pip3 install onnxruntime_gpu-1.10.0-cp36-cp36m-linux_aarch64.whl
-
安装 h5py 和 pycuda
Model Converter 使用 HDF5 存储 TensorRT INT8 量化的校准数据;需要 pycuda 拷贝显存
sudo apt-get install -y pkg-config libhdf5-100 libhdf5-dev pip install versioned-hdf5 pycuda
如果你不需要使用 MMDeploy C/C++ Inference SDK 则可以跳过本步骤。
-
安装 spdlog
“
spdlog
是一个快速的,仅有头文件的 C++ 日志库。”sudo apt-get install -y libspdlog-dev
-
安装 ppl.cv
“
ppl.cv
是 OpenPPL 的高性能图像处理库。”git clone https://github.com/openppl-public/ppl.cv.git cd ppl.cv export PPLCV_DIR=$(pwd) echo -e '\n# set environment variable for ppl.cv' >> ~/.bashrc echo "export PPLCV_DIR=$(pwd)" >> ~/.bashrc ./build.sh cuda
git clone -b main --recursive https://github.com/open-mmlab/mmdeploy.git
cd mmdeploy
export MMDEPLOY_DIR=$(pwd)
由于一些算子采用的是 OpenMMLab 代码库中的实现,并不被 TenorRT 支持,
因此我们需要自定义 TensorRT 插件,例如 roi_align
, scatternd
等。
你可以从这里找到完整的自定义插件列表。
# 编译 TensorRT 自定义算子
mkdir -p build && cd build
cmake .. -DMMDEPLOY_TARGET_BACKENDS="trt"
make -j$(nproc) && make install
# 安装 model converter
cd ${MMDEPLOY_DIR}
pip install -v -e .
# "-v" 表示显示详细安装信息
# "-e" 表示在可编辑模式下安装
# 因此任何针对代码的本地修改都可以在无需重装的情况下生效。
如果你不需要使用 MMDeploy C/C++ Inference SDK 则可以跳过本步骤。
-
编译 SDK Libraries 和 Demos
mkdir -p build && cd build cmake .. \ -DMMDEPLOY_BUILD_SDK=ON \ -DMMDEPLOY_BUILD_SDK_PYTHON_API=ON \ -DMMDEPLOY_BUILD_EXAMPLES=ON \ -DMMDEPLOY_TARGET_DEVICES="cuda;cpu" \ -DMMDEPLOY_TARGET_BACKENDS="trt" \ -DMMDEPLOY_CODEBASES=all \ -Dpplcv_DIR=${PPLCV_DIR}/cuda-build/install/lib/cmake/ppl make -j$(nproc) && make install
-
运行 demo
以目标检测为例:
./object_detection cuda ${directory/to/the/converted/models} ${path/to/an/image}
-
pip install
报错Illegal instruction (core dumped)
echo '# set env for pip' >> ~/.bashrc echo 'export OPENBLAS_CORETYPE=ARMV8' >> ~/.bashrc source ~/.bashrc
如果上述方法仍无法解决问题,检查是否正在使用镜像文件。如果是的,可尝试:
rm .condarc conda clean -i conda create -n xxx python=${PYTHON_VERSION}
-
#assertion/root/workspace/mmdeploy/csrc/backend_ops/tensorrt/batched_nms/trt_batched_nms.cpp,98
orpre_top_k need to be reduced for devices with arch 7.2
- 设置为
MAX N
模式并执行sudo nvpmodel -m 0 && sudo jetson_clocks
。 - 效仿 mmdet pre_top_k,减少配置文件中
pre_top_k
的个数,例如1000
。 - 重新进行模型转换并重新运行 demo。
- 设置为
- 错误
error: cannot import name 'ProcessGroup' from 'torch.distributed'.
- 请访问 pytorch-for-jetson 安装 pytorch 1.11 版本。