由于大模型的爆火,ML.NET 似乎快被遗忘在角落了,这次3.0版本的发布意外中带着些欣喜。总结其新特性和改进主要包括以下几个方面:

深度学习场景的扩展

ML.NET 3.0增加了对象检测、命名实体识别和问答等深度学习场景的支持,这些场景都是基于 TorchSharp 和 ONNX 模型的集成和互操作性实现的。此外,还更新了与 LightGBM 的集成,使用了最新版本。

对象检测需要引用 Microsoft.ML.TorchSharp 3.0.0 包的 Microsoft.ML.TorchSharp 和 Microsoft.ML.TorchSharp.AutoFormerV2 命名空间。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
var chain = new EstimatorChain<ITransformer>();

var filteredPipeline = chain. Append(
        mlContext.Transforms.Text.TokenizeIntoWords(
            labelColumnName, separators: [',']),
        TransformerScope.Training
    )
    .Append(
        mlContext.Transforms.Conversion.MapValueToKey(labelColumnName),
        TransformerScope.Training
    )
    .Append(
        mlContext.Transforms.Text.TokenizeIntoWords(
            boundingBoxColumnName, separators: [',']),
        TransformerScope.Training
    )
    .Append(
        mlContext.Transforms.Conversion.ConvertType(boundingBoxColumnName),
        TransformerScope.Training
    )
    .Append(mlContext.Transforms.LoadImages("Image", imageFolder, "ImagePath"))
    .Append(
        mlContext.MulticlassClassification.Trainers.ObjectDetection(
            labelColumnName, predictedLabelColumnName, scoreColumnName,
            boundingBoxColumnName, predictedBoundingBoxColumnName,
            imageColumnName, maxEpoch
        )
    )
    .Append(mlContext.Transforms.Conversion.MapKeyToValue(
        predictedLabelColumnName));

var options = new ObjectDetectionTrainer.Options()
{
    LabelColumnName = labelColumnName,
    BoundingBoxColumnName = boundingBoxColumnName,
    ScoreThreshold = .5,
    MaxEpoch = maxEpoch,
    LogEveryNStep = 1,
};

// 另一种 pipeline 的写法
var pipeline = mlContext.Transforms.Text.TokenizeIntoWords(
    labelColumnName, separators: [','])
    .Append(mlContext.Transforms.Conversion.MapValueToKey(labelColumnName))
    .Append(mlContext.Transforms.Text.TokenizeIntoWords(
        boundingBoxColumnName, separators: [',']))
    .Append(mlContext.Transforms.Conversion.ConvertType(boundingBoxColumnName))
    .Append(mlContext.Transforms.LoadImages("Image", imageFolder, "ImagePath"))
    .Append(mlContext.MulticlassClassification.Trainers.ObjectDetection(options))
    .Append(mlContext.Transforms.Conversion.MapKeyToValue(predictedLabelColumnName));

var model = pipeline.Fit(data);
var idv = model.Transform(data);

var metrics = ML.MulticlassClassification.EvaluateObjectDetection(
    idv, idv.Schema[2], idv.Schema[boundingBoxColumnName], 
    idv.Schema[predictedLabelColumnName],
    idv.Schema[predictedBoundingBoxColumnName], idv.Schema[scoreColumnName]
);

命名实体识别和问答需要引用 Microsoft.ML.TorchSharp 3.0.0 包的 Microsoft.ML.TorchSharp 命名空间。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// 问答训练器定义
var chain = new EstimatorChain<ITransformer>();
var estimatorQA = chain.Append(
    mlContext.MulticlassClassification.Trainers.QuestionAnswer(
    contextColumnName, questionColumnName, trainingAnswerColumnName,
    answerIndexColumnName, predictedAnswerColumnName, scoreColumnName,
    topK, batchSize, maxEpochs, architecture, validationSet
));

// 命名实体识别训练器定义
var estimatorNER = chain.Append(
    mlContext.Transforms.Conversion.MapValueToKey("Label", keyData))
    .Append(mlContext.MulticlassClassification.Trainers.NameEntityRecognition(
        labelColumnName, outputColumnName, sentence1ColumnName,
        batchSize, maxEpochs, architecture, validationSet
    ))
    .Append(mlContext.Transforms.Conversion.MapKeyToValue(outputColumn));

数据处理场景的改善

ML.NET 3.0对DataFrame进行了大量的增强和修复,包括支持String和VBuffer列类型,支持从SQL数据库和任意IEnumerable集合导入和导出数据,支持拼接不同顺序的DataFrame,支持处理重复的列名等。还增加了IDataView的互操作性特性,方便数据的加载、检查、转换和可视化。

Tensor Primitives 的集成

Tensor Primitives 是一套新的API,用于支持张量运算。ML.NET 3.0利用这些API提升了性能,特别是在.NET 8上运行时。Tensor Primitives 也是.NET中AI数值计算的下一步发展,建立在硬件指令和通用数学的基础上。

AutoML的增强

ML.NET 3.0的AutoML增加了对 Sentence Similarity、Question Answering 和 Object Detection 的支持,还增加了AutoZero 调优器、最大模型数量的设置、连续资源监控等功能。

入门和资源

Microsoft Docs 中了解有关 ML.NET、Model Builder 和 ML.NET CLI 的更多信息。

代码示例可以在 ML.NET Samples GitHub repoML.NET Community Samples 上找到。