系统概述¶
Torch-TensorRT 主要是一个 C++ 库,计划提供 Python API。我们使用 Bazel 作为构建系统,目前的目标平台是 Linux x86_64 和 Linux aarch64(仅原生)。我们使用的编译器是 GCC 7.5.0,该库尚未在该版本之前的编译器上进行测试,因此如果您尝试使用较旧的编译器,可能会出现编译错误。
该存储库的结构如下:
core: 主编译器源代码
cpp: C++ API
tests: C++ API、核心和转换器的测试
py: Python API
notebooks: 使用 Torch-TensorRT 构建的示例应用程序
docs: 文档
docsrc: 文档源代码
third_party: 依赖库的 BUILD 文件
toolchains: 不同平台的工具链
C++ API 不稳定,在库成熟之前可能会发生变化,但大多数工作是在核心内部完成的。
核心包含几个主要部分:顶层编译器接口,用于协调导入模块、降级、转换和生成新模块,并将其返回给用户。编译器有三个主要阶段:降级阶段、转换阶段和执行阶段。
编译器阶段¶
降级¶
降级由一组传递组成(一些来自 PyTorch,一些特定于 Torch-TensorRT),这些传递在图形 IR 上运行,以将大型 PyTorch 操作集映射到更容易转换为 TensorRT 的缩减操作集。
分区¶
该阶段是可选的,由用户启用。它指示编译器将节点分成应该在 PyTorch 中运行的节点和应该在 TensorRT 中运行的节点。分离标准包括:缺少转换器、用户显式设置操作符在 PyTorch 中运行或节点具有标志,该标志指示分区在模块回退传递中在 PyTorch 中运行。
转换¶
在转换阶段,我们遍历降级后的图形并构建等效的 TensorRT 图形。转换阶段由三个主要组件组成:用于管理编译时数据的上下文、用于执行可以在编译时解析的操作的评估器库以及用于将 JIT 操作映射到 TensorRT 的转换器库。
编译和运行时¶
最后的编译阶段构造一个 TorchScript 程序来运行转换后的 TensorRT 引擎。它接受一个序列化引擎并在引擎管理器中实例化它,然后编译器将构建一个引用该引擎并将其包装在模块中的 JIT 图形,以返回给用户。当用户执行模块时,JIT 程序将在 JIT 运行时中运行,该运行时由 Torch-TensorRT 扩展,并使用用户提供的数据。