【问题标题】:Update ML.NET trained Model in ASP.NET Core without restarting the app在 ASP.NET Core 中更新 ML.NET 训练的模型,而无需重新启动应用程序
【发布时间】:2020-08-18 17:28:24
【问题描述】:

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

    services.AddPredictionEnginePool<ImageData, ImagePrediction>().FromFile(
        "ImageClassificationModel", _modelPath, true);

通过从磁盘加载现有模型。 _modelPath 变量表示 zip 文件的路径,true 参数表示预测引擎池应该监视模型的变化。根据https://docs.microsoft.com/en-us/dotnet/machine-learning/how-to-guides/serve-model-web-api-ml-net

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

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

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

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

到目前为止,更新模型的唯一方法是完全重新启动 Web 应用程序并首先调用 train 端点。 预期结果将能够在不重新启动网络应用的情况下重新训练模型。

【问题讨论】:

  • 可能在您的PredictionEnginePool 上调用Dispose(),可能会释放模型以便您保存更新的模型。

标签: asp.net-core ml.net


【解决方案1】:

不幸的是,PredictionEnginePool&lt;TData,TPrediction&gt; 只是池化PredictionEngine&lt;TSrc,TDst&gt; 对象的特定实现。就像您可以在文档中阅读的那样,PredictionEnginePool 本身不是 Disposable(只有 PredictionEngine 是)。但我认为如果你使用PredictionEnginePool,你不能处理那些PredictionEngine 对象,否则我认为你会毁了你的游泳池。

据我在PredictionEngine 的代码中所见,模型重新加载应该可以正常工作并且是线程安全的,因为它们使用FileSystemWatcher 类并结合了一些底层锁定。

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

【讨论】:

    猜你喜欢
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2019-07-25
    • 2019-06-18
    • 1970-01-01
    • 2013-10-23
    相关资源
    最近更新 更多