Bootstrap

模型推理加速系列 | 08:TensorRT-LLM助力LLM高性能推理

引言

                                                        日暮苍山远,天寒白屋贫。Created by DALL·E 3

小伙伴们好,我是《小窗幽记机器学习》的小编:卖汤圆的小女孩,今天是冬至,祝福小伙伴们幸福安康吧。紧接前文:

万字长文细说ChatGPT的前世今生

Llama 2实战(上篇):本地部署(附代码)

Llama 2实战(下篇)-中文语料微调(附代码)

Code Llama实战(上篇)-模型简介和评测

Code Llama实战(下篇)-本地部署、量化及GPT-4对比

多模态大模型:浦语·灵笔InternLM-XComposer解读、实战和思考

百川2模型解读、服务部署、微调(上篇)

百川2模型解读、服务部署、微调(下篇)

阿里千问Qwen模型解读、本地部署

天工大模型Skywork解读及揭露刷榜内幕引发的思考

今天这篇小作文主要介绍如何用TensorRT-LLM加速LLM的inference,具体包括TensorRT-LLM的安装、如何用TensorRT-LLM对Qwen做模型推理及其性能评测。如需与小编进一步交流(包括完整代码获取),可以通过《小窗幽记机器学习》添加小编好友。

简介

其实小编之前有介绍过关于如何用TensorRT提升模型推理速度,感兴趣的小伙伴可以回顾下:

TensorRT-LLM 是一个开源库,用于定义、优化和执行大型语言模型 (LLM) 在生产环境的推理。它在开源 Python API 中保留了 FasterTransformer 的核心功能,并与 TensorRT 的深度学习编译器配合使用,以快速支持新模型和定制模型。TensorRT-LLM提供了易于使用的Python API,用于定义大型语言模型(LLM)并构建包含最先进优化的TensorRT引擎,以在NVIDIA GPU上高效执行推理。TensorRT-LLM还包含用于创建执行这些TensorRT引擎的Python and C++运行时的组件。它还包括与NVIDIA Triton推理服务器集成的后端,用于在生产环境部署LLM服务。

安装TensorRT-LLM

官方提供一步创建镜像并安装依赖的脚本,这里为了更加细致化地了解各个环节,选择Step by Step安装,从而让小伙们更加清楚了解整个过程。由于TensorRT-LLM的编译对于CUDA的版本有要求,建议还是遵循以下的安装步骤,基于官方推荐的镜像环境进行编译安装。该环节如遇到问题,欢迎与小编进一步交流。

创建docker镜像

将官方仓库:https://github.com/NVIDIA/TensorRT-LLM/tree/main 拉取本地后,进入目录执行以下命令:

make -C docker build

如此会创建一个名为tensorrt_llm/devel:latest的镜像。

创建容器

make -C docker run

屏幕打印的内容如下:

docker run --rm -it --ipc=host --ulimit memlock=-1 --ulimit stack=67108864  \
                --gpus=all \
                --volume /data/home/you_name/Repository/LLM/TensorRT-LLM:/code/tensorrt_llm \
                --env "CCACHE_DIR=/code/tensorrt_llm/cpp/.ccache" \
                --env "CCACHE_BASEDIR=/code/tensorrt_llm" \
                --workdir /code/tensorrt_llm \
                --hostname VM-104-91-ubuntu-devel \
                --name tensorrt_llm-devel-root \
                --tmpfs /tmp:exec \
                tensorrt_llm/devel:latest

此后将创建一个名为tensorrt_llm-devel-root的容器。如果想要容器退出后不被销毁,注意需要修改docker run对应的参数,不要使用--rm!此外,如果想要将本地账号添加到容器内,可以如下命令:

make -C docker run LOCAL_USER=1

小编这里最终使用如下命令创建容器:

docker run -itd --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --gpus=all --volume /data/home/:/home --env "CCACHE_DIR=/home/my_name/Repository/LLM/TensorRT-LLM/cpp/.ccache" --env "CCACHE_BASEDIR=/home/my_name/Repository/LLM" --workdir /home --hostname VM-104-91-ubuntu-devel --name tensorrt_llm-devel-jason --tmpfs /tmp:exec tensorrt_llm/devel:latest bash

编译TensorRT-LLM

进入容器tensorrt_llm-devel-root内的TensorRT-LLM目录下运行如下代码:

# To build the TensorRT-LLM code.
python3 ./scripts/build_wheel.py --trt_root /usr/local/tensorrt

为加快Python包的安装,可以预先将pip的安装源改为腾讯:

pip config set global.index-url http://mirrors.cloud.tencent.com/pypi/simple
pip config set global.trusted-host mirrors.cloud.tencent.com

