logo 🤗

技术视野

聚焦科技前沿,分享技术解析,洞见未来趋势。在这里,与您一起探索人工智能的无限可能,共赴技术盛宴。

背景

  • 想要在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环境
  1. 下载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
  1. 给予可执行权限
chmod +x cuda_12.2.2_535.104.05_linux.run
  1. 正式执行
./cuda_12.2.2_535.104.05_linux.run
  1. 输入accept,然后回车
  2. 按空格勾选或者取消勾选和上下方向键上下移动,只勾选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
  1. 输入Yes确定。
  2. 再次确认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
  1. 删除安装包(可选)
rm cuda_12.2.2_535.104.05_linux.run
  1. 删除已存在的cuda11.8(可选)
rm -rf /usr/local/cuda-11.8
rm -rf /usr/local/cuda-11

安装cudnn
  1. 去英伟达官网下载cudnn,需要登陆英伟达账号(邮箱/微信登陆,没有就注册一个)。官网链接:https://developer.nvidia.com/cudnn
  2. 由于系统也内置了cudnn,并且看样子是通过cudnn安装的,所以选择安装包的时候也选择Deb格式,用来覆盖旧版安装会更好。
  3. 点击Local Installer for Ubuntu22.04 x86_64 (Deb)下载cudnn 8.9.5 for cuda 12.x & ubuntu 22.04 deb格式的cudnn。
  4. 安装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
  1. 删除安装包
rm -rf /var/cudnn-local-repo-ubuntu2204-8.9.5.30/
  1. 验证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
  1. 设置环境变量
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;
  1. 下载TensorRT并且解压TensorRT
wget ${RELEASE_URL_TRT} -O /tmp/TensorRT.tar
tar -xf /tmp/TensorRT.tar -C /usr/local/
  1. 移动解压后的文件到/usr/local/tensorrt/目录,和官方容器保持一致,然后删除tensorrt的压缩包
mv /usr/local/TensorRT-${TRT_VER} /usr/local/tensorrt
rm -rf /tmp/TensorRT.tar
  1. 配置ldconfig,然后lib可以被系统找到
echo "/usr/local/tensorrt/lib" > /etc/ld.so.conf.d/tensorrt.conf
  1. 确定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
  1. 设置环境
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目录编译
  1. 下载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
  1. 进入编译目录路径
cd /root/autodl-tmp/TensorRT-LLM/docker/common
  1. 安装基础依赖
apt update
sudo apt-get install -y --no-install-recommends ccache wget gdb git-lfs libffi-dev libopenmpi-dev
  1. 安装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
  1. 测试python tensorrt版本,输出9.2.0.post12.dev5则表示正常
python3 -c "import tensorrt as trt; print(trt.__version__)"
  1. 安装polygraphy
cd /root/autodl-tmp/TensorRT-LLM/docker/common/
chmod +x install_polygraphy.sh
./install_polygraphy.sh
  1. 一键编译whl文件,编译过程中发现/tmp目录大量占用空间,而AutoDL附赠的30G系统空间不太够用,所以需要指定一个大点的路径来充当tmp路径。
  • 设置数据盘为tmp路径,这个有免费50G空间
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
  • 手动拉取lfs大文件
git lfs install && git lfs pull
  • 一键编译,大概需要1个小时左右
export BUILD_WHEEL_ARGS="--clean --trt_root /usr/local/tensorrt"

python3 scripts/build_wheel.py ${BUILD_WHEEL_ARGS}
  1. 安装whl文件
cd /root/autodl-tmp/TensorRT-LLM/build
pip install tensorrt_llm-0.6.1-py3-none-any.whl
  1. 安装后清理一下cache。
# 顺便清理cache
rm ~/.cache/ -rf
  1. 测试安装后tensorrt-llm版本
pip list | grep tensorrt-llm

# 输出
# tensorrt-llm             0.6.1
  1. 测试tensorrt-llm
python3 -c "import tensorrt_llm; print(tensorrt_llm.__path__)"

测试TensorRT-LLM是否可用

  1. 将刚刚下载的仓库再下载一份到/root路径,防止后续有发生更新,导致你编译的和它不一样而报错,此时可以不用管第三方仓库和lfs大文件了,因为这个只有编译的时候采用
cd /root
git clone https://ghproxy.net/https://github.com/NVIDIA/TensorRT-LLM.git -b rel
  1. 测试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
  1. 最后,去容器实例关机一下,然后将其保存为镜像,镜像名称随意。

其他教程

版权属于:tlntin
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2023年12月09日 17:29


39 文章数
5 分类数
40 页面数
已在风雨中度过 1年188天15小时42分
目录
来自 《在AutoDL上编译TensorRT-LLM》
暗黑模式
暗黑模式
返回顶部
暗黑模式
暗黑模式
返回顶部