# ArchLinux 安装 CUDA 、TensorRT 和 TensorRT-YOLO 记录

# 安装 TensorRT 和 CUDA

  1. 根据 TensorRT-YOLO Github 页面使用教程中的 快速编译安装 进行,编译前首先要安装 xmake CUDA 和 TensorRT。

    xmake 简单,只需要:

    yay -S xmake
  2. 安装 CUDA 和 TensorRT

    • 安装 CUDA :

      yay -S cuda

      版本为最新版 cuda-12.5.1-1

    • 在安装 TensorRT :

      yay -S tensorrt

      遇到错误,AUR 提供的 TensorRT 目前仍是 10.1.0.27-1 版本,而 CUDA 和 TensorRT 的版本必须是一一对应的,TensorRT 使用 CUDA 。

      吐槽一下,“适配” 这件事做的不是很好,摘自 Archlinux AUR 的 tensorrt 软件包下一个老哥的评论(已置顶):

      它(指 AUR 提供的 tensorrt 10.1.0.27-1)无法针对 cuda 12.5 构建,将 cuda 降级到 12.4.1,它将起作用。长话短说:关于这一点有两个问题。首先,tensorrt 10.0.1 显然不支持 cuda 12.5,正如您在上游文档中看到的那样。其次,官方仓库中提供的当前版本的 nvidia 驱动程序不支持 cuda 12.5(cuda 12.5 是在没有支持它的驱动程序的情况下推送的),您可以在此链接的 Arch Linux cuda 软件包问题页面中阅读更多详细信息。

      两个解决办法:

      1. 使用 downgrade 降级 CUDA 到 12.4.1 :

        sudo downgrade cuda

        但是下载速度异常缓慢,几十 kb 每秒(刚开始还比较快),故放弃。

        我也尝试过在英伟达官网进行下载 CUDA ,首先你必须注册一个账号,其次,官网上 CUDA 只支持特定的几个 Linux 发行版,其中刚好没有 ArchLinux(那 AUR 的软件包是从何而来的?)

      2. 手动安装 TensorRT 的 10.2.0 版本:

        在 NVIDIA 的 GitHub TensorRT 下克隆存储库并进行安装。

        原本打算在本机上进行安装,最后 cmake 时遇到报错,问 GPT 说是 gcc 版本和 CUDA 的编译器 nvcc 版本的问题,继续查。

        最后发现 CUDA 12.4, 12.5 版本最大支持的 GCC 版本竟然是 13.2。查看本机的 gcc 版本为:

        gcc -v
        gcc 版本 14.1.1 20240522 (GCC)

        而其我并不是在英伟达官网找到的(没找到,理论上应该有),是 Google 之后在 一篇帖子 下的评论找到的,这篇帖子发布于 2011 年,但我甚至能看到今年的评论。

        评论的老哥给了一个 CUDA 版本和其支持的最高 GCC 版本的对应表格以及更多信息,首次评论在 Sep 23, 2017 at 14:23 ,最新编辑在 Jun 18 at 19:16 ,应该是相关开发人员?

        因为降级 gcc 会破坏其他依赖,无法降级,本来打算按教程使用 docker 来用的,但是这位老哥下面给出了方法,简单来说就是安装旧版本的 gcc ,之后让 CUDA 的编译器 nvcc 使用旧版本的 gcc。

        # 安装适配的旧版本 gcc
        sudo pacmane -S gcc13
        # 在 CUDA 文件夹中添加符号链接:
        cd /opt/cuda
        sudo ln -s /usr/bin/gcc-13 /usr/local/cuda/bin/gcc 
        sudo ln -s /usr/bin/g++-13 /usr/local/cuda/bin/g++

        这位老哥的评论下最新的评论在 CommentedJan 22 at 12:27 ,方法有用。

  3. 在解决了各种版本问题后,我目前安装的环境如下:

    • ArchLinux AUR 安装的 cuda-12.5.1-1。

    • 在 NVIDIA 的 GitHub TensorRT Releases 安装的 TensorRT OSS v10.2.0 存储库。

    • yay 安装 cuda-12.5.1-1 时安装 cuda-cudnn-9.2.0.82-1。

    • 指定上面安装的 gcc13 ,让 CUDA 的编译器 nvcc 使用。

    然后按照在 NVIDIA 的 GitHub TensorRT Build 的教程进行安装。

    根据上面写的推荐版本 cuda-12.5.0 + cuDNN-8.9 ,使用 downgrade 降级安装 cuDNN-8.9 版本。

    最后至此开始正式 build。

  4. 按教程安装 TensorRT 10.2.0.19 for CUDA 12.5, Linux x86_64 ,解压并设置 TRT_LIBPATH 到~/.zshrc ,然后在 TensorRT 目录下执行下面操作:

    cd $TRT_OSSPATH
     mkdir -p build && cd build
     cmake .. -DTRT_LIB_DIR=$TRT_LIBPATH -DTRT_OUT_DIR=`pwd`/out
     make -j$(nproc)

    cmake 遇到部分警告,make 遇到错误。而且报错似乎是代码方面的错误,多方查阅也没有解决。放弃。

  5. 第二天,由于 NVIDIA 的 GitHub TensorRT Build 的教程所给示例都是 Ubuntu 的,并且 英伟达官网的 CUDA 也没有提供 Archlinux 版本。怀疑是不是因为系统的原因。今天尝试降级 cuda 发现下载速度不再缓慢,于是换成上面第二个方案。

  6. 使用 yay 安装 tensorRT 安装的是 tensorrt-10.1.0.27-1 版本,查看对应的 cuda 版本为 cuda-12.4.0 + cuDNN-8.9,两个都降级到对应版本。yay 安装。

    有警告,单线程很慢,但是好得没报错,突然想起一个问题,在 NVIDIA 的 GitHub TensorRT Build 的教程中让安装了 TensorRT 10.2.0.19 for CUDA 12.5, Linux x86_64 ,这个东西当时我在使用 yay 安装 TrnsorRT 时没有安装,也看到 这篇帖子 说到这点:

    1. 因為軟體授權限制,無法直接用 yay 裝,需要手動複製 AUR 儲存庫
    sudo pacman -S base-devel
    git clone https://aur.archlinux.org/tensorrt.git
    1. 然後到 Nvidia 官網註冊帳號,下載 tar.gz 檔 (注意版本需跟 CUDA 一致),放到 tensorrt 目錄

    原文就是繁体,这里说的去官网注册账号下载 tar.gz 檔说的就是 TensorRT 10.2.0.19 for CUDA 12.5, Linux x86_64 这个东西,叫作 TensorRT GA ,在 TensorRT 安装时需要指定 TensorRT GA 发布构建路径。

    所以在我在上面安装了 TensorRT GA 并将其路径添加到~/.zshrc 之后,重新使用 yay 安装就成功了(当时没有发现错误是因为没有找到 TensorRT GA 是因为什么,它没写?还是我没仔细看,绕了一大圈),后来发现 CUDA 版本也是最新版,依然可以使用 yay 安装。(也就是说不用降级也可以,高版本 CUDA 是支持低版本 TensorRT 的)。

    所以总结一下 CUDA 通过 yay 直接安装,TensorRT 在通过 yay 安装之前需要先安装 TensorRT 10.2.0.19 for CUDA 12.5, Linux x86_64 并设置环境变量指定路径。之后也可以通过 yay 安装。

    回顾一下 Archlinux AUR 的 tensorrt 软件包下一个老哥的评论上说明的两个问题,第一个问题:

    CUDA 12.4 适用于 TensorRT 10.1.0.27。 CUDA 12.5 适用于 TensorRT 10.2.0.19。1 我这里下载的是后者,后面 tensorrt_yolo 指定的路径也是 TensorRT 10.2.0.19 。

    第二个问题是英伟达没有提供驱动,这个问题已经解决了,目前最新的驱动已经支持。

    不管如何 CUDA 和 TensorRT 总算是装好了。

