注意
转到末尾下载完整示例代码
使用 Torch-TensorRT torch.compile
前端编译 GPT2¶
本示例展示了使用 Torch-TensorRT 的 torch.compile
前端优化的最新模型 GPT2。在编译前请安装以下依赖项。
pip install -r requirements.txt
GPT2 是一个因果(单向)Transformer,它在非常大的文本语料库上使用语言建模进行了预训练。在本示例中,我们使用 HuggingFace 上提供的 GPT2 模型,并对其应用 torch.compile 以获取图的图模块表示。Torch-TensorRT 将此图转换为优化的 TensorRT 引擎。
导入必要的库¶
import torch
import torch_tensorrt
from transformers import AutoModelForCausalLM, AutoTokenizer
定义必要的参数¶
Torch-TensorRT 需要 GPU 才能成功编译模型。MAX_LENGTH
是生成词元(token)的最大长度。这对应于输入提示的长度 + 生成的新词元的数量。
MAX_LENGTH = 32
DEVICE = torch.device("cuda:0")
模型定义¶
我们使用 AutoModelForCausalLM
类从 Hugging Face 加载预训练的 GPT2 模型。Torch-TRT 当前不支持 kv_cache
,因此设置 use_cache=False
。
with torch.no_grad():
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = (
AutoModelForCausalLM.from_pretrained(
"gpt2",
pad_token_id=tokenizer.eos_token_id,
use_cache=False,
attn_implementation="eager",
)
.eval()
.cuda()
)
PyTorch 推理¶
对样本输入提示进行分词,并获取 PyTorch 模型输出。
prompt = "I enjoy walking with my cute dog"
model_inputs = tokenizer(prompt, return_tensors="pt")
input_ids = model_inputs["input_ids"].cuda()
AutoModelForCausalLM
类的 generate()
API 用于使用贪心解码进行自回归生成。
pyt_gen_tokens = model.generate(
input_ids,
max_length=MAX_LENGTH,
use_cache=False,
pad_token_id=tokenizer.eos_token_id,
)
Torch-TensorRT 编译与推理¶
输入序列长度是动态的,因此我们使用 torch._dynamo.mark_dynamic
API 对其进行标记。我们提供一个 (min, max) 范围,以便 TensorRT 预先知道要为哪些值进行优化。通常,这会是模型的上下文长度。由于 0/1 特化,我们从 min=2
开始。
torch._dynamo.mark_dynamic(input_ids, 1, min=2, max=1023)
model.forward = torch.compile(
model.forward,
backend="tensorrt",
dynamic=None,
options={
"enabled_precisions": {torch.float32},
"disable_tf32": True,
"min_block_size": 1,
},
)
使用 TensorRT 模型进行贪心解码的自回归生成循环。第一个词元的生成使用 TensorRT 编译模型,而第二个词元会遇到重新编译(这是当前的一个问题,将来会解决)。
trt_gen_tokens = model.generate(
inputs=input_ids,
max_length=MAX_LENGTH,
use_cache=False,
pad_token_id=tokenizer.eos_token_id,
)
解码 PyTorch 和 TensorRT 的输出句子¶
print(
"Pytorch model generated text: ",
tokenizer.decode(pyt_gen_tokens[0], skip_special_tokens=True),
)
print("=============================")
print(
"TensorRT model generated text: ",
tokenizer.decode(trt_gen_tokens[0], skip_special_tokens=True),
)
输出的句子应该看起来像这样:
"""
Pytorch model generated text: I enjoy walking with my cute dog, but I'm not sure if I'll ever be able to walk with my dog. I'm not sure if I'll
=============================
TensorRT model generated text: I enjoy walking with my cute dog, but I'm not sure if I'll ever be able to walk with my dog. I'm not sure if I'll
"""
脚本总运行时间: ( 0 分 0.000 秒)