仔细看会发现这一句
/home/yaochunchun/miniconda3/envs/mm/lib/python3.8/site-packages/torch/onnx/utils.py:267: UserWarning: `add_node_names' can be set to True only when 'operator_export_type' is `ONNX`. Since 'operator_export_type' is not set to 'ONNX', `add_node_names` argument will be ignored.warnings.warn("`{}' can be set to True only when 'operator_export_type' is "
实际上是因为
operator_export_type=OperatorExportTypes.ONNX_ATEN_FALLBACK 如果这个设置的话,onnx的节点不会有name属性详细解释:
operator_export_type=OperatorExportTypes.ONNX_ATEN_FALLBACK
是 PyTorch 导出 ONNX 模型时的一个选项,用于指定操作符导出的方式。为了更好地理解它的含义,我们需要分解一下这个选项的各个部分:
OperatorExportTypes
OperatorExportTypes
是一个枚举类型,定义了在导出过程中如何处理 PyTorch 操作符(operators)。PyTorch 中的操作符可以在 ONNX 模型中表示为标准 ONNX 操作符或其他形式。
ONNX_ATEN_FALLBACK
ONNX_ATEN_FALLBACK
是 OperatorExportTypes
的一个枚举值,表示如果 PyTorch 中的某些操作符在 ONNX 中没有对应的标准操作符,就使用 PyTorch 自己的操作符(即 ATen 操作符)作为回退。
具体解释
当你使用 operator_export_type=OperatorExportTypes.ONNX_ATEN_FALLBACK
时,PyTorch 在导出 ONNX 模型时会按照以下逻辑处理操作符:
- 标准 ONNX 操作符:对于在 ONNX 中有对应标准操作符的 PyTorch 操作符,直接导出为 ONNX 的标准操作符。
- ATen 操作符回退:对于在 ONNX 中没有对应标准操作符的 PyTorch 操作符,使用 PyTorch 自己的 ATen 操作符。
这对于某些复杂或自定义操作符非常有用,因为它可以确保导出的模型保留所有的功能,即使某些操作符没有标准的 ONNX 实现。
使用场景
ONNX_ATEN_FALLBACK
选项通常在以下情况下使用:
- 自定义操作符:你的模型中使用了某些自定义的 PyTorch 操作符,这些操作符没有标准的 ONNX 实现。
- 复杂操作:你的模型中包含一些复杂的操作,这些操作在标准 ONNX 中没有直接对应的实现。
示例代码
下面是一个使用 operator_export_type=OperatorExportTypes.ONNX_ATEN_FALLBACK
的示例代码:
python
复制代码
import torch
import torch.onnx
from torch.onnx import OperatorExportTypes# 定义一个简单的模型
class SimpleModel(torch.nn.Module):def __init__(self):super(SimpleModel, self).__init__()self.fc = torch.nn.Linear(10, 5)def forward(self, x):return self.fc(x)# 创建模型实例并定义dummy输入
model = SimpleModel()
dummy_input = torch.randn(1, 10)# 导出模型到 ONNX 格式,使用 ONNX_ATEN_FALLBACK 选项
torch.onnx.export(model, dummy_input, "simple_model.onnx", operator_export_type=OperatorExportTypes.ONNX_ATEN_FALLBACK, input_names=['input'], output_names=['output'])
在这个示例中,如果 SimpleModel
使用的某些操作符在 ONNX 中没有对应的标准实现,它们将会作为 ATen 操作符导出到 ONNX 模型中。
总结
operator_export_type=OperatorExportTypes.ONNX_ATEN_FALLBACK
允许 PyTorch 在导出 ONNX 模型时使用 ATen 操作符作为回退,以确保所有操作符都能被正确导出。这对于模型中包含非标准或自定义操作符的情况尤其有用。但是可能回导致节点没有name属性;