# tensorrt_yolo

TensorRT-YOLO/docs/cn/build_and_install.md

# Deploy 编译

按照上面给的文档进行编译安装。

本机环境:

  • Linux: gcc/g++ 13.3.0(不知道上面降级和使用旧的 gcc 是否有影作用)
  • Xmake v2.9.3+20240624
  • CUDA 12.5.1-1
  • TensorRT 10.1.0.27-1

为了满足部署需求,您可以使用 Xmake 进行 Deploy 编译。此过程支持动态库和静态库的编译:

git clone https://github.com/laugh12321/TensorRT-YOLO
cd TensorRT-YOLO
xmake f -k shared --tensorrt="C:/Program Files/NVIDIA GPU Computing Toolkit/TensorRT/v8.6.1.6"
# xmake f -k static --tensorrt="C:/Program Files/NVIDIA GPU Computing Toolkit/TensorRT/v8.6.1.6"
xmake -P . -r

--tensorrt="C:/Program Files/NVIDIA GPU Computing Toolkit/TensorRT/v8.6.1.6" 的路径替换为自己的路径,这个路径经过我的探索,最后发现实际在 TensorRT 10.2.0.19 for CUDA 12.5, Linux x86_64 下,在我这里是: your_path/TensorRT-10.2.0.19/targets/x86_64-linux-gnu/

