在ASP.NET Core中更新经过ML.NET培训的模型,而无需重新启动应用程序

时间:2020-05-04 10:04:35

标签: asp.net-core ml.net

就像标题所说的那样,我正在尝试在ASP.NET Core Web应用程序中重新训练现有的ML.NET模型。 设置: 我在本地磁盘上已有一个model.zip文件。 在Startup.cs中,我将注入预测引擎池服务

    services.AddPredictionEnginePool<ImageData, ImagePrediction>().FromFile(
        "ImageClassificationModel", _modelPath, true);
通过从磁盘加载现有模型来

_modelPath 变量指示zip文件的路径,而 true 参数指示Prediction Engine Pool应该监视模型的更改。根据{{​​3}},

PredictionEnginePool服务提供了一种重新加载 更新了模型,而无需关闭您的应用程序。

我还创建了一项服务,该服务使用一些图像文件夹的路径并训练新模型,然后将其保存到 _modelPath 指示的相同位置。该服务通过API端点公开。

问题: 访问 train 端点时,该应用程序可以正常运行。它会重新训练模型并将其保存到指定的路径。我可以做几次。但是,如果我使用模型来预测图像的标签,则无法再训练模型。如果我再次尝试调用 train 端点,则会收到一条错误消息,指出模型文件已在使用中。

System.IO.IOException:'进程无法访问文件 '\ MLModel \ model.zip' 因为它正在被另一个进程使用。'

到目前为止,更新模型的唯一方法是完全重新启动Web应用程序并首先调用火车终点。 预期结果,无需重新启动网络应用即可重新训练模型。

1 个答案:

答案 0 :(得分:1)

不幸的是,PredictionEnginePool<TData,TPrediction> 只是池化 PredictionEngine<TSrc,TDst> 对象的特定实现。就像您可以在文档中阅读一样 PredictionEnginePool 本身不是 Disposable(只有 PredictionEngine 是)。但我认为,如果您使用 PredictionEnginePool,则不得处理那些 PredictionEngine 对象,否则我认为您会毁掉您的池。

因此,就我在 PredictionEngine 的代码中看到的而言,模型重新加载应该可以正常工作并且是线程安全的,因为它们使用了 FileSystemWatcher 类并结合了一些引擎盖下的锁定。< /p>

您是否尝试过手动更新模型 zip 文件?因为我怀疑在这种情况下 train 端点没有正确释放新创建的模型文件上的文件句柄。也许您也可以粘贴此端点的一些片段,好吗?我还看到在使用 PredictionEngine 和文件监视活动时会进行各种日志记录,因此将您的常规 loglevel 设置为 InformationDebug 也可能有助于查看发生了什么