我希望在新版本可用后自动重新加载经过训练的机器学习模型,因此我将watchForChanges
设置为true
:
services.AddPredictionEnginePool<SentimentData, SentimentPrediction>()
.FromFile(
modelName: Constants.ModelName,
filePath: Constants.ModelFileName,
watchForChanges: true);
似乎只有在重新训练模型之前不进行预测时,它才有效。
这是我在事件中看到的例外情况:
我应该做些其他事情以获得期望的结果吗?
您可以看到示例项目证明了此问题:https://github.com/alexandermujirishvili/DotnetMLWatchForChanges/tree/master
答案 0 :(得分:0)
不可能
但是您可以创建外观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);