在ML.NET文档中,它声明PredictionEngine不是线程安全的(不同于MLContext或“模型” ITransformer对象),并且创建起来非常昂贵。因此,在多线程环境中,建议使用ObjectPooling(在Microsoft.ML.Extensions包中实现)来创建/使用PredictionEngine实例。虽然我可以使用PredictionEnginePool等完全正常,但我只是不明白原因。
如果我们可以预测多行-那么我们只能对一行进行相同的预测。而且由于ITransformer模型是线程安全的,因此我们可以使用以下方法代替PredictionEngine进行操作:
class MyPredictionService<TSrc, TResult>
where TSrc : class
where TResult : class, new()
{
MLContext _mlContext; // DI-ed singleton MLContext
ITransformer _model; // DI-ed singleton model instance
//Used to make one prediction
public TResult Predict(TSrc src)
{
var inputArray = new TSrc[] { src };
IDataView inputDataView = _mlContext.Data.LoadFromEnumerable<TSrc>(inputArray);
IDataView resultDataView = _model.Transform(inputDataView);
var resultArray = _mlContext.Data.CreateEnumerable<TResult>(resultDataView, true).ToArray();
return resultArray[0];
}
//Used to make batch predictions
public IEnumerable<TResult> Predict(IEnumerable<TSrc> src)
{
IDataView inputDataView = _mlContext.Data.LoadFromEnumerable<TSrc>(src);
IDataView resultDataView = _model.Transform(inputDataView);
return _mlContext.Data.CreateEnumerable<TResult>(resultDataView, true).ToArray();
}
}
当然,假定TSrc和TResult是与模型的输入/输出模式匹配的“有效”数据模型。
我想念什么吗?