【发布时间】:2021-03-09 10:20:58
【问题描述】:
我正在使用 PyTorch 训练神经网络并将它们输出到 ONNX。我在Vespa 索引中使用这些模型,该索引通过 TensorRT 加载 ONNX。我需要对某些功能进行一次热编码,但这在 Vespa 框架内很难实现。
是否可以在我的 ONNX 网络中嵌入一些给定功能的单热编码(例如,在网络表示之前)? 如果是这样,我应该如何基于 PyTorch 模型实现这一点?
我已经注意到两件事:
- ONNX 格式包括 OneHot 运算符:see ONNX doc
- PyTorch 内置 ONNX 导出系统不支持 OneHot 算子:see torch.onnx doc
编辑 2021/03/11: 这是我的工作流程:
- 通过 PyTorch 训练学习排序模型
- 将它们导出为 ONNX
- 将这些 ONNX 导入我的 Vespa 索引,以便对任何查询的结果进行排名,这要归功于 ONNX 模型。在后台,Vespa 使用 TensorRT 进行推理(所以我使用 Vespa 的 ONNX 模型评估)
【问题讨论】:
-
我可以使用一些澄清来更好地帮助你。我不确定你在这里通过 TensorRT 加载 ONNX 是什么意思。您是否使用外部模型服务器 (TensorRT) 并从 Vespa 查询的结果中发送特征?或者您正在使用 Vespa 的 ONNX 模型评估?无论如何,ONNX 中的 OneHot 运算符只是将张量作为输入。可以通过直接操作 ONNX 图来自己注入,例如使用蟒蛇框架。也许您可以解释用例?分类特征还有其他方法,例如 PyTorch ONNX 导出支持的嵌入...
-
谢谢@LesterSolbakken - 我添加了一些关于我的工作流程的细节。我的用例如下: Vespa 计算一些分类特征,浅层神经网络没有很好地利用这些特征,因此我想在这些特征的单热编码版本上训练我的模型(易于在 Python 中编码)到我的训练。瓶颈在于 Vespa 的推理定义(称为
searchDefinition)对于重现通用的单热编码并不是很方便。通过 Python 操作 ONNX 的示例对我很有帮助,你有吗?
标签: pytorch one-hot-encoding onnx vespa