设置 AutoML 以通过 Python 训练自然语言处理模型(预览版)
重要
此功能目前处于公开预览状态。 此预览版在提供时没有附带服务级别协议,我们不建议将其用于生产工作负荷。 某些功能可能不受支持或者受限。
有关详细信息,请参阅适用于 Azure 预览版的补充使用条款。
本文介绍如何使用 Azure 机器学习 Python SDK 中的自动化 ML 训练自然语言处理 (NLP) 模型。
自动化 ML 支持 NLP,使 ML 专业人员和数据科学家能够自带文本数据,并为多类文本分类、多标签文本分类和命名实体识别 (NER) 等任务构建自定义模型。
可以与 Azure 机器学习数据标签功能无缝集成,以标记文本数据或引入现有标记数据。 自动化 ML 提供了在多 GPU 计算群集上使用分布式训练的选项,可以加快模型训练速度。 通过利用 Azure 机器学习的 MLOps 功能,可以让生成的模型大规模运作。
先决条件
Azure 订阅。 如果你没有 Azure 订阅,注册之后即可试用 Azure 机器学习免费版或付费版。
具有 GPU 训练计算的 Azure 机器学习工作区。 若要创建工作区,请参阅创建工作区资源。 有关 Azure 提供的 GPU 实例的更多详细信息,请参阅 GPU 优化虚拟机大小。
警告
对于几个 NLP 用例(例如非英语数据集和更大范围的文档),需要支持多语言模型和使用最大序列长度较长的模型。 因此,这些方案可能需要更高的 GPU 内存才能成功进行模型训练,例如 NC_v3 系列或 ND 系列。
已安装 Azure 机器学习 Python SDK。
若要安装该 SDK,你可以:
创建一个计算实例,该实例会自动安装 SDK 并已针对 ML 工作流进行预配置。 有关详细信息,请参阅创建和管理 Azure 机器学习计算实例。
自行安装
automl
包,其中包括 SDK 默认安装。
重要
本文中的 Python 命令需要最新的
azureml-train-automl
包版本。- 将最新的
azureml-train-automl
包安装到本地环境。 - 有关最新
azureml-train-automl
包的详细信息,请参阅azureml-train-automl
。
选择 NLP 任务
确定要完成的 NLP 任务。 目前,自动化 ML 支持以下深度神经网络 NLP 任务。
任务 | AutoMLConfig 语法 | 说明 |
---|---|---|
多类文本分类 | task = 'text-classification' |
有多个可能的类,并且每个样本正好归入一个类。 任务是预测每个样本的正确类。 例如,将电影脚本分类为“喜剧”或“浪漫”。 |
多标签文本分类 | task = 'text-classification-multilabel' |
有多个可能的类,并且每个样本可以分配有任意数量的类。 任务是预测每个样本的所有类 例如,将电影脚本分类为“喜剧”、“浪漫”或“喜剧和浪漫”。 |
命名实体识别 (NER) | task = 'text-ner' |
序列中的标记有多个可能的标签。 任务是预测每个序列的所有标记的标签。 例如,从非结构化文本(如合同或财务文件)中提取特定于域的实体 |
准备数据
对于自动化 ML 中的 NLP 试验,你可以为多类和多标签分类任务引入 .csv
格式的 Azure 机器学习数据集。 对于 NER 任务,支持使用空格作为分隔符并遵循 CoNLL 格式的双列 .txt
文件。 以下各节提供了每个任务接受的数据格式的更多详细信息。
多类
对于多类分类,数据集可以包含几个文本列和正好一个标签列。 以下示例只有一个文本列。
text,labels
"I love watching Chicago Bulls games.","NBA"
"Tom Brady is a great player.","NFL"
"There is a game between Yankees and Orioles tonight","MLB"
"Stephen Curry made the most number of 3-Pointers","NBA"
多标签
对于多标签分类,数据集列与多类相同,但标签列中的数据有特殊的格式要求。 下表中提供了两种接受的格式和示例。
标签列格式选项 | 多个标签 | 一个标签 | 无标签 |
---|---|---|---|
纯文本 | "label1, label2, label3" |
"label1" |
"" |
带引号的 Python 列表 | "['label1','label2','label3']" |
"['label1']" |
"[]" |
重要
不同的分析程序用于读取这些格式的标签。 如果你使用的是纯文本格式,请在标签中仅使用字母、数字和 '_'
。 所有其他字符都被识别为标签的分隔符。
例如,如果标签为 "cs.AI"
,它会被读取为 "cs"
和 "AI"
。 而使用 Python 列表格式时,标签将为 "['cs.AI']"
,读取为 "cs.AI"
。
采用纯文本格式的多标签的示例数据。
text,labels
"I love watching Chicago Bulls games.","basketball"
"The four most popular leagues are NFL, MLB, NBA and NHL","football,baseball,basketball,hockey"
"I like drinking beer.",""
Python 列表中采用引号格式的多标签的示例数据。
text,labels
"I love watching Chicago Bulls games.","['basketball']"
"The four most popular leagues are NFL, MLB, NBA and NHL","['football','baseball','basketball','hockey']"
"I like drinking beer.","[]"
命名实体识别 (NER)
与采用 .csv
格式数据集的多类或多标签不同,命名实体识别需要采用 CoNLL 格式。 文件必须正好包含两列,在每一行中,标记和标签用一个空格分开。
例如,
Hudson B-loc
Square I-loc
is O
a O
famous O
place O
in O
New B-loc
York I-loc
City I-loc
Stephen B-per
Curry I-per
got O
three O
championship O
rings O
数据验证
在训练之前,自动化 ML 对输入数据应用数据验证检查,确保数据可以正确地进行预处理。 如果上述任何检查都失败,运行将失败,并出现相关的错误消息。 下面是通过每个任务的数据验证检查的要求。
注意
一些数据验证检查同时适用于训练集和验证集,而另一些仅适用于训练集。 如果测试数据集无法通过数据验证,这意味着自动化 ML 无法捕获它,并且存在模型推理失败或模型性能下降的可能性。
任务 | 数据验证检查 |
---|---|
所有任务 | - 必须同时提供训练集和验证集 - 至少需要 50 个训练样本 |
多类和多标签 | 训练数据和验证数据必须具有 - 同一组列 - 列从左到右的顺序相同 - 同名列的数据类型相同 - 至少有两个唯一标签 - 每个数据集中的唯一列名称(例如,训练集不能有多个名为“Age”的列) |
仅多类 | 无 |
仅多标签 | - 标签列格式必须是接受的格式 - 至少有一个示例应具有 0 个或 2 个以上的标签,否则它应该是 multiclass 任务- 所有标签都应为 str 或 int 格式,无重叠。 不应同时具有标签 1 和标签 '1' |
仅 NER | - 文件不得以空行开头 - 每行必须是空行,或者遵循 {token} {label} 格式,其中令牌和标签之间有一个空格,标签后无空格- 所有标签都必须以 I- 、B- 或精确的 O 开头。 区分大小写 - 两个示例之间有一个空行 - 在文件末尾正好有一个空行 |
配置试验
自动化 ML 的 NLP 功能是通过 AutoMLConfig
触发的,这与提交自动化 ML 试验的分类、回归和预测任务的工作流相同。 你将设置大部分参数,就像在这些试验中一样,如 task
、compute_target
和数据输入。
但存在关键的区别:
- 可以忽略
primary_metric
,因为它仅用于报告目的。 目前,自动化 ML 仅为 NLP 的每次运行训练一个模型,并且没有模型选择。 - 只有多类和多标签文本分类任务才需要
label_column_name
参数。 - 如果数据集中的大多数示例包含的单词超过 128 个,则会将其视为长范围。 对于这种情况,可以在
AutoMLConfig
中通过enable_long_range_text=True
参数启用长范围文本选项。 这样做有助于改进模型性能,但需要更长的训练时间。- 如果启用长范围文本,则需要使用内存更高的 GPU,例如 NCv3 系列。
enable_long_range_text
参数仅可用于多类分类任务。
automl_settings = {
"verbosity": logging.INFO,
"enable_long_range_text": True, # # You only need to set this parameter if you want to enable the long-range text setting
}
automl_config = AutoMLConfig(
task="text-classification",
debug_log="automl_errors.log",
compute_target=compute_target,
training_data=train_dataset,
validation_data=val_dataset,
label_column_name=target_column_name,
**automl_settings
)
语言设置
作为 NLP 功能的一部分,自动化 ML 支持 104 种语言,利用特定于语言和预先训练的多语言文本 DNN 模型,如 BERT 系列模型。 目前,语言选择默认为英语。
下表汇总了基于任务类型和语言应用的模型。 请参阅支持的语言及其代码的完整列表。
任务类型 | dataset_language 的语法 |
文本模型算法 |
---|---|---|
多标签文本分类 | 'eng' 'deu' 'mul' |
英语 BERT 无大写 德语 BERT 多语言 BERT 对于所有其他语言,自动化 ML 应用多语言 BERT |
多类文本分类 | 'eng' 'deu' 'mul' |
英语 BERT 大小写 多语言 BERT 对于所有其他语言,自动化 ML 应用多语言 BERT |
命名实体识别 (NER) | 'eng' 'deu' 'mul' |
英语 BERT 大小写 德语 BERT 多语言 BERT 对于所有其他语言,自动化 ML 应用多语言 BERT |
可以在 FeaturizationConfig
中指定数据集语言。 BERT 还用于自动化 ML 试验训练的特征化过程,详细了解自动化 ML 中的 BERT 集成和特征化。
from azureml.automl.core.featurization import FeaturizationConfig
featurization_config = FeaturizationConfig(dataset_language='{your language code}')
automl_config = AutomlConfig("featurization": featurization_config)
分布式训练
你还可以在 Azure 机器学习计算群集上使用分布式训练来运行 NLP 试验。 在试验设置期间,在 AutoMLConfig
中提供了参数 max_concurrent_iterations = number_of_vms
和 enable_distributed_dnn_training = True
后,自动化 ML 会自动处理。
max_concurrent_iterations = number_of_vms
enable_distributed_dnn_training = True
这样做可以计划 NLP 模型的分布式训练,并自动扩展到虚拟机或虚拟机群集上的每个 GPU。 允许的最大虚拟机数量为 32。 训练计划的虚拟机数量是 2 的幂。
示例笔记本
有关每个 NLP 任务的详细代码示例,请参阅示例笔记本。
后续步骤
- 详细了解如何以及在何处部署模型。
- 对自动化 ML 试验进行故障排除。