# Triton-Server-TensorrtLLM-ChatGLM3
<a name="o5JjG"></a>
## 介绍
<a name="fOrL4"></a>
### Triton inference server
Triton 推理服务器是英伟达 NVIDIA AIE 的组成部分,同时也是一个**开源**的推理服务软件,用于**简化 AI 模型的部署和推理过程,并提供高性能的推理服务**。<br />Triton 推理服务器提供了标准化的 AI 推理流程,**支持部署各种深度学习和机器学习框架的AI模型**, 包括 TensorRT、TensorFlow、PyTorch、ONNX、OpenVINO、Python、RAPIDS FIL等 。Triton 推理服务器可以在 NVIDIA GPU、x86 和 ARM CPU 以及 AWS Inferentia 等设备上进行**云端**、**数据中心**、**边缘**和**嵌入式设备**的推理。
<br />Triton的**主要特性**包括:
- 支持多种机器学习/深度学习框架
- 并发模型执行
- 动态批处理
- 序列批处理和隐式状态管理用于有状态模型
- 提供后端API,允许添加自定义后端和前/后处理操作
- 使用集成( Ensembles)和业务逻辑脚本( BLS)构建模型Pipeline
- 基于社区开发的KServe协议的HTTP/REST和GRPC推理协议
- 支持C API和Java API直接链接到应用程序
- 指示GPU利用率 、服务器吞吐量 、服务器延迟等指标
Triton 推理服务器对多种查询类型提供高效的推理,支持**实时查询**、**批处理查询**、**集成模型查询**和**音视频流查询**等。
<a name="atp6I"></a>
### TensorRT-LLM
TensorRT-LLM是针对大型语言模型构建最优化的 TensorRT 引擎,以在 NVIDIA GPU 上高效执行推理 。<br />TensorRT-LLM 包含用于创建执行这些 TensorRT 引擎的 Python 和 C++ 运行时的组件,还包括与 NVIDIA Triton 推理服务器集成的后端,用于提供大模型服务的生产级系统。**TensorRT-LLM 支持单个 GPU 到多节点多 GPU 的各种配置环境的使用,同时支持近30余种国内外流行大模型的优化**。<br />TensorRT-LLM 的具体性能可以查看官方性能页面,其优势在一些测试和报道中也已经得到体现:NVIDIA TensorRT-LLM 在 NVIDIA H*GPU (80GB)上大幅提升大型语言模型的推理速度。<br />TensorRT-LLM 优化特性覆盖了以下几个方面:<br />**1. 注意力优化(Attention Optimizations)**
- Multi-head Attention (MHA):将注意力计算分解为多个头,提高并行性,并允许模型关注输入的不同维度语义空间的信息,然后再进行拼接。
- Multi-query Attention (MQA):与MHA不同的,MQA 让所有的头之间共享同一份 Key 和 Value 矩阵,每个头只单独保留了一份 Query 参数,从而大大减少 Key 和 Value 矩阵的参数量,提高吞吐量并降低延迟。
- Group-query Attention (GQA):介于MHA和MQA,将查询分组以减少内存访问和计算,提高效率。
- In-flight Batching:重叠计算和数据传输以隐藏延迟并提高性能。
- Paged KV Cache for the Attention :在注意力层中缓存键值对,减少内存访问并加快计算速度。
**2. 并行性( Parallelism)**
- Tensor Parallelism :将模型层分布在多个 GPU 上,使其能够扩展到大型模型。
- Pipeline Parallelism :重叠不同层的计算,降低整体延迟。
**3. 量化( Quantization)**
- INT4/INT8 weight-only (W4A16 和 W8A16):将权重存储为 4 位或 8 位整型减少模型大小和内存占用,同时保持激活在 16 位浮点精度。
- SmoothQuant:为注意力层提供平滑量化,保留准确性。
- GPTQ:一次性权重量化方法,针对 GPT 类似模型架构量身定制的量化技术,同时保持精度。
- AWQ:自适应权重量化,动态调整不同部分模型的量化精度,确保高精度和效率。
- FP8:在支持的 GPU( 如 NVIDIA Hopper)上利用 8 位浮点精度进行计算,进一步减少内存占用并加速处理。
**4. 解码优化( Decoding Optimizations)**
- Greedy-search:贪婪搜索,一次生成一个文本令牌,通过选择最可能的下一个令牌,快速但可能不太准确。
- Beam-search:束搜索,跟踪多个可能的令牌序列,提高准确性但增加计算成本。
**5. 其他**
- RoPE (相对位置编码):高效地嵌入令牌的相对位置信息,增强模型对上下文的理解。
能否使用特定优化取决于模型架构、硬件配置和所需的性能权衡,目前最新版本中,并非所有模型都支持上述优化。TensorRT-LLM 提供了一个灵活的框架,可用于尝试不同的优化策略,以实现特定用例的最佳结果。通过一系列的优化技术,能显著提高大语言模型在 NVIDIA GPU 上的性能和效率。
TensorRT-LLM 使用的流程:<br />
<a name="Fgnuc"></a>
## 部署实践
<a name="BuJXo"></a>
### 系统环境
- GPU: A30 24G *4
- Memory: 256GB
- Host OS:Ubuntu 22.04
- GPU Driver:545.29.06
- Cuda Toolkit:cuda_12.3
<a name="QBx0Q"></a>
### 版本说明
- Docker Image:nvcr.io/nvidia/tritonserver:24.01-trtllm-python-py3
- Docker Image:baseten/tensorrt-llm-benchmarks:v0.7.1
我们使用的triton版本是24.01,与此对应的tensorrtllm版本需要是v0.7.1,[这里](https://docs.nvidia.com/deeplearning/frameworks/support-matrix/index.html)可以看到不同版本对驱动、cuda以及pytorch、tensorrt-llm的要求。
<a name="JGsWv"></a>
### 拉取tritonserver镜像
```shell
docker pull nvcr.io/nvidia/tritonserver:24.01-trtllm-python-py3
```
<a name="iSy2L"></a>
### clone tensorrtllm项目
```shell
git clone -b v0.7.1 --depth=1 https://github.com/triton-inference-server/tensorrtllm_backend.git
```
<a name="YeJEE"></a>
### 复制文件
```shell
cd tensorrtllm_backend
mkdir triton_model_repo
cp -r all_models/inflight_batcher_llm/* triton_model_repo/
```
<a name="nY6HO"></a>
### 在tensorrt-llm容器里编译chatglm3-6b的engine
因为我在本地无法执行`make -C docker release_build`,来构建tensorrt-llm的docker镜像,因此选择直接拉取镜像文件,然后将本地模型文件挂载在容器内,来进行模型的编译。
```shell
sudo docker run --gpus all \
--name trt_llm \
-d \
--ipc=host \
--ulimit memlock=-1 \
-v /home/lead/models:/mnt\
--restart=always \
--ulimit stack=67108864 \
baseten/tensorrt-llm-benchmarks:v0.7.1 sleep 8640000
sudo docker exec -it trt_llm /bin/bash
```
然后是构建推理引擎
```shell
python3 chatglm/build.py \
-m chatglm3_6b \
--model_dir /mnt/chatglm3-6b/ \
--world_size 4 --tp_size 4 \
--max_batch_size 256 \
--max_output_len 2048 \
--max_input_len 2048 \
--enable_context_fmha \
--use_gpt_attention_plugin \
--paged_kv_cache \
--output_dir chatglm/trt_engines/chatglm3_6b/fp16/triton_4-gpu_v2
```
build.py 参数选择
1. --model_name {chatglm_6b,chatglm2_6b,chatglm2_6b_32k,chatglm3_6b,chatglm3_6b_base,chatglm3_6b_32k,glm_10b}:指定要构建的模型名称。使用下划线而不是连字符来连接名称部分。
2. --world_size WORLD_SIZE:指定世界大小,目前只支持张量并行。
3. --tp_size TP_SIZE:指定张量并行的大小。
4. --pp_size PP_SIZE:指定流水线并行的大小。
5. --model_dir MODEL_DIR:指定模型目录。
6. --quant_ckp