引言
日暮苍山远,天寒白屋贫。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倍的速度。