为什么我们需要对单个预测使用PredictionEngine而不是ITranformer.Transform方法?

时间:2020-03-10 11:17:24

标签: ml.net

在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是与模型的输入/输出模式匹配的“有效”数据模型。

我想念什么吗?

0 个答案:

没有答案