【大模型系列篇】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/

03-26
### 逆向工程与反编译概述 逆向工程是一种通过对软件的目标代码进行分析,将其转化为更高级别的表示形式的过程。这一过程通常用于研究现有系统的内部结构、功能以及实现细节。在Java和Android领域,反编译工具被广泛应用于逆向工程中。 #### Java逆向工程中的Jad反编译工具 Jad是一款经典的Java反编译工具,能够将`.class`字节码文件转换为可读的`.java`源代码[^1]。虽然它可能无法完全恢复原始源代码,但它提供了足够的信息来帮助开发者理解已编译的Java程序逻辑。Jad支持多种反编译模式,并允许用户自定义规则以适应不同的需求。此外,其命令行接口和图形界面使得复杂代码的分析变得更加便捷。 #### Android逆向工程中的JEB反编译工具 针对Android应用的逆向工程,JEB是由PNF Software开发的一款专业级工具[^2]。相较于其他同类产品,JEB不仅具备强大的APK文件反编译能力,还能对Dalvik字节码执行高效而精准的操作。它的核心优势在于以下几个方面: - **广泛的平台兼容性**:除Android外,还支持ARM、MIPS等多种架构的二进制文件反汇编。 - **混淆代码解析**:内置模块能有效应对高度混淆的代码,提供分层重构机制以便于深入分析。 - **API集成支持**:允许通过编写Python或Java脚本来扩展功能并完成特定任务。 #### APK反编译流程及其意义 当涉及到具体的APK包时,可以通过一系列步骤提取其中的信息来进行全面的安全评估或者学习目的的研究工作[^3]。这些步骤一般包括但不限于获取资产目录(`assets`)内的资源数据;解密XML配置文档如`AndroidManifest.xml`定位应用程序启动点;最后利用上述提到的各种专用软件重现整个项目框架供进一步探讨。 ```bash # 使用apktool反编译APK示例 apktool d your_app.apk -o output_directory/ ``` 以上命令展示了如何借助开源工具ApkTool轻松拆卸目标安卓档案至易于探索的状态下。 ### 结论 无论是传统的桌面端还是现代移动端环境里头,恰当运用合适的反编译解决方案都是达成逆向工程项目成功不可或缺的一环。每种工具有各自专精之处,在实际应用场景当中应当依据具体需求做出明智的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值