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

2023-12-23 20:15:05

引言

?

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

文章来源:https://blog.csdn.net/ljp1919/article/details/135166070
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。