NVIDIA TensorRT-LLM 是一个专为优化大语言模型 (LLM) 推理而设计的库。它提供了多种先进的优化技术,包括自定义 Attention Kernel、Inflight Batching、Paged KV Caching、量化技术 (FP8、INT4 AWQ、INT8 SmoothQuant 等) 以及更多功能,确保您的 NVIDIA GPU 能发挥出卓越的推理性能。
我们深知您对易用性的需求,为了让您更快上手,并迅速实现流行模型的高性能推理,我们开发了 LLM API,通过简洁的指令,您可轻松体验 TensorRT-LLM 带来的卓越性能!
LLM API 是一个 high-level Python API,专为 LLM 推理工作流而设计。以下是一个展示如何使用 TinyLlama 的简单示例:
from tensorrt_llm import LLM, SamplingParams
prompts = [
"Hello, my name is",
"The president of the United States is",
"The capital of France is",
"The future of AI is",
]
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
llm = LLM(model="TinyLlama/TinyLlama-1.1B-Chat-v1.0")
outputs = llm.generate(prompts, sampling_params)
# Print the outputs.
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text
print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
希望以上示例能帮助您快速入门 NVIDIA TensorRT-LLM LLM API。
当前 TensorRT-LLM LLM API 可支持的模型
Llama (including variants Mistral, Mixtral, InternLM)
GPT (including variants Starcoder-1/2, Santacoder)
Gemma-1/2
Phi-1/2/3
ChatGLM (including variants glm-10b, chatglm, chatglm2, chatglm3, glm4)
QWen-1/1.5/2
Falcon
Baichuan-1/2
GPT-J
Mamba-1/2
一、详细介绍
1.1 模型准备
LLM class 可支持以下三种模型导入来源:
Hugging Face Hub:直接从 Hugging Face 模型库下载模型,例如 TinyLlama/TinyLlama-1.1B-Chat-v1.0。
本地 Hugging Face 模型:使用已下载到本地的 Hugging Face 模型。
本地 TensorRT-LLM 引擎:使用通过 trtllm-build 工具构建或由 Python LLM API 保存的 Engine。
您可以使用 LLM(model=<any-model-path>) 构造函数来灵活切换这些格式。以下各节将详细介绍具体使用方法。
Hugging Face Hub
使用 Hugging Face Hub 来导入模型非常直观,只需在 LLM 构造函数中指定模型仓库名称即可:
llm = LLM(model="TinyLlama/TinyLlama-1.1B-Chat-v1.0")
本地 Hugging Face 模型
由于 Hugging Face 模型库的广泛应用,API 将 Hugging Face 格式作为主要输入来源之一。当您要使用 Llama 3.1 模型时,请通过以下命令从 Meta Llama 3.1 8B 模型页面下载模型:
git lfs install
git clone <https://huggingface.co/meta-llama/Meta-Llama-3.1-8B>
下载完成后,您可以通过以下方式加载模型:
llm = LLM(model=<path_to_meta_llama_from_hf>)
请注意,使用此模型需要遵守特定许可条款:
https://ai.meta.com/resources/models-and-libraries/llama-downloads/
在开始下载之前,请确保同意这些条款并在 Hugging Face 上完成身份验证:
https://huggingface.co/meta-llama/Meta-Llama-3-8B?clone=true
本地 TensorRT-LLM 引擎
LLM API 支持使用 TensorRT-LLM Engine,您可以通过以下两种方式构建 Engine:
您可使用 trtllm-build 工具从 Hugging Face 模型直接构建 TensorRT-LLM Engine,并将其保存到磁盘供后续使用。详细说明请参考 GitHub 上的 README 和 examples/llama 仓库。构建完成后,您可以这样加载模型:
llm = LLM(model=<path_to_trt_engine>)
或者,您可以使用 LLM instance 来创建 Engine 并保存到本地磁盘:
llm = LLM(<model-path>)
# Save engine to local disk
llm.save(<engine-dir>)
可以参考第一种方法使用 model 参数来加载 Engine。
1.2 使用技巧和故障排除
以下是针对熟悉 TensorRT-LLM 其他 API 的用户,在刚开始使用 LLM API 时可能遇到的常见问题及其解决方案:
RuntimeError: only rank 0 can start multi-node session, got 1 在使用 LLM API 进行单节点多 GPU 推理时,无需添加 mpirun 前缀。您可以直接运行 python llm_inference_distributed.py 来执行多 GPU 推理。
Slurm 节点上的挂起问题
在使用 Slurm 管理的节点上遇到挂起或其他问题时,请在启动脚本中添加前缀 mpirun -n 1 --oversubscribe --allow-run-as-root。
示例命令:
mpirun -n 1 --oversubscribe --allow-run-as-root python llm_inference_distributed.py
在通讯器 MPI_COMM_WORLD 中,MPI_ABORT 在 rank 1 上被调用,错误代码为 1。
由于 LLM API 依赖 mpi4py 库,为避免 mpi4py 中的递归生成进程,请将 LLM 类放在函数中,并在 __main__ 命名空间下保护程序的主入口点。
注意:此限制仅适用于多 GPU 推理。
二、常见自定义操作
2.1 量化
TensorRT-LLM 可以通过在 LLM 实例中设置适当 Flags,自动对 Hugging Face 模型进行量化。例如,要执行 Int4 AWQ 量化,以下代码会触发模型量化。请参考完整的支持的标志列表和可接受的值。
from tensorrt_llm.llmapi import QuantConfig, QuantAlgo
quant_config = QuantConfig(quant_algo=QuantAlgo.W4A16_AWQ)
llm = LLM(<model-dir>, quant_config=quant_config)
2.2 采样
SamplingParams 可以自定义采样策略以控制 LLM 生成的响应,如 Beam Search、Temperature 和其他参数。
例如,要启用 Beam Size 为 4 的 Beam Search,请按如下方式设置 Sampling_Params:
from tensorrt_llm.llmapi import LLM, SamplingParams, BuildConfig
build_config = BuildConfig()
build_config.max_beam_width = 4
llm = LLM(<llama_model_path>, build_config=build_config)
# Let the LLM object generate text with the default sampling strategy, or
# you can create a SamplingParams object as well with several fields set manually
sampling_params = SamplingParams(beam_width=4) # current limitation: beam_width should be equal to max_beam_width
for output in llm.generate(<prompt>, sampling_params=sampling_params):
print(output)
SamplingParams 管理并分发字段到 C++ classes,包括:
SamplingConfig:
https://nvidia.github.io/TensorRT-LLM/_cpp_gen/runtime.html#_CPPv4N12tensorrt_llm7runtime14SamplingConfigE
OutputConfig:
https://nvidia.github.io/TensorRT-LLM/_cpp_gen/executor.html#_CPPv4N12tensorrt_llm8executor12OutputConfigE
更多详情请参考 class 文档:
https://nvidia.github.io/TensorRT-LLM/llm-api/reference.html#tensorrt_llm.llmapi.SamplingParams
2.3 Build 配置
除了上述参数外,您还可以使用 build_config 类和从 trtllm-build CLI 借用的其他参数来自定义构建配置。这些构建配置选项为目标硬件和用例构建 Engine 提供了灵活性。请参考以下示例:
11m = LLM(<model-path>,
build_config=Buildconfig(
max_num_tokens=4096,
max batch size=128,
max_beam_width=4))
更多详情请参考 buildconfig 文档:
https://github.com/NVIDIA/TensorRT-LLM/blob/main/tensorrt_llm/builder.py#L476-L509
2.4 自定义 Runtime
类似于 build_config,您也可以使用 runtime_config、peft_cache_config,或其他从 Executor API 借用的参数来自定义 Runtime 配置。这些 Runtime 配置选项在 KV cache management、GPU memory allocation 等方面提供了额外的灵活性。请参考以下示例:
from tensorrt_llm.llmapi import LLM, KvCacheConfig
llm = LLM(<llama_model_path>,
kv_cache_config=KvCacheConfig(
free_gpu_memory_fraction=0.8))
2.5 自定义 Tokenizer
默认情况下,LLM API 使用 transformers 的 AutoTokenizer。您可以在创建 LLM 对象时传入自己的分词器来覆盖它。请参考以下示例:
llm=LLM(<llama_model_path>,tokenizer=<my_faster_one>)
LLM () 工作流将使用您的 tokenizer 。
也可以使用以下代码直接输入 token ID,由于未使用 Tokenizers,该代码生成的是不带文本的 token ID。
llm = LLM(<llama_model_path>)
for output in llm.generate([32, 12]):
...
更多详细信息欢迎扫描下方二维码查阅以下详细文档。
TensorRT-LLM 安装指南及 LLM API 使用详细文档:https://nvidia.github.io/TensorRT-LLM/llm-api/index.html#
关于作者
严春伟
NVIDIA 性能架构师,目前主要聚焦于大模型推理架构和优化。
张国铭
NVIDIA 性能架构师,目前主要从事大模型推理架构和优化 。
Adam Zheng
NVIDIA 产品经理,负责 NVIDIA AI 平台软件产品管理,目前主要聚焦于大模型推理架构和优化。
点击“阅读原文”或扫描海报二维码,北京时间 1 月 7 日(星期二)上午 10:30 观看 NVIDIA CEO 黄仁勋在拉斯维加斯现场发表的 CES 开幕主题演讲。