build_wheel.py默认是增量编译,可以通过添加--clean参数清理编译目录:

python3 ./scripts/build_wheel.py --clean  --trt_root /usr/local/tensorrt

可以指定TensorRT-LLM的编译到特定的CUDA架构。为此,build_wheel.py脚本接受一个分号分隔的CUDA架构列表,如下例所示:

# Build TensorRT-LLM for Ampere.
python3 ./scripts/build_wheel.py --cuda_architectures "80-real;86-real" --trt_root /usr/local/tensorrt

更多支持的架构可以查看CMakeLists.txt

编译成功会有如下结果:

adding 'tensorrt_llm-0.6.1.dist-info/entry_points.txt'
adding 'tensorrt_llm-0.6.1.dist-info/top_level.txt'
adding 'tensorrt_llm-0.6.1.dist-info/zip-safe'
adding 'tensorrt_llm-0.6.1.dist-info/RECORD'
removing build/bdist.linux-x86_64/wheel
Successfully built tensorrt_llm-0.6.1-cp310-cp310-linux_x86_64.whl

安装编译成功的whl文件:

# Deploy TensorRT-LLM in your environment.
pip3 install ./build/tensorrt_llm*.whl

Qwen推理

下面以Qwen-7B-chat模型为例,演示如何用TensorRT-LLM加速Qwen模型推理。

环境准备

pip3 install transformers_stream_generator tiktoken -i https://mirrors.cloud.tencent.com/pypi/simple

格式转换

为能够在TensorRT中运行LLM,需要将原始的模型格式转为TensorRT中的engine格式。根据以下转换脚本进行模型格式转换:

python3 build.py --hf_model_dir /home/model_zoo/LLM/Qwen/Qwen-7B-Chat/ --dtype float16 \
                --remove_input_padding \
                --use_gpt_attention_plugin float16 \
                --enable_context_fmha \
                --use_gemm_plugin float16 \
                --output_dir /home/model_zoo/LLM/Qwen/Qwen-7B-Chat/trt_engines/fp16/1-gpu/

转换结果如下:

ls -lrth /home/model_zoo/LLM/Qwen/Qwen-7B-Chat/trt_engines/fp16/1-gpu/

total 15G
-rw-r--r-- 1 root root 1.5K Dec 19 09:19 config.json
-rw-r--r-- 1 root root  15G Dec 19 09:19 qwen_float16_tp1_rank0.engine
-rw-r--r-- 1 root root 173K Dec 19 09:19 model.cache

inference

运行脚本:

python3 run.py \
  --tokenizer_dir /home/model_zoo/LLM/Qwen/Qwen-7B-Chat/ \
  --engine_dir /home/model_zoo/LLM/Qwen/Qwen-7B-Chat/trt_engines/fp16/1-gpu/ \
  --max_output_len 128 \
  --input_text="你好, 能做个自我介绍吗?"

输出结果如下:

Input [Text 0]: "<|im_start|>system
You are a helpful assistant.<|im_end|>
<|im_start|>user
你好, 能做个自我介绍吗?<|im_end|>
<|im_start|>assistant
"
Output [Text 0 Beam 0]: "你好!我叫通义千问,是阿里云推出的一种超大规模语言模型。我能够回答问题、创作文字,还能表达观点、撰写代码。如果您有任何问题或需要帮助,请随时告诉我,我会尽力提供支持。"

性能测试(单GPU)

backend为hf

使用官方的benchmark脚本进行测试。

执行测试脚本:

# 测量huggingface模型
python3 benchmark.py --backend=hf \
  --hf_model_dir /home/model_zoo/LLM/Qwen/Qwen-7B-Chat/ \
  --tokenizer_dir /home/model_zoo/LLM/Qwen/Qwen-7B-Chat/ \
  --dataset=ShareGPT_V3_unfiltered_cleaned_split.json \
  --hf_max_batch_size=1

测试结果如下:

Throughput: 0.15 requests/s, 73.82 tokens/s

backend为tensorRT-LLM

测试如下:

# 默认的最大长度是2048
python3 benchmark.py --backend=trt_llm \
  --tokenizer_dir /home/model_zoo/LLM/Qwen/Qwen-7B-Chat/ \
  --engine_dir /home/model_zoo/LLM/Qwen/Qwen-7B-Chat/trt_engines/fp16/1-gpu/ \
  --dataset=ShareGPT_V3_unfiltered_cleaned_split.json \
  --trt_max_batch_size=1

执行脚本开始测试:

bash qwen_benchmark_trt_llm.sh

测试结果如下:

Throughput: 0.49 requests/s, 241.83 tokens/s

从测试结果可以看出,tensorRT-LLM确实显著提升了3倍的速度。

;