【发布时间】:2021-05-12 07:23:22
【问题描述】:
我正在尝试使用 ML.Net 来使用 ONNX 模型在 API 后面进行预测。有关于如何将 ML.Net 和 ONNX 模型与控制台应用程序 here 一起使用的文档,但正如 this 文章中所述,它不能很好地扩展。从这篇文章开始,他们添加了 PredictionEnginePool 来解决缩放问题,但我无法使其适用于 ONNX 模型。当我尝试加载模型时,它会抛出两个异常:
InvalidOperationException: Repository doesn't contain entry DataLoaderModel\Model.key
Microsoft.ML.RepositoryReader.OpenEntry(string dir, string name)
InvalidOperationException: Could not load legacy format model
Microsoft.ML.ModelOperationsCatalog.Load(Stream stream, out DataViewSchema inputSchema)
遗留格式异常很有趣,因为我尝试了两种不同的模型,一种来自 Azure 机器学习服务和 AutoML,另一种是在本地训练的 Scikit,因此不确定哪一部分是“遗留”。
缺少的 Model.key 可能是提示,因为在 MS API 文档中使用的 zip 模型文件没有单个 .onnx 文件,但它有包含二进制文件的文件夹并且其中一些文件实际上命名为 Model.key。
我的问题是: 有没有人使用过带有 ONNX 模型的 PredictionEnginePool?可能吗?还是尚未实施? (不确定是否重要,但都是分类模型,一个 SVM 和一个 LightGBM)
*更新
找到了一种方法来做到这一点。所以看起来引擎池只支持 ML.Net 格式的模型,但是您可以按照控制台应用程序示例中的描述打开模型并将其保存为 ML.Net 格式,然后您可以将其与引擎池一起使用。
这个here 有一个类似的例子。
OnnxModelConfigurator 类打开 ONNX 模型并将其保存为 ML.Net 格式,然后在 Startup.cs 的 ctr 中调用配置器以正确格式保存模型,并在 ConfigureServices() 函数中实际创建使用 ONNX 模型的池。
这可行,但是通过遵循这种方法,格式之间的转换将成为 API 源代码的一部分,因此当您想要使用新模型时,您至少需要重新启动应用程序。这可能没什么大不了的,如果有一点停机时间是可以的,即使没有,你也可以通过部署槽来避免它。我猜您也可以将转换作为单独的服务,然后将模型文件转储到 API,以便池可以检测到新模型并使用它。
不管怎样,谢谢大家的回答!
【问题讨论】: