首页 > 解决方案 > 如何将 ML.Net PredictionEnginePool 与 ONNX 模型一起使用?

问题描述

我正在尝试使用 ML.Net 来使用 ONNX 模型在 API 后面进行预测。这里有关于如何将 ML.Net 和 ONNX 模型与控制台应用程序一起使用的文档,但是,正如本文所述,它不能很好地扩展。从这篇文章开始,他们添加了解决扩展问题的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)

遗留格式异常很有趣,因为我尝试了两种不同的模型,一种来自带有 AutoML 的 Azure 机器学习服务,另一种来自本地训练的 Scikit,因此不确定哪个部分是“遗留”。

不过,缺少的Model.key可能是提示,因为 MS API 文档中使用的 zip 模型文件没有单个 .onnx 文件,但它有包含二进制文件的文件夹,其中一些文件实际上命名为Model。关键

我的问题是:有没有人使用过带有 ONNX 模型的 PredictionEnginePool?可能吗?还是尚未实施?(不确定是否重要,但都是分类模型,一个 SVM 和一个 LightGBM)


*更新

找到了一种方法来做到这一点。所以看起来引擎池只支持 ML.Net 格式的模型,但是您可以按照控制台应用程序示例中的描述打开模型并将其保存为 ML.Net 格式,然后您可以将其与引擎池一起使用。这里有一个类似的例子。该类OnnxModelConfigurator打开 ONNX 模型并将其保存为 ML.Net 格式,然后在您的 ctr 中Startup.cs调用配置器以正确的格式保存模型,在ConfigureServices()函数中您可以实际使用 ONNX 模型创建池。

这可行,但是通过遵循这种方法,格式之间的转换将成为 API 源代码的一部分,因此当您想要使用新模型时,您至少需要重新启动应用程序。这可能没什么大不了的,如果有一点停机时间是可以的,即使没有,你也可以通过部署槽来避免它。我猜您也可以将转换作为单独的服务,然后将模型文件转储到 API,以便池可以检测到新模型并使用它。

无论如何,谢谢你们的答案!

标签: ml.netonnx

解决方案


你也可以看看这个指南

在这种情况下,使用 Azure 自定义视觉训练的模型在 ASP.NET 应用程序中使用,使用PredictionEnginePool.


推荐阅读