部署¶
用Python编写的模型需要经过导出过程才能成为可部署的产物。 关于此过程的几个基本概念:
"导出方法" 是指将Python模型完全序列化为可部署格式的方式。 我们支持以下导出方法:
"格式"是指序列化模型在文件中的描述方式,例如 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。
覆盖率¶
在元架构GeneralizedRCNN和RetinaNet下的大多数官方模型都支持追踪和脚本模式。当前级联R-CNN和PointRend仅支持追踪模式。如果用户自定义扩展也支持脚本化或可追踪,则同样适用。
对于通过追踪导出的模型,允许动态输入分辨率,但批处理大小(输入图像数量)必须固定。脚本化可以支持动态批处理大小。
使用方法¶
用于跟踪和脚本化的主要导出API是TracingAdapter和scripting_with_instances。它们的使用方法目前展示在test_export_torchscript.py中(参见TestScripting和TestTracing)以及deployment example部署示例中。请确保这些示例能够运行,然后根据您的用例进行修改。目前的使用需要用户针对每个模型付出一些努力并具备必要的知识,以解决脚本化和跟踪的限制。未来我们计划将这些功能封装在更简单的API下,降低使用门槛。
使用Caffe2追踪进行部署¶
我们提供Caffe2Tracer来执行导出逻辑。它会将模型的部分替换为Caffe2运算符,然后将模型导出为Caffe2、TorchScript或ONNX格式。
转换后的模型能够在无需依赖detectron2/torchvision的情况下,在CPU或GPU上运行Python或C++代码。该运行时针对CPU和移动端推理进行了优化,但未针对GPU推理进行优化。
此功能需要 ONNX ≥ 1.6。
覆盖率¶
以下3种常见元架构中的大多数官方模型:GeneralizedRCNN、RetinaNet、PanopticFPN均受支持。暂不支持级联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格式的脚本。 其工作原理是通过转换配置文件和权重,因此仅支持少量模型。