问题描述
我希望在新版本可用后自动重新加载经过训练的机器学习模型,因此我将watchForChanges
设置为true
:
services.AddPredictionEnginePool<SentimentData,SentimentPrediction>()
.FromFile(
modelName: Constants.ModelName,filePath: Constants.ModelFileName,watchForChanges: true);
似乎只有在重新训练模型之前不进行预测时,它才有效。
这是我在事件中看到的例外情况:
我应该做些其他事情以获得期望的结果吗?
您可以看到示例项目证明了此问题:https://github.com/alexandermujirishvili/DotnetMLWatchForChanges/tree/master
解决方法
不可能
但是您可以创建外观this的工厂类 并具有对象池设计模式
public class PredictionEngineObjPool<T>
{
private readonly ConcurrentBag<T> _objects;
private readonly Func<T> _objectGenerator;
public PredictionEngineObjPool(Func<T> objectGenerator)
{
_objectGenerator = objectGenerator ?? throw new ArgumentNullException(nameof(objectGenerator));
_objects = new ConcurrentBag<T>();
}
public T Get()
{
var result = _objects.TryTake(out T item) ? item : _objectGenerator();
return result;
}
public void Return(T item)
{
_objects.Add(item);
}
}
然后创建一个经理
public class PredictionManager
{
public Tdest Predict<Tsrc,Tdest>(string modelName,Tsrc example) where Tsrc : class where Tdest : class,new()
{
var mlContext = new MLContext();
//create your engine
}
}
在程序中使用
var pool = new PredictionEngineObjPool<PredictionManager>(() => new PredictionManager());
var _predictionManager = pool.Get();
var prediction= _predictionManager.Predict<ModelInput,ModelOutput>("name",input);