- 人工智能
- 大模型
- 预训练
- 微调
- LoRA
- RLHF
- 强化学习
- 分布式训练
【免费下载链接】PaddleNLP
Easy-to-use and powerful LLM and SLM library with awesome model zoo.
AutoNLP 是 PaddleNLP 的早期实验项目(代码位于 paddlenlp/experimental/autonlp),其核心定位是在有限计算资源下用低代码方式自动完成 NLP 建模,通过自动化的模型搜索(AutoML)帮你选出不错的文本分类模型。读完本文,你将掌握AutoTrainerForTextClassification的完整用法:如何构造训练器、启动多试验自动搜索、查看与恢复实验结果、导出静态图模型,并借助 Taskflow 一键部署推理。
注意:AutoNLP 目前处于实验阶段(Experimental),官方明确提示 "在正式发布之前,AutoNLP API 有可能会变动",生产环境接入前请评估 API 稳定性风险。
AutoNLP 的项目定位与设计理念
AutoNLP 是 PaddleNLP 官方推出的实验性质自动化机器学习(AutoML)能力,与"用大规模算力刷 SOTA"的传统 AutoML 路线刻意保持差异,其四项核心理念如下:
- 有限算力下的"不错模型"而非"最先进模型":项目假设用户至多拥有几张 GPU,希望在 8 小时内用自己的数据集训出不错的模型,而不是在巨型集群、海量数据上追求 State-of-the-Art 精度。
- 低代码而非无代码:目标是让开发者用几行 Python 代码就能训练出可用模型,但它不是拖拽式的无代码训练服务,仍保留编程接口的灵活性与可控性。
- 抽象化 PaddleNLP 的全流程能力:尽可能自动化并封装 PaddleNLP 已有的完整 NLP 流程——预处理、分词、微调(Finetuning)、提示学习(Prompt Tuning)、模型压缩、一键部署等,帮助开发者针对自己的业务场景快速适配落地。
- 免费且开源:AutoNLP 本身是 PaddleNLP 开源仓库的一部分,遵循 Apache-2.0 许可,源码可直接阅读与二次开发。
从仓库源码看,AutoNLP 的工程实现集中在 paddlenlp/experimental/autonlp 目录:auto_trainer_base.py定义了所有 AutoTrainer 的公共基类(抽象元类),text_classification.py实现了当前唯一支持的任务——文本分类对应的AutoTrainerForTextClassification,utils.py提供 UTC(Universal Text Classification)训练所用的UTCLoss,init.py 对外导出核心类。目前仅文本分类一个任务被支持,因此 README 的全部内容都围绕AutoTrainerForTextClassification展开。
安装 AutoNLP
安装 AutoNLP 与安装 PaddleNLP 几乎相同,唯一区别是需要在 extras 中追加[autonlp]标签:
pip install -U paddlenlp[autonlp]你也可以从 PaddleNLP 官方仓库 clone 源码后,在仓库根目录执行pip install .[autonlp]从源码安装(可获取 develop 分支的最新成果)。在 setup.py 中可以看到该 extras 的定义:
extras["autonlp"] = read_requirements_file("paddlenlp/experimental/autonlp/requirements.txt")extras 的依赖清单记录在 paddlenlp/experimental/autonlp/requirements.txt,主要包括:
ray[tune]==2.5.1:Ray Tune 是 AutoNLP 的试验调度与超参搜索后端;hyperopt>=0.2.5:提供 HyperOpt 贝叶斯超参搜索算法;protobuf==3.20.2、pydantic:依赖版本锁定。
也就是说,AutoNLP 的"自动搜索"能力建立在 Ray Tune 之上,这是理解其训练机制的关键线索(详见下文"训练流程"一节)。
创建 AutoTrainerForTextClassification 对象
AutoTrainerForTextClassification是你运行模型实验、与训练结果交互的主要类,构造方式如下:
auto_trainer = AutoTrainerForTextClassification( train_dataset=train_ds, eval_dataset=dev_ds, label_column="labels", text_column="sentence", language="Chinese", output_dir="temp" )构造函数参数说明
| 参数 | 类型/必填 | 说明 |
|---|---|---|
train_dataset | paddle.io.Dataset,必填 | 训练数据集,必须包含下方指定的text_column与label_column字段 |
eval_dataset | paddle.io.Dataset,必填 | 评估数据集,同样必须包含text_column与label_column字段 |
text_column | string,必填 | 数据集中的文本字段名,是模型的主要输入 |
label_column | string,必填 | 数据集中的标签字段名 |
language | string,必填 | 文本语言,当前支持"Chinese"与"English"(见源码中supported_languages属性) |
metric_for_best_model | string,可选 | 用于选择最优模型的评估指标名,默认为eval_accuracy(多标签场景默认为eval_macro_f1) |
greater_is_better | bool,可选 | 指标越大是否代表模型越好,需与metric_for_best_model配合使用,默认True |
problem_type | str,可选 | 按问题性质在["multi_class", "multi_label"]中选择,默认"multi_class" |
output_dir | str,可选 | 实验结果输出目录,源码默认值为autonlp_results(README 中拼写为autpnlp_results,属于文档笔误,以源码实现为准) |
verbosity | int,可选 | 控制日志详细程度,默认为1,此时 worker 日志会输出到 driver;需要减少日志量时可增大该值关闭 worker 日志回传 |
源码层细节:指标前缀与标签推断
结合 text_classification.py 的实现,构造阶段还有几个值得注意的行为:
- 指标自动加前缀:基类
AutoTrainerBase.__init__中,如果你传入的metric_for_best_model不以eval_开头,会自动改写为eval_<指标名>,与 Trainer 内部的评估指标命名对齐(见 auto_trainer_base.py)。 - 默认指标随问题类型切换:
multi_class默认用eval_accuracy,multi_label默认用eval_macro_f1。 - 标签自动收集:
_data_checks_and_inference会遍历数据集校验text_column/label_column字段存在,并自动生成id2label/label2id映射;你也可以通过构造函数的kwargs传入自定义的id2label(键为类别 id、值为类别名)。 - 多标签阈值:
kwargs中可传入multilabel_threshold(默认0.5),用于多标签场景下将 sigmoid 概率转换为预测标签的判定阈值。
启动自动训练(Train)
使用train()方法即可启动模型试验(Trial)搜索:
auto_trainer.train( num_cpus=2, num_gpus=1, max_concurrent_trials=1, num_models=10, time_budget_s=60 * 10, verbosity=1 )train() 参数说明
| 参数 | 类型/必填 | 说明 |
|---|---|---|
num_models | int,必填 | 运行的模型试验数量,即 Ray Tune 的采样样本数 |
num_gpus | str/int,可选 | 每次试验使用的 GPU 数量,默认根据检测到的 GPU 数量自动设置 |
num_cpus | str/int,可选 | 每次试验使用的 CPU 数量,默认根据检测到的 vCPU 数量自动设置 |
max_concurrent_trials | int,可选 | 同时运行的最大试验数,必须为非负数;为None或0时不加限制,默认None |
time_budget_s | int/float/datetime.timedelta,可选 | 以秒为单位的全局时间预算,超时后停止所有模型试验 |
experiment_name | str,可选 | 实验名称,实验日志存放在<output_dir>/<experiment_name>下,默认为 UNIX 时间戳 |
hp_overrides | dict[str, Any],可选 | 仅供高级用户使用。覆盖每个候选模型的超参数,例如{"TrainingArguments.max_steps": 5} |
custom_model_candiates | dict[str, Any],可选 | 仅供高级用户使用。运行用户自定义的候选模型,替代 PaddleNLP 内置默认候选,可参考._model_candidates属性 |
底层机制:Ray Tune + HyperOpt 贝叶斯搜索
train()的实现位于基类 auto_trainer_base.py,其核心调度链可以概括为:
- 构造可训练函数:
_construct_trainable()定义trainable(model_config),对每个候选配置依次执行"构造 Trainer →trainer.train()→trainer.evaluate()→trainer.save_model()"四步,并在训练后清理training_checkpoints以节约磁盘。 - 组织候选搜索空间:
_filter_model_candidates()按language与preset过滤出候选配置集合,再包装成{"candidates": hp.choice("candidates", model_candidates)}的 HyperOpt 搜索空间。 - 选择搜索算法:
HyperOptSearch依据metric_for_best_model与greater_is_better(决定mode="max"或"min")做贝叶斯优化;ConcurrencyLimiter施加max_concurrent_trials并发限制。 - 配置硬件资源:
tune.with_resources为每次试验分配num_gpus/num_cpus。 - 调度与落盘:
tune.Tuner.fit()执行全部试验并返回ResultGrid,每个 trial 的目录名与名字即trial_id;结束后将结果 DataFrame 写入<output_dir>/<experiment_name>/experiment_results.csv(对应基类常量results_filename)。
此外,基类在初始化时设置了TUNE_DISABLE_AUTO_CALLBACK_LOGGERS=1关闭 Ray Tune 自动 logger,并以log_to_driver=True if verbosity >= 1 else False控制日志回传,这是verbosity参数生效的底层原因。
内置候选模型空间(_model_candidates)
文本分类任务的默认候选模型定义在 text_classification.py 的_model_candidates属性中,分为三组、五种配置:
- 中文微调模型(preset="finetune"):
ernie-1.0-large-zh-cw、ernie-3.0-xbase-zh、ernie-3.0-tiny-base-v2-zh、ernie-3.0-tiny-medium-v2-zh、ernie-3.0-tiny-mini-v2-zh、ernie-3.0-tiny-micro-v2-zh、ernie-3.0-tiny-nano-v2-zh、ernie-3.0-tiny-pico-v2-zh(从 272M 到 5.9M 参数,覆盖大、中、小、微多个量级); - 英文微调模型(preset="finetune"):
roberta-large、roberta-base、distilroberta-base、ernie-2.0-base-en、ernie-2.0-large-en; - 中文 UTC 提示学习模型(preset="utc"):
utc-xbase、utc-base、utc-medium、utc-mini、utc-micro、utc-nano。
每组配置还包含可搜索的超参:per_device_train_batch_size在[2, 4, 8, 16, 32]中通过hp.choice采样,per_device_eval_batch_size为其两倍,num_train_epochs=100(配合early_stopping_patience=5实现提前停止),学习率则提供了3e-5(快速学习)与5e-6(慢速学习,UTC 为1e-5)两档策略。此外,train()还有一个 README 未强调的preset参数,可显式指定"finetune"或"utc"以锁定训练范式,不传时由数据自动推断。
候选模型若命中utc前缀,会走 PromptTrainer + UTCTemplate +UTCLoss(见 utils.py)的提示学习训练管线;否则走普通Trainer+DataCollatorWithPadding的标准微调管线,两者在_construct_trainer中分流。
检查与恢复实验结果
查看训练结果
实验结束后,调用show_training_results()会打印一个 pandas DataFrame:
auto_trainer.show_training_results()实验结果同时保存在<output_dir>/<experiment_name>/experiment_results.csv中(README 中描述为<output_dir>/experiment_results.csv,实际路径带实验名子目录)。不同试验产生的模型用trial_id唯一标识,你可以在 DataFrame 或 CSV 的对应列中找到它;后续evaluate/export/to_taskflow均以它为选择依据。
加载之前的实验结果
你可以从之前的运行(包括未完成的运行)中恢复实验结果:
auto_trainer.load("path/to/previous/results")其底层实现是tune.Tuner.restore(path)再get_results()(见 auto_trainer_base.py 的load方法),恢复后即可继续使用show_training_results()查看结果。需要注意:再次调用train()会覆盖之前的结果。
使用不同的评估数据集
除了构造时提供的评估数据集,你也可以用新数据集评估指定模型:
auto_trainer.evaluate( trial_id="trial_123456", eval_dataset=new_eval_dataset )参数说明:
trial_id(str,可选):通过trial_id指定要评估的模型,默认取metric_for_best_model排名下的最佳模型;eval_dataset(Dataset,可选):自定义评估数据集,必须包含text_column和label_column字段;未提供时默认使用构造时传入的评估数据集。
评估阶段,evaluate()会根据最佳模型的model_config重新构建 Trainer,从<trial 目录>/trained_model加载动图权重,再对新数据集做与训练时一致的分词预处理后评估,并返回eval_accuracy、micro/macro三种粒度的precision/recall/f1等指标(多标签场景下用 sigmoid +multilabel_threshold生成预测标签)。此外源码还提供了 README 未展开的predict(test_dataset, trial_id)方法,用于在无标签测试集上输出预测结果。
模型导出与部署
导出静态图模型
export()会将指定 trial 的模型导出为 Paddle 静态图推理模型,供后续推理或部署使用:
auto_trainer.export( trial_id="trial_123456", export_path="different/path/to/store/the/model" )参数说明:
export_path(str,必填):模型输出路径;trial_id(str/int,可选):通过trial_id指定要导出的模型,默认导出metric_for_best_model下的最佳模型。
从 text_classification.py 的实现看,导出产物包含model.pdmodel/model.pdiparams静态图文件、tokenizer_config.json、vocab.txt以及描述推理配置的taskflow_config.json(内含task、model、problem_type、id2label、multilabel_threshold、max_length、task_path等字段)。导出带幂等保护:同一 trial 已导出过且目标路径一致时会直接跳过;若已导出但目标路径不同,则直接拷贝。_get_input_spec会根据模型类型生成对应的静态图InputSpec(UTC 模型需要input_ids、token_type_ids、position_ids、attention_mask、omask_positions、cls_positions六路输入,ERNIE-M 只有input_ids,其余模型为input_ids+token_type_ids)。
一键转换为 Taskflow 推理
to_taskflow()可以免去手工拼接,直接把最佳(或指定)模型转成 PaddleNLP 的Taskflow进行推理:
taskflow = auto_trainer.to_taskflow() taskflow("this is a test input")参数说明:
trial_id(int,可选):指定要转换的模型,默认取最佳模型;- 另有
batch_size(默认 1)、precision(在["fp32", "fp16"]中选择,默认"fp32")、compress(是否输出压缩模型)三个可选参数。
其内部流程是:导出静态图模型 → 读取导出的taskflow_config.json→ 注入batch_size/precision→ 以Taskflow(**taskflow_config)构造推理实例。导出的 UTC 模型会注册为zero_shot_text_classification任务(利用schema即类别集合做零样本分类),普通微调模型则注册为text_classification任务。
模型压缩
值得补充的是,AutoTrainerForTextClassification还提供了compress()方法,用于对导出的静态图模型做后训练量化(Post Training Quantization, PTQ),这也是当前唯一内置的压缩策略。压缩过程使用paddle.static.quantization.PostTrainingQuantization,默认以 KL 散度算法对matmul/matmul_v2算子做 8-bit 权重(channel_wise_abs_max)与激活(range_abs_max)量化,量化后的模型同样可通过to_taskflow(compress=True)加载推理,在保持精度的同时减小模型体积、加速推理。
端到端实战示例
综合以上 API,一个完整的 AutoNLP 文本分类工作流如下:
from paddlenlp.experimental.autonlp import AutoTrainerForTextClassification # 1. 准备 paddle.io.Dataset 格式的数据集(train_ds / dev_ds 均须含 "sentence" 与 "labels" 字段) # 2. 构造自动训练器 auto_trainer = AutoTrainerForTextClassification( train_dataset=train_ds, eval_dataset=dev_ds, label_column="labels", text_column="sentence", language="Chinese", output_dir="autonlp_results" ) # 3. 启动自动模型搜索(10 个试验,总预算 10 分钟) results = auto_trainer.train( num_cpus=2, num_gpus=1, max_concurrent_trials=1, num_models=10, time_budget_s=60 * 10, verbosity=1 ) # 4. 查看结果 DataFrame(也可查看 CSV,按 trial_id 定位每个模型) df = auto_trainer.show_training_results() # 5. 恢复历史实验(可选) # auto_trainer.load("autonlp_results/<experiment_name>") # 6. 用新数据集评估最佳模型(可选) # auto_trainer.evaluate(eval_dataset=new_eval_dataset) # 7. 导出静态图模型 auto_trainer.export(export_path="exported_model") # 8. 转成 Taskflow 直接推理 taskflow = auto_trainer.to_taskflow() print(taskflow("今天北京的天气怎么样"))小结
AutoNLP 是 PaddleNLP 在自动化机器学习方向上的实验性尝试,核心价值在于:把"模型选择、超参搜索、微调/提示学习、评估、导出、部署、压缩"等繁琐环节封装在AutoTrainerForTextClassification一个类里,以 Ray Tune + HyperOpt 为搜索引擎,在有限的算力和时间预算内自动产出不错的文本分类模型。理解其参数语义(尤其是metric_for_best_model与greater_is_better的选择逻辑、trial_id的定位作用、hp_overrides/custom_model_candidates的扩展方式)是把它用好的关键。鉴于其 API 仍处于实验阶段,建议在正式项目中跟进版本更新,并结合 paddlenlp/experimental/autonlp 目录下的源码了解最新实现。
- 人工智能
- 大模型
- 预训练
- 微调
- LoRA
- RLHF
- 强化学习
- 分布式训练
【免费下载链接】PaddleNLP
Easy-to-use and powerful LLM and SLM library with awesome model zoo.
相关推荐
5分钟掌握Webhook部署自动化:从零到一键部署实战
5分钟掌握Webhook部署自动化:从零到一键部署实战 Webhook是一款轻量级的传入webhook服务器,能够运行shell命令,帮助开发者实现自动化部署流
后端API网关FF14动画跳过插件:告别冗长副本动画的终极解决方案
FF14动画跳过插件:告别冗长副本动画的终极解决方案 还在为《最终幻想14》国服副本中那些无法跳过的动画而烦恼吗?FFXIV_ACT_CutsceneSkip插
人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP3步搞定大麦网抢票脚本:Python自动化抢票的终极解决方案
3步搞定大麦网抢票脚本:Python自动化抢票的终极解决方案 还在为抢不到心仪的演唱会门票而烦恼吗?每次热门演出开票瞬间售罄,手动刷新总是慢人一步?今天我要分享
网页爬虫工作流自动化
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考