【大模型系列篇】NVIDIA TensorRT-LLM 大模型推理框架实践

TensorRT-LLM是NVIDIA推出的一个开源库,用于定义、优化和执行大型语言模型(LLM)在生产环境的推理。

该库是基于 TensorRT 深度学习编译框架来构建、编译并执行计算图,并借鉴了许多 FastTransformer 中高效的 Kernels 实现,然后利用 NCCL 完成设备之间的通讯。

考虑到技术的发展和需求的差异,开发者还可以定制算子来满足定制需求,比如基于 cutlass 开发定制 GEMM。TensorRT-LLM 是一款致力于提供高性能并不断完善其实用性的 NVIDIA 官方推理方案。

开源社区

TensorRT-LLM已经在GitHub上开源,分为Release branch和Dev branch,其中Release branch每月更新一次,而Dev branch则更频繁地更新来自官方或社区中的功能,方便开发者体验、评估最新功能。

开源地址:https://github.com/NVIDIA/TensorRT-LLM

主要功能

Attention
FMHA(Fused multi-head attention) 

由于 Transformer 中最为耗时的部分是 self-attention 的计算,因此官方设计了 FMHA 来优化 self-attention 的计算,并提供了累加器分别为 fp16 和 fp32 不同的版本。

另外,除了速度上的提升外,对内存的占用也大大降低。还提供了基于 flash attention 的实现,可以将 sequence-length 扩展到任意长度。

FMHA 的详细信息,其中 MQA 为 Multi Query Attention,GQA 为 Group Query Attention。

MMHA(Masked Multi-Head Attention)

FMHA 主要用在 context phase 阶段的计算,而 MMHA 主要提供 generation phase 阶段 attention 的加速,并提供了 Volta 和之后架构的支持。相比 FastTransformer 的实现,TensorRT-LLM 有进一步优化,性能提升高达 2x。

量化技术

默认采用 FP16/BF16 的精度推理,可以更低精度的方式实现推理加速。

常用量化方式主要分为 PTQ(Post Training Quantization)和 QAT(Quantization-aware Training),对于 TensorRT-LLM 而言,这两种量化方式的推理逻辑是相同的。对于 LLM 量化技术,一个重要的特点是算法设计和工程实现的 co-design,即对应量化方法设计之初,就要考虑硬件的特性。否则,有可能达不到预期的推理速度提升。

TensorRT 中 PTQ 量化步骤一般分为如下几步,首先对模型做量化,然后对权重和模型转化成 TensorRT-LLM 的表示。对于一些定制化的操作,还需要用户自己编写 kernels。

常用的 PTQ 量化方法包括 INT8 weight-only、SmoothQuant、GPTQ 和 AWQ,这些方法都是典型的 co-design 的方法。

业界主流的量化算法可以分成三类:W4A16,W8A8,W4A4 

第一个量化方法是INT8 weight-only 直接把权重量化到 INT8,但是激活值还是保持为 FP16。该方法的好处就是模型存储2x减小,加载 weights 的存储带宽减半,达到了提升推理性能的目的。这种方式业界称作 W8A16,即权重为 INT8,激活值为 FP16/BF16——以 INT8 精度存储,以 FP16/BF16 格式计算。该方法直观,不改变 weights,容易实现,具有较好的泛化性能。

第二个量化方法是 SmoothQuant,该方法是 NVIDIA 和社区联合设计的。它观察到权重通常服从高斯分布,容易量化,但是激活值存在离群点,量化比特位利用不高。SmoothQuant 通过先对激活值做平滑操作即除以一个scale将对应分布进行压缩,同时为了保证等价性,需要对权重乘以相同的 scale。之后,权重和激活都可以量化。对应的存储和计算精度都可以是 INT8 或者 FP8,可以利用 INT8 或者 FP8 的 TensorCore 进行计算。在实现细节上,权重支持 Per-tensor 和 Per-channel 的量化,激活值支持 Per-tensor 和 Per-token 的量化。

第三个量化方法是 GPTQ,一种逐层量化的方法,通过最小化重构损失来实现。GPTQ 属于 weight-only 的方式,计算采用 FP16 的数据格式。该方法用在量化大模型时,由于量化本身开销就比较大,所以作者设计了一些 trick 来降低量化本身的开销,比如 Lazy batch-updates 和以相同顺序量化所有行的权重。GPTQ 还可以与其他方法结合使用如 grouping 策略。并且,针对不同的情况,TensorRT-LLM 提供了不同的实现优化性能。具体地,对 batch size 较小的情况,用 cuda core 实现;相对地,batch size 较大时,采用 tensor core 实现。

