# ArchLinux 安装 CUDA 、TensorRT 和 TensorRT-YOLO 记录
# 安装 TensorRT 和 CUDA
根据 TensorRT-YOLO Github 页面使用教程中的 快速编译安装 进行,编译前首先要安装 xmake CUDA 和 TensorRT。
xmake 简单,只需要:
yay -S xmake
安装 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 软件包问题页面中阅读更多详细信息。
两个解决办法:
使用 downgrade 降级 CUDA 到 12.4.1 :
sudo downgrade cuda
但是下载速度异常缓慢,几十 kb 每秒(刚开始还比较快),故放弃。
我也尝试过在英伟达官网进行下载 CUDA ,首先你必须注册一个账号,其次,官网上 CUDA 只支持特定的几个 Linux 发行版,其中刚好没有 ArchLinux(那 AUR 的软件包是从何而来的?)
手动安装 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 ,方法有用。
在解决了各种版本问题后,我目前安装的环境如下:
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。
按教程安装 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 遇到错误。而且报错似乎是代码方面的错误,多方查阅也没有解决。放弃。
第二天,由于 NVIDIA 的 GitHub TensorRT Build 的教程所给示例都是 Ubuntu 的,并且 英伟达官网的 CUDA 也没有提供 Archlinux 版本。怀疑是不是因为系统的原因。今天尝试降级 cuda 发现下载速度不再缓慢,于是换成上面第二个方案。
使用 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 时没有安装,也看到 这篇帖子 说到这点:
- 因為軟體授權限制,無法直接用 yay 裝,需要手動複製 AUR 儲存庫
sudo pacman -S base-devel
git clone https://aur.archlinux.org/tensorrt.git
- 然後到 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
。