部署

用Python编写的模型需要经过导出过程才能成为可部署的产物。 关于此过程的几个基本概念:

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

  • tracing: 参见pytorch文档了解相关内容

  • scripting: 参见pytorch文档了解更多信息

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

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

导出方法

追踪

脚本化

caffe2追踪

格式

TorchScript

TorchScript

Caffe2, TorchScript, ONNX

运行时

PyTorch

PyTorch

Caffe2, PyTorch

C++/Python 推理

动态分辨率

批量大小要求

固定

动态

不支持批量推理

额外运行时依赖

torchvision

torchvision

Caffe2运算(通常已包含在PyTorch中)

Faster/Mask/Keypoint R-CNN

RetinaNet

PointRend R-CNN

级联R-CNN

caffe2_tracing 即将被弃用。 我们暂不计划增加对其他格式/运行时的支持,但欢迎贡献代码。

通过追踪或脚本进行部署

模型可以通过追踪或脚本化导出为TorchScript格式。输出的模型文件可以在Python或C++环境中加载,无需依赖detectron2。导出的模型通常需要torchvision(或其C++库)来支持某些自定义操作。

此功能需要 PyTorch ≥ 1.8。

覆盖率

在元架构GeneralizedRCNNRetinaNet下的大多数官方模型都支持追踪和脚本模式。当前级联R-CNN和PointRend仅支持追踪模式。如果用户自定义扩展也支持脚本化或可追踪,则同样适用。

对于通过追踪导出的模型,允许动态输入分辨率,但批处理大小(输入图像数量)必须固定。脚本化可以支持动态批处理大小。

使用方法

用于跟踪和脚本化的主要导出API是TracingAdapterscripting_with_instances。它们的使用方法目前展示在test_export_torchscript.py中(参见TestScriptingTestTracing)以及deployment example部署示例中。请确保这些示例能够运行,然后根据您的用例进行修改。目前的使用需要用户针对每个模型付出一些努力并具备必要的知识,以解决脚本化和跟踪的限制。未来我们计划将这些功能封装在更简单的API下,降低使用门槛。

使用Caffe2追踪进行部署

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

转换后的模型能够在无需依赖detectron2/torchvision的情况下,在CPU或GPU上运行Python或C++代码。该运行时针对CPU和移动端推理进行了优化,但未针对GPU推理进行优化。

此功能需要 ONNX ≥ 1.6。

覆盖率

以下3种常见元架构中的大多数官方模型:GeneralizedRCNNRetinaNetPanopticFPN均受支持。暂不支持级联R-CNN,也不支持批量推理。

在这些架构下,用户的自定义扩展(通过注册添加)只要不包含控制流或Caffe2不支持的运算符(例如可变形卷积),就能得到支持。例如,自定义主干网络和头部通常可以直接使用。

使用方法

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

在C++/Python中使用模型

该模型可以在C++中加载并通过Caffe2或Pytorch运行时部署。C++ examples中提供了Mask R-CNN的参考实现。需要注意的是:

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

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

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

转换为TensorFlow

tensorpack Faster R-CNN 提供了将几种标准detectron2 R-CNN模型转换为TensorFlow pb格式的脚本。 其工作原理是通过转换配置文件和权重,因此仅支持少量模型。