第四个量化方式是 AWQ。该方法认为不是所有权重都是同等重要的,其中只有 0.1%-1% 的权重(salient weights)对模型精度贡献更大,并且这些权重取决于激活值分布而不是权重分布。该方法的量化过程类似于 SmoothQuant,差异主要在于 scale 是基于激活值分布计算得到的。

多卡和多机支持

TensorRT-LLM 目前提供了 Tensor Parallelism 和 Pipeline Parallelism 两种并行机制,支持单机单卡、单机多卡、多机多卡的推理需求。在一些场景中,大模型过大无法放在单个 GPU 上推理,或者可以放下但是影响了计算效率,都需要多卡或者多机进行推理,以提升性能。

TP 是垂直地分割模型然后将各个部分置于不同的设备上,这样会引入设备之间频繁的数据通讯,一般用于设备之间有高度互联的场景,如 NVLINK。另一种分割方式是横向切分,此时只有一个横前面,对应通信方式是点对点的通信,适合于设备通信带宽较弱的场景。

In-flight batching

Batching 是提高推理性能一个比较常用的做法,但在 LLM 推理场景中,一个 batch 中每个 sample/request 的输出长度是无法预测的。如果按照静态batching的方法,一个batch的时延取决于 sample/request 中输出最长的那个。因此,虽然输出较短的 sample/request 已经结束,但是并未释放计算资源,其时延与输出最长的那个 sample/request 时延相同。

In-Flight Batching 又名 Continuous Batching 或 iteration-level batching,该技术可以提升推理吞吐率,降低推理时延。In-flight batching 的做法是在已经结束的 sample/request 处插入新的 sample/request。这样,不但减少了单个 sample/request 的延时,避免了资源浪费问题,同时也提升了整个系统的吞吐。

易用

TensorRT-LLM提供了类似于PyTorch的API,降低了开发者的学习成本。同时,该库支持多种编程语言接口,包括Python和C++,方便开发者根据需求选择合适的开发环境。此外,TensorRT-LLM还提供了许多预定义好的模型,方便用户直接使用‌。

部分主流模型支持的量化精度
千问各版本模型支持的量化精度
性能

TensorRT-LLM在性能上表现出色,与Hugging Face Transformers(HF)相比,性能提升约2~3倍。此外,TensorRT-LLM通过支持多种量化精度和高效的缓存机制,可以进一步提升了推理效率‌。此次引用其他模型的评测效果对比:

推理快速实践

TensorRT-LLM 整体流程
  • 安装 NVIDIA Container Toolkit 
  • 下载合适的镜像,选择对应的cuda版本,操作系统建议下载ubuntu22.04系统的版本对应Python3.10版本
# 可以使用Docker Proxy镜像加速:https://dockerproxy.net
docker pull nvidia/cuda:12.4.0-devel-ubuntu22.04 
  • 启动容器
# Obtain and start the basic docker image environment (optional).
docker run --rm --ipc=host --runtime=nvidia --gpus all --entrypoint /bin/bash -it nvidia/cuda:12.4.0-devel-ubuntu22.04
  • 安装TensorRT-LLM,进入容器
# Install dependencies, TensorRT-LLM requires Python 3.10
apt-get update && apt-get -y install python3.10 python3-pip openmpi-bin libopenmpi-dev git git-lfs

# Install the latest preview version (corresponding to the main branch) of TensorRT-LLM.
# If you want to install the stable version (corresponding to the release branch), please
# remove the `--pre` option.
pip3 install tensorrt_llm -U --pre --extra-index-url https://pypi.nvidia.com

# Check installation
python3 -c "import tensorrt_llm"
  • 下载代码(可以使用gitcode加速),验证chatglm-6b模型推理
# 可以使用gitcode加速 
# git clone https://gitcode.com/gh_mirrors/te/TensorRT-LLM.git
git clone https://github.com/NVIDIA/TensorRT-LLM.git
cd TensorRT-LLM
pip install -r examples/chatglm/requirements.txt
git lfs install
  • 下载模型,选择modelscope进行下载
CHATGLM_PATH="/root/TensorRT-LLM/examples/chatglm"
git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git $CHATGLM_PATH/chatglm3-6b
  • 模型格式转换
