使用 Torch-TensorRT 编译导出程序¶
Pytorch 2.1 引入了 torch.export API,可以将 Pytorch 程序中的图导出为 ExportedProgram 对象。Torch-TensorRT dynamo 前端会编译这些 ExportedProgram 对象并使用 TensorRT 对其进行优化。以下是 dynamo 前端的一个简单用法
import torch
import torch_tensorrt
model = MyModel().eval().cuda()
inputs = [torch.randn((1, 3, 224, 224), dtype=torch.float32).cuda()]
exp_program = torch.export.export(model, tuple(inputs))
trt_gm = torch_tensorrt.dynamo.compile(exp_program, inputs) # Output is a torch.fx.GraphModule
trt_gm(*inputs)
注意
torch_tensorrt.dynamo.compile 是用户与 Torch-TensorRT dynamo 前端交互的主要 API。模型的输入类型应为 ExportedProgram(理想情况下是 torch.export.export 或 torch_tensorrt.dynamo.trace 的输出,详见下文章节),输出类型为一个 torch.fx.GraphModule 对象。
可自定义设置¶
用户有许多选项可以自定义 TensorRT 优化的设置。一些常用的选项如下
inputs- 对于静态形状,这可以是一个 torch tensor 列表或 torch_tensorrt.Input 对象列表。对于动态形状,这应该是一个torch_tensorrt.Input对象列表。enabled_precisions- TensorRT 构建器在优化期间可以使用的一组精度。truncate_long_and_double- 将 long 和 double 值分别截断为 int 和 float。torch_executed_ops- 强制由 Torch 执行的算子。min_block_size- 作为 TensorRT 段执行所需的连续算子的最小数量。
完整的选项列表可以在这里找到
注意
目前 Dynamo 不支持 INT 精度。目前该支持存在于我们的 Torchscript IR 中。我们计划在下一个版本中为 dynamo 实现类似的支持。
底层原理¶
在底层,torch_tensorrt.dynamo.compile 对图执行以下操作:
降低 (Lowering) - 应用降低 Pass 以添加/删除算子,从而实现最优转换。
分区 (Partitioning) - 根据
min_block_size和torch_executed_ops字段将图划分为 Pytorch 段和 TensorRT 段。转换 (Conversion) - 在此阶段,Pytorch 算子被转换为 TensorRT 算子。
优化 (Optimization) - 转换后,我们构建 TensorRT 引擎并将其嵌入到 pytorch 图中。
追踪 (Tracing)¶
torch_tensorrt.dynamo.trace 可用于追踪 Pytorch 图并生成 ExportedProgram。这在内部会对算子进行一些分解以进行下游优化。随后,该 ExportedProgram 可以与 torch_tensorrt.dynamo.compile API 配合使用。如果您的模型具有动态输入形状,可以使用此 torch_tensorrt.dynamo.trace 来导出具有动态形状的模型。或者,您也可以直接使用带有约束条件的 torch.export。
import torch
import torch_tensorrt
inputs = [torch_tensorrt.Input(min_shape=(1, 3, 224, 224),
opt_shape=(4, 3, 224, 224),
max_shape=(8, 3, 224, 224),
dtype=torch.float32)]
model = MyModel().eval()
exp_program = torch_tensorrt.dynamo.trace(model, inputs)