部署

用 Python 编写的模型需要经过一个导出过程才能成为可部署的工件。关于此过程的一些基本概念

“导出方法” 是如何将 Python 模型完全序列化为可部署的格式。我们支持以下导出方法

  • tracing: 请参阅 pytorch 文档 了解它

  • scripting: 请参阅 pytorch 文档 了解它

  • caffe2_tracing: 将模型的某些部分替换为 caffe2 运算符,然后使用跟踪。

“格式” 是如何在一个文件中描述一个序列化模型,例如 TorchScript、Caffe2 protobuf、ONNX 格式。“运行时” 是一个加载序列化模型并执行它的引擎,例如 PyTorch、Caffe2、TensorFlow、onnxruntime、TensorRT 等。运行时通常与特定格式相关联(例如 PyTorch 需要 TorchScript 格式,Caffe2 需要 protobuf 格式)。我们目前支持以下组合,每个组合都有一些限制

导出方法

跟踪

脚本编写

caffe2_tracing

格式

TorchScript

TorchScript

Caffe2、TorchScript、ONNX

运行时

PyTorch

PyTorch

Caffe2、PyTorch

C++/Python 推理

动态分辨率

批次大小要求

常量

动态

不支持批次推理

额外运行时依赖项

torchvision

torchvision

Caffe2 运算符(通常已

包含在 PyTorch 中)

Faster/Mask/Keypoint R-CNN

RetinaNet

PointRend R-CNN

Cascade R-CNN

caffe2_tracing 将被弃用。我们不打算对其他格式/运行时进行额外支持,但欢迎贡献。

使用跟踪或脚本进行部署

模型可以通过 跟踪或脚本编写 导出为 TorchScript 格式。输出模型文件可以在 Python 或 C++ 中加载,而无需 detectron2 依赖项。导出的模型通常需要 torchvision(或其 C++ 库)依赖项才能进行一些自定义操作。

此功能需要 PyTorch ≥ 1.8。

覆盖范围

元架构 GeneralizedRCNNRetinaNet 下的大多数官方模型都支持跟踪和脚本编写模式。Cascade R-CNN 和 PointRend 目前支持跟踪。如果用户自定义扩展也是可脚本化或可跟踪的,则也支持它们。

对于使用跟踪导出的模型,允许动态输入分辨率,但批次大小(输入图像数量)必须固定。脚本编写可以支持动态批次大小。

用法

跟踪和脚本编写的主要导出 API 是 TracingAdapterscripting_with_instances。它们的使用目前在 test_export_torchscript.py 中进行了演示(请参阅 TestScriptingTestTracing),以及 部署示例。请检查这些示例是否可以运行,然后根据您的用例进行修改。现在,使用需要一些用户努力和每个模型的必要知识来解决脚本编写和跟踪的限制。将来,我们计划将这些内容包装在更简单的 API 下,以降低使用它们的难度。

使用 Caffe2 跟踪进行部署

我们提供 Caffe2Tracer 来执行导出逻辑。它将模型的某些部分替换为 Caffe2 运算符,然后将模型导出为 Caffe2、TorchScript 或 ONNX 格式。

转换后的模型可以在 Python 或 C++ 中运行,而无需 detectron2/torchvision 依赖项,在 CPU 或 GPU 上运行。它有一个针对 CPU 和移动推理优化的运行时,但没有针对 GPU 推理进行优化。

此功能需要 ONNX ≥ 1.6。

覆盖范围

这 3 种常见元架构下的大多数官方模型:GeneralizedRCNNRetinaNetPanopticFPN 都受支持。不支持 Cascade R-CNN。不支持批次推理。

这些架构下的用户自定义扩展(通过注册添加)只要不包含控制流或 Caffe2 中不可用的运算符(例如可变形卷积),就受支持。例如,自定义骨干和头部通常开箱即用。

用法

API 列在 API 文档 中。我们提供 export_model.py 作为使用这些 API 转换标准模型的示例。对于自定义模型/数据集,您可以将它们添加到此脚本中。

在 C++/Python 中使用模型

该模型可以在 C++ 中加载并使用 Caffe2 或 Pytorch 运行时进行部署。 C++ 示例 中给出了 Mask R-CNN 作为参考。请注意

  • 使用 caffe2_tracing 方法导出的模型采用 文档 中描述的特殊输入格式。在 C++ 示例中已经处理了这个问题。

  • 转换后的模型不包含将原始层输出转换为格式化预测的后处理操作。例如,C++ 示例只从最终层产生原始输出(28x28 掩码),而不进行后处理,因为在实际部署中,应用程序通常需要其自定义轻量级后处理,因此该步骤留给用户进行。

为了帮助在 python 中使用 Caffe2 格式的模型,我们在 Caffe2Model.__call__ 方法中提供了该转换模型的 python 包装器。该方法的接口与 模型的 pytorch 版本 相同,它在内部应用预/后处理代码以匹配格式。此包装器可以作为如何使用 Caffe2 的 python API 的参考,或者作为如何在实际部署中实现预/后处理的参考。

转换为 TensorFlow

tensorpack Faster R-CNN 提供脚本将一些标准 detectron2 R-CNN 模型转换为 TensorFlow 的 pb 格式。它通过翻译配置和权重来工作,因此只支持一些模型。