注意
转到末尾 下载完整示例代码
使用 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
是生成的令牌可以具有的最大长度。这对应于输入提示的长度 + 生成的新令牌的数量
MAX_LENGTH = 32
DEVICE = torch.device("cuda:0")
模型定义¶
我们使用 AutoModelForCausalLM
类从 hugging face 加载预训练的 GPT2 模型。kv_cache
当前在 Torch-TRT 中不受支持,因此 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 秒)