背景
- 想要在B站简单分享一下TensorRT-LLM适配经验,顺便复习相关理论。
- 考虑到可能有大量用户没有显卡,但是他们又想来体验TensorRT-LLM,所以准备用源码来编译一波TensorRT-LLM,然后制作成公开镜像在AutoDL上面进行分享。
- 该镜像只支持RTX30系(Ampere)/40系(ADA),V100/A100/A10/H100等卡,不支持20系/T4/P40等显卡。
- 我的仓库:https://github.com/Tlntin/Qwen-TensorRT-LLM
准备工作
- 观察一下现有TensorRT-LLM容器中的系统配置。
- 通过观察该文件
ARG BASE_IMAGE=nvcr.io/nvidia/pytorch
ARG BASE_TAG=23.10-py3
- 可以看出目前基础容器是
nvcr.io/nvidia/pytorch:23.10-py3
- 再去官网看看这个容器里面的详细信息,官网
- 下面是23.10-py3对应的系统组件版本
| 组件 | 版本 |
| ----------- | ----------- |
| Container OS | Ubuntu 22.04 |
| CUDA | NVIDIA CUDA 12.2.2 |
| cuDNN | 8.9.5 |
| Python | 3.10.12 | - TensorRT在编译的时候会另外安装,根据下面这个文件,可以看出TensorRT版本需要的是
9.2.0.5
在autoDL选择合适的显卡和镜像
- 需要选择支持cuda12.2的显卡(这个一般由英伟达驱动决定,太老的驱动不支持太高的cuda),或者直接用CPU也可以编译,省钱。
- 需要选择系统为ubuntu 22.04的镜像
- 最好python也是3.10
- 选来选区发现有个miniconda的镜像符合,显卡选择的是A5000(或者用纯CPU),内置了cuda11.8和python3.10。除了这个,暂时没看到其他合适的。
准备环境
- 建议到
~/autodl-tmp
路径下面操作,这个地方不会占用系统空间。
安装cuda环境
- 下载cuda 12.2.2
wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run
- 给予可执行权限
chmod +x cuda_12.2.2_535.104.05_linux.run
- 正式执行
./cuda_12.2.2_535.104.05_linux.run
- 输入
accept
,然后回车 - 按空格勾选或者取消勾选和上下方向键上下移动,只勾选
CUDA Toolkit 12.2
,其他均取消勾选,然后选中Install
即可。
CUDA Installer │
│ - [ ] Driver │
│ [ ] 535.86.10 │
│ + [X] CUDA Toolkit 12.2 │
│ [ ] CUDA Demo Suite 12.2 │
│ [ ] CUDA Documentation 12.2 │
│ - [ ] Kernel Objects │
│ [ ] nvidia-fs │
│ Options │
│ Install
- 输入
Yes
确定。 - 再次确认cuda版本,看输出已经是cuda12.2.140了
nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Aug_15_22:02:13_PDT_2023
Cuda compilation tools, release 12.2, V12.2.140
Build cuda_12.2.r12.2/compiler.33191640_0
- 删除安装包(可选)
rm cuda_12.2.2_535.104.05_linux.run
- 删除已存在的cuda11.8(可选)
rm -rf /usr/local/cuda-11.8
rm -rf /usr/local/cuda-11
安装cudnn
- 去英伟达官网下载cudnn,需要登陆英伟达账号(邮箱/微信登陆,没有就注册一个)。官网链接:https://developer.nvidia.com/cudnn
- 由于系统也内置了cudnn,并且看样子是通过cudnn安装的,所以选择安装包的时候也选择Deb格式,用来覆盖旧版安装会更好。
- 点击
Local Installer for Ubuntu22.04 x86_64 (Deb)
下载cudnn 8.9.5 for cuda 12.x & ubuntu 22.04 deb格式的cudnn。 - 安装cudnn
dpkg -i cudnn-local-repo-ubuntu2204-8.9.5.30_1.0-1_amd64.deb
cd /var/cudnn-local-repo-ubuntu2204-8.9.5.30/
dpkg -i *.deb
- 删除安装包
rm -rf /var/cudnn-local-repo-ubuntu2204-8.9.5.30/
- 验证cudnn版本
$ldconfig -v | grep cudnn
libcudnn.so.8 -> libcudnn.so.8.9.5
libcudnn_cnn_infer.so.8 -> libcudnn_cnn_infer.so.8.9.5
libcudnn_adv_train.so.8 -> libcudnn_adv_train.so.8.9.5
libcudnn_ops_train.so.8 -> libcudnn_ops_train.so.8.9.5
libcudnn_ops_infer.so.8 -> libcudnn_ops_infer.so.8.9.5
libcudnn_cnn_train.so.8 -> libcudnn_cnn_train.so.8.9.5
libcudnn_adv_infer.so.8 -> libcudnn_adv_infer.so.8.9.5
安装TensorRT
- 设置环境变量
export TRT_VER="9.2.0.5"
export CUDA_VER="12.2"
export CUDNN_VER="8.9.4.25-1+cuda12.2"
export NCCL_VER="2.18.3-1+cuda12.2"
export CUBLAS_VER="12.2.5.6-1"
export ARCH="x86_64"
export TRT_CUDA_VERSION="12.2"
export OS="linux"
export RELEASE_URL_TRT=https://developer.nvidia.com/downloads/compute/machine-learning/tensorrt/9.2.0/tensorrt-${TRT_VER}.${OS}.${ARCH}-gnu.cuda-${TRT_CUDA_VERSION}.tar.gz;
- 下载TensorRT并且解压TensorRT
wget ${RELEASE_URL_TRT} -O /tmp/TensorRT.tar
tar -xf /tmp/TensorRT.tar -C /usr/local/
- 移动解压后的文件到
/usr/local/tensorrt/
目录,和官方容器保持一致,然后删除tensorrt的压缩包
mv /usr/local/TensorRT-${TRT_VER} /usr/local/tensorrt
rm -rf /tmp/TensorRT.tar
- 配置ldconfig,然后lib可以被系统找到
echo "/usr/local/tensorrt/lib" > /etc/ld.so.conf.d/tensorrt.conf
- 确定tensorrt版本是9.1.0
ldconfig -v | grep nvinfer
libnvinfer_vc_plugin.so.9 -> libnvinfer_vc_plugin.so.9.2.0
libnvinfer_dispatch.so.9 -> libnvinfer_dispatch.so.9.2.0
libnvinfer.so.9 -> libnvinfer.so.9.2.0
libnvinfer_plugin.so.9 -> libnvinfer_plugin.so.9.2.0
libnvinfer_lean.so.9 -> libnvinfer_lean.so.9.2.0
- 设置环境
echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/tensorrt/lib:/usr/local/cuda/lib64/" >> /etc/profile
echo "export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/tensorrt/lib:/usr/local/cuda/lib64/" >> ~/.bashrc
source /etc/profile
source ~/.bashrc
# 测试lib库能否找到
echo ${LD_LIBRARY_PATH}
# 输出结果
# /usr/local/tensorrt/lib:/usr/local/cuda/lib64/
安装并测试mpi4py
conda install mpi4py openmpi
$python3
Python 3.10.8 (main, Nov 24 2022, 14:13:03) [GCC 11.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from mpi4py import MPI
>>> MPI.COMM_WORLD.Get_rank()
0
>>> MPI.COMM_WORLD.Get_size()
1
编译TensorRT-LLM
- 这里建议还是在
/root/autodl-tmp
目录编译
- 下载TensorRT-LLM源码,目前
rel
为最新稳定分支(如果连不上github,可以本地下载好后,将压缩包放网盘再传上去,然后再解压;也可以用AutoDL自带的镜像加速功能,链接)
cd /root/autodl-tmp
git clone https://github.com/NVIDIA/TensorRT-LLM.git -b rel
# 或者用第三方加速源下载
git clone https://ghproxy.net/https://github.com/NVIDIA/TensorRT-LLM.git -b rel
- 进入编译目录路径
cd /root/autodl-tmp/TensorRT-LLM/docker/common
- 安装基础依赖
apt update
sudo apt-get install -y --no-install-recommends ccache wget gdb git-lfs libffi-dev libopenmpi-dev
- 安装tensorrt-python,选择和python3.10有关的whl文件。
cd /usr/local/tensorrt/python/
pip install tensorrt-9.2.0.post12.dev5-cp310-none-linux_x86_64.whl
pip install tensorrt_dispatch-9.2.0.post12.dev5-cp310-none-linux_x86_64.whl
pip install tensorrt_lean-9.2.0.post12.dev5-cp310-none-linux_x86_64.whl
- 测试python tensorrt版本,输出
9.2.0.post12.dev5
则表示正常
python3 -c "import tensorrt as trt; print(trt.__version__)"
- 安装polygraphy
cd /root/autodl-tmp/TensorRT-LLM/docker/common/
chmod +x install_polygraphy.sh
./install_polygraphy.sh
- 一键编译whl文件,编译过程中发现/tmp目录大量占用空间,而AutoDL附赠的30G系统空间不太够用,所以需要指定一个大点的路径来充当tmp路径。
cd /root/autodl-tmp/TensorRT-LLM
export TMPDIR=/root/autodl-tmp
- 拉取第三方子项目代码,如果拉取不了,则按下面的教程修改仓库地址。
git submodule update --init --recursive
- 修改一下.git/config,加上代理源,否则可能会卡住。
vim .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = https://ghproxy.net/https://github.com/NVIDIA/TensorRT-LLM.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "rel"]
remote = origin
merge = refs/heads/rel
[submodule "3rdparty/NVTX"]
active = true
url = https://github.com/NVIDIA/NVTX.git
[submodule "3rdparty/cutlass"]
active = true
url = https://github.com/NVIDIA/cutlass.git
[submodule "3rdparty/cxxopts"]
active = true
url = https://github.com/jarro2783/cxxopts
[submodule "3rdparty/json"]
active = true
url = https://github.com/nlohmann/json.git
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = https://ghproxy.net/https://github.com/NVIDIA/TensorRT-LLM.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "rel"]
remote = origin
merge = refs/heads/rel
[submodule "3rdparty/NVTX"]
active = true
url = https://ghproxy.net/https://github.com/NVIDIA/NVTX.git
[submodule "3rdparty/cutlass"]
active = true
url = https://ghproxy.net/https://github.com/NVIDIA/cutlass.git
[submodule "3rdparty/cxxopts"]
active = true
url = https://ghproxy.net/https://github.com/jarro2783/cxxopts
[submodule "3rdparty/json"]
active = true
url = https://ghproxy.net/https://github.com/nlohmann/json.git
git submodule update --init --recursive
git lfs install && git lfs pull
export BUILD_WHEEL_ARGS="--clean --trt_root /usr/local/tensorrt"
python3 scripts/build_wheel.py ${BUILD_WHEEL_ARGS}
- 安装whl文件
cd /root/autodl-tmp/TensorRT-LLM/build
pip install tensorrt_llm-0.6.1-py3-none-any.whl
- 安装后清理一下cache。
# 顺便清理cache
rm ~/.cache/ -rf
- 测试安装后tensorrt-llm版本
pip list | grep tensorrt-llm
# 输出
# tensorrt-llm 0.6.1
- 测试tensorrt-llm
python3 -c "import tensorrt_llm; print(tensorrt_llm.__path__)"
测试TensorRT-LLM是否可用
- 将刚刚下载的仓库再下载一份到/root路径,防止后续有发生更新,导致你编译的和它不一样而报错,此时可以不用管第三方仓库和lfs大文件了,因为这个只有编译的时候采用
cd /root
git clone https://ghproxy.net/https://github.com/NVIDIA/TensorRT-LLM.git -b rel
- 测试tensorrt-llm中的attention,观察tensort-llm可否正常使用(这个操作可能需要显卡)
cd /root/TensorRT-LLM/tests/attention
pip install parameterized
python3 test_bert_attention.py
- 返回下面这个说明成功了,大概需要5-10分钟才能测试完成,请耐心等待。
----------------------------------------------------------------------
Ran 49 tests in 255.221s
OK
- 最后,去容器实例关机一下,然后将其保存为镜像,镜像名称随意。
其他教程