# Convert checkpoint from HF to TRT-LLM format
python3 $CHATGLM_PATH/convert_checkpoint.py \
                --model_dir $CHATGLM_PATH/chatglm3-6b \
                --dtype float16 \
                --output_dir $CHATGLM_PATH/chatglm3-6b/trt_ckpt/fp16/1-gpu/
                
# Build TensorRT-LLM model from checkpoint
trtllm-build --checkpoint_dir $CHATGLM_PATH/chatglm3-6b/trt_ckpt/fp16/1-gpu/ \
             --gemm_plugin float16 \
             --output_dir $CHATGLM_PATH/chatglm3-6b//trt_engines/fp16/1-gpu/

  • 量化 -【INT8 weight-only】
# Build the chatglm3-6b using a single GPU and apply INT8 weight-only quantization.
python3 $CHATGLM_PATH/convert_checkpoint.py \
                --model_dir $CHATGLM_PATH/chatglm3-6b \
                --dtype float16 \
                --use_weight_only \
                --output_dir $CHATGLM_PATH/chatglm3-6b/trt_ckpt/int8_weight_only/1-gpu/
                
trtllm-build --checkpoint_dir $CHATGLM_PATH/chatglm3-6b/trt_ckpt/int8_weight_only/1-gpu/ \
             --gemm_plugin float16 \
             --output_dir $CHATGLM_PATH/chatglm3-6b/trt_engines/int8_weight_only/1-gpu/

  •  运行引擎进行推理,未量化vs量化
python3 /root/TensorRT-LLM/examples/run.py --input_text "世界上第二高的山峰是哪座?" \
                  --max_output_len 50 \
                  --tokenizer_dir $CHATGLM_PATH/chatglm3-6b  \
                  --engine_dir $CHATGLM_PATH/chatglm3-6b/trt_engines/fp16/1-gpu/

python3 /root/TensorRT-LLM/examples/run.py --input_text "世界上第二高的山峰是哪座?" \
                  --max_output_len 50 \
                  --tokenizer_dir $CHATGLM_PATH/chatglm3-6b  \
                  --engine_dir $CHATGLM_PATH/chatglm3-6b/trt_engines/int8_weight_only/1-gpu/

### TensorRT for LLM Deployment and Optimization #### Overview of TensorRT Integration with Large Language Models (LLMs) TensorRT is an SDK designed to optimize deep learning models for inference, particularly beneficial when deploying large language models (LLMs). By leveraging the capabilities of NVIDIA GPUs, TensorRT can significantly enhance performance through various optimizations such as precision reduction from FP32 to INT8 or even lower precisions like 1-bit transformations seen in architectures similar to BitNet[^2]. This allows not only faster execution but also more efficient memory usage. For integrating TensorRT specifically into applications relying on LLMs: - **Model Serialization**: After training phases conclude, serialization processes convert trained weights into formats compatible with target hardware environments. For instance, after completing development cycles using frameworks supporting multi-GPU setups optimized via methods discussed previously[^3], one would serialize these models before moving forward towards deployment stages outlined elsewhere[^4]. - **Optimization Techniques Applied During Inference**: - *Precision Scaling*: Utilize mixed precision techniques where possible; this involves running parts of computations at reduced floating-point accuracy without sacrificing overall model fidelity. ```python import tensorrt as trt # Example configuration snippet showing how to set up builder flags for enabling fp16 mode during export phase TRT_LOGGER = trt.Logger(trt.Logger.WARNING) builder = trt.Builder(TRT_LOGGER) network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)) config = builder.create_builder_config() config.set_flag(trt.BuilderFlag.FP16) ``` - *Kernel Fusion & Pruning*: Combine operations within computational graphs reducing redundant calculations while maintaining output quality levels expected by end-users interacting directly with deployed services based around those LLM instances. - *Batch Processing*: Implement batching strategies allowing multiple inputs processed simultaneously thereby improving throughput rates especially under high concurrency scenarios common among cloud-native deployments targeting conversational AI use cases powered by advanced NLP algorithms implemented over robust infrastructure backends capable enough handling complex workloads efficiently thanks partly due contributions made toward scalable solutions mentioned earlier regarding foundational architectural advancements[^1]. --related questions-- 1. What are some best practices for optimizing LLMs specifically tailored for edge devices? 2. How does quantization impact the accuracy versus speed trade-off in LLM deployments? 3. Can you provide examples of successful production-grade implementations combining both MP and DP paradigms alongside TensorRT integrations? 4. Are there any notable differences between deploying transformer-based models versus recurrent neural networks utilizing TensorRT's optimization features?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值