作者:Jeff Handley
排版:Alan Wang
ML.NET 是面向 .NET 开发人员的开源、跨平台的机器学习框架,可将自定义机器学习模型集成到 .NET 应用程序中。ML.NET 3.0 版本现已发布,其中包含大量新功能和增强功能!
此版本中的深度学习场景得到了大幅扩展,新增了对象检测、命名实体识别和问答等新功能。所有这一切都归功于与 TorchSharp 和 ONNX 模型的集成和互操作性。我们还将与 LightGBM 的集成更新到最新版本。
通过对 DataFrame 的大量增强和错误修复以及新的 IDataView 互操作性功能,数据处理场景得到了极大的改善。加载、检查、转换和可视化数据的重要步骤更加强大。
本文重点介绍了 ML.NET 3.0 版本的几个方面,有关完整的更新列表可在发行说明中找到。
过去一年,我们都见证了深度学习场景和能力的加速增长。借助 ML.NET 3.0,您可以在 .NET 应用程序中利用其中的许多改进。
对象检测是一个计算机视觉问题。虽然与图像分类密切相关,但对象检测以更细粒度的尺度执行图像分类。对象检测对图像中的实体进行定位和分类。当图像包含多个不同类型的对象时,最好使用对象检测功能。
我们在今年早些时候发布了 ML.NET Model Builder 中的对象检测功能。这些功能建立在ML.NET 3.0 ( PR #6605 )中引入的 TorchSharp 驱动的对象检测 API 的基础之上。
在底层,对象检测 API 利用了 Microsoft Research 的一些最新技术,并由使用 TorchSharp 构建的基于 Transformer 的神经网络架构提供支持。有关底层模型的更多详细信息,请参阅搜索 Vision Transformer 空间论文。
对象检测包含在 Microsoft.ML.TorchSharp 3.0.0 包中的 Microsoft.ML.TorchSharp 和 Microsoft.ML.TorchSharp.AutoFormerV2 命名空间中。您可以阅读文章- ML.NET Model Builder 中的对象检测以深入了解。
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,
};
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]
);
自然语言处理(Natural Language Processing)是软件中最常见的 ML 需求之一。NLP 最重要的两个进步领域是问答 (QA) 和命名实体识别 (NER)。在 ML.NET 3.0中,这两种场景通过在ML.NET 2.0中引入的现有 TorchSharp RoBERTa 文本分类功能的基础上进行构建,从而得以实现。
NER 和 QA 训练器都包含在 Microsoft.ML.TorchSharp 3.0.0 包和 Microsoft.ML.TorchSharp 命名空间中。
// QA 训练器
var chain = new EstimatorChain<ITransformer>();
var estimatorQA = chain.Append(mlContext.MulticlassClassification.Trainers.QuestionAnswer(
contextColumnName, questionColumnName, trainingAnswerColumnName,
answerIndexColumnName, predictedAnswerColumnName, scoreColumnName,
topK, batchSize, maxEpochs, architecture, validationSet
));
// NER 训练器
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 2.0 后不久,我们宣布了由 Intel oneDAL 支持的训练硬件加速,作为 ML.NET 3.0 首个预览版的一部分。Intel oneDAL(Intel oneAPI 数据分析库)是一个通过为数据分析和机器学习过程的所有阶段提供高度优化的算法构建块,帮助加快数据分析速度的库。Intel oneDAL 在 64 位架构中利用 SIMD 扩展,这是 Intel 和 AMD CPU 中的特色功能。
有关此功能集的更多信息,请参阅文章-使用 Intel oneDAL 加速 ML.NET 培训。
自动机器学习 (AutoML) 实现将机器学习应用于数据的过程自动化。AutoML 增强了Model Builder和 ML.NET CLI 中的体验。
借助 ML.NET 3.0,AutoML 体验获得了多项新功能。AutoML Sweeper 现在支持句子相似性、问答和对象检测。社区成员 Antti “Andy” Törrönen (@torronen) 实现了采样键列名称 (SamplingKeyColumnName),它可以与 SetDataset 一起使用,以便更轻松地设置采样键名称。AutoZero 调谐器现在可用于 BinaryClassification 实验。用于实验的最大模型数量可以通过 ExperimentSettings.MaxModel 指定。
感谢社区成员 Andras Fuchs (@andrasfuchs),通过 AutoML.IMonitor 实现持续资源监控。这允许监视内存需求、虚拟内存使用情况和剩余磁盘空间。使用这种监控,可以通过自定义 IMonitor 实现来控制长时间运行的实验,以避免崩溃和失败的试验。
此版本包括对 DataFrame 的一系列显著更新,其中许多更新是由社区成员 Aleksei Smirnov (@asmirnov82) 完成的。我们非常感谢 Aleksei 的贡献,相信您也会喜欢!
为了实现更多的 IDataView <-> DataFrame 转换,添加了对 String 和 VBuffer 列类型的支持。字符串值作为 ReadOnlyMemory处理,并且 VBufferDataFrameColumn列类型支持所有受支持基元。列现在可以存储超过 2 GB 的数据,之前的限制已被移除。Apache Arrow Date64 列数据现在也可以识别。
ML.NET 3.0 中扩展了 DataFrame 的数据加载场景。感谢社区成员 Andrei Faber (@andrei-faber),现在可以从 SQL 数据库导入和导出数据。这是使用 ADO.NET 完成的,它支持大量与 SQL 兼容的数据库。作为此实现的一部分,还可以从任何 IEnumerable 集合加载数据并将数据导出到 System.Data.DataTable。当列名匹配时,可以将一个 DataFrame 中的数据附加到另一个 DataFrame 中,从而放宽了之前对列排序的限制。通过 DataFrame.LoadCsv 加载的逗号分隔数据现在还可以处理重复的列名称,并可以选择重命名重复的列。
DataFrame 还有许多其他增强和修复功能。在列克隆和二进制比较场景中,算术性能得到了改进。在执行算术运算时,对空值的处理得到了改进,减少了转换和清理数据的步骤。甚至还对调试器进行了改进,为具有长名称的列生成更具可读性的输出。
Tensor Primitives 是 System.Numerics.Tensors.TensorPrimitives 的缩写,是一组新的 API,引入了对 tensor 运算的支持。作为 .NET 8 的一部分,我们的团队发布了一个新的 System.Numerics.Tensors 包,其中引入了 Tensor Primitives。Tensor Primitives API 是 .NET 中 AI 数值演进的下一步,它建立在硬件内在函数和通用数学的基础上。
虽然与 Tensor Primitives 的集成纯粹是一个细节实现,并不会影响 ML.NET 的公共接口,但它带来了一些显着的性能改进。以下基准测试结果说明了针对 .NET 8 时的收益。
更多详细信息和 .NET Framework 基准测试结果都包含在 dotnet/machinelearning#6875 中。
除了提升这些性能之外,我们还利用这次集成机会来测试 TensorPrimitives API 的 API 形状、可用性、功能和正确性。证明 API 可以满足 ML.NET 场景是将 System.Numerics.Tensors 包从预览版过渡到稳定版本 8.0.0 的重要一步。
随着 .NET 8 和 ML.NET 3.0 版本的完成,我们开始制定.NET 9 和 ML.NET 4.0 的计划。不过在那之前,您可以期待 Model Builder 和 ML.NET CLI 将会更新以使用 ML.NET 3.0 版本。
我们将继续扩展深度学习场景和集成、增强 DataFrame,以及扩展 System.Numerics.Tensors 中可用的 API,并将它们集成到 ML.NET 中。请继续关注更详细的 ML.NET 4.0 计划。
您可以在 Microsoft Learn 中了解有关 ML.NET、Model Builder 和 ML.NET CLI 的更多信息。
如果您遇到任何问题、功能请求或反馈,请在 ML.NET 存储库中提出问题。
您可以加入 ML.NET Community Discord 或 .NET Development Discord 上的 #machine-learning 频道。
您可以在每周三上午 10 点(太平洋时间)收看 Machine Learning .NET Community Standup。