# 编译安装 tensorrt_yolo

跳过 PyPI 安装 tensorrt_yolo 模块部分。

pip install --upgrade build
python -m build --wheel
pip install dist/tensorrt_yolo/tensorrt_yolo-4.*-py3-none-any.whl

上面是文档给的步骤,在 TensorRT-YOLO 下 执行,第三个路径在我这里不争取。我这里对应的文件是是: TensorRT-YOLO/dist/tensorrt_yolo-4.0.0-py3-none-any.whl ,因此路径写 dist/tensorrt_yolo-4.0.0-py3-none-any.whl

# 跑模型推理示例

按照 模型推理示例 进行。

# 模型导出

首先,从 YOLOv8s 下载 YOLOv8s 模型并保存到 models 文件夹中。

注:上面是原文,这里的 models 文件夹经过我实际测试,实际上是 /TensorRT-YOLO/demo/detect/ 下的 models 文件夹。同时工作目录现在默认也是 /TensorRT-YOLO/demo/detect/

然后,使用以下指令将模型导出为带有 EfficientNMS 插件的 ONNX 格式:

trtyolo export -w yolov8s.pt -v yolov8 -o models

执行以上命令后,将在 models 文件夹下生成名为 yolov8s.onnx 的文件。然后,使用 trtexec 工具将 ONNX 文件转换为 TensorRT engine:

trtexec --onnx=models/yolov8s.onnx --saveEngine=models/yolov8s.engine --fp16

到这里都没哟遇到什么错误,第二个命令运行时我这里看起来像卡住了一样,不过最终是跑通了的。

# 模型推理

这里只讲 C++ 部分。

使用 C++ 进行推理前,请确保您已按照 Deploy 编译指南 对 Deploy 进行了编译。

接着,使用 xmake 将 detect.cpp 编译为可执行文件:

xmake f -P . --tensorrt="/path/to/your/TensorRT" --deploy=/path/to/your/TensorRT-YOLO
xmake -P . -r

注:上面是原文,这里的 "/path/to/your/TensorRT" 就是前面安装的 TensorRT 10.2.0.19 for CUDA 12.5, Linux x86_64 下的一个路径, your_path/TensorRT-10.2.0.19/targets/x86_64-linux-gnu/ 。后面的 deploy 路径就是你的 TensorRT-YOLO 路径。

在执行上述命令后,将在根目录的 build 目录下生成名为 detect 的可执行文件。最后,您可以直接运行可执行文件或使用 xmake run 命令进行推理。使用 --help 查看详细指令选项:

注;上面是原文,我这里生成的 detect 的可执行文件位于 /TensorRT-YOLO/demo/detect/build/linux/x86_64/release/ 下,同时还有一个 libdeploy.so 文件也在这个目录下。

要加速推理过程,请使用 --cudaGraph 指令,但此功能仅支持静态模型,不支持动态模型。

xmake run -P . detect -e models/yolov8s.engine -i images -o output -l labels.txt --cudaGraph

注:这里命令中的路径一定要正确,工作目录在 /TensorRT-YOLO/demo/detect/ 下时,为:

./build/linux/x86_64/release/detect -e models/yolov8s.engine -i images -o output -l labels.txt --cudaGraph

使用 xmake run 的命令没去试,直接运行 detect 就行了。输出图像在 output 文件夹下,生成文本描述 labels.txt