☰
PaddleNLP AutoNLP 低代码自动化文本分类实战:从模型搜索到一键部署
2026/9/25 15:21:17 网站建设 项目流程
  • 人工智能
  • 大模型
  • 预训练
  • 微调
  • LoRA
  • RLHF
  • 强化学习
  • 分布式训练

【免费下载链接】PaddleNLP

Easy-to-use and powerful LLM and SLM library with awesome model zoo.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleNLP
点击查看免费下载

AutoNLP 是 PaddleNLP 的早期实验项目(代码位于 paddlenlp/experimental/autonlp),其核心定位是在有限计算资源下用低代码方式自动完成 NLP 建模,通过自动化的模型搜索(AutoML)帮你选出不错的文本分类模型。读完本文,你将掌握AutoTrainerForTextClassification的完整用法:如何构造训练器、启动多试验自动搜索、查看与恢复实验结果、导出静态图模型,并借助 Taskflow 一键部署推理。

注意:AutoNLP 目前处于实验阶段(Experimental),官方明确提示 "在正式发布之前,AutoNLP API 有可能会变动",生产环境接入前请评估 API 稳定性风险。

AutoNLP 的项目定位与设计理念

AutoNLP 是 PaddleNLP 官方推出的实验性质自动化机器学习(AutoML)能力,与"用大规模算力刷 SOTA"的传统 AutoML 路线刻意保持差异,其四项核心理念如下:

  1. 有限算力下的"不错模型"而非"最先进模型":项目假设用户至多拥有几张 GPU,希望在 8 小时内用自己的数据集训出不错的模型,而不是在巨型集群、海量数据上追求 State-of-the-Art 精度。
  2. 低代码而非无代码:目标是让开发者用几行 Python 代码就能训练出可用模型,但它不是拖拽式的无代码训练服务,仍保留编程接口的灵活性与可控性。
  3. 抽象化 PaddleNLP 的全流程能力:尽可能自动化并封装 PaddleNLP 已有的完整 NLP 流程——预处理、分词、微调(Finetuning)、提示学习(Prompt Tuning)、模型压缩、一键部署等,帮助开发者针对自己的业务场景快速适配落地。
  4. 免费且开源: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_datasetpaddle.io.Dataset,必填训练数据集,必须包含下方指定的text_column与label_column字段
eval_datasetpaddle.io.Dataset,必填评估数据集,同样必须包含text_column与label_column字段
text_columnstring,必填数据集中的文本字段名,是模型的主要输入
label_columnstring,必填数据集中的标签字段名
languagestring,必填文本语言,当前支持"Chinese"与"English"(见源码中supported_languages属性)
metric_for_best_modelstring,可选用于选择最优模型的评估指标名,默认为eval_accuracy(多标签场景默认为eval_macro_f1)
greater_is_betterbool,可选指标越大是否代表模型越好,需与metric_for_best_model配合使用,默认True
problem_typestr,可选按问题性质在["multi_class", "multi_label"]中选择,默认"multi_class"
output_dirstr,可选实验结果输出目录,源码默认值为autonlp_results(README 中拼写为autpnlp_results,属于文档笔误,以源码实现为准)
verbosityint,可选控制日志详细程度,默认为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_modelsint,必填运行的模型试验数量,即 Ray Tune 的采样样本数
num_gpusstr/int,可选每次试验使用的 GPU 数量,默认根据检测到的 GPU 数量自动设置
num_cpusstr/int,可选每次试验使用的 CPU 数量,默认根据检测到的 vCPU 数量自动设置
max_concurrent_trialsint,可选同时运行的最大试验数,必须为非负数;为None或0时不加限制,默认None
time_budget_sint/float/datetime.timedelta,可选以秒为单位的全局时间预算,超时后停止所有模型试验
experiment_namestr,可选实验名称,实验日志存放在<output_dir>/<experiment_name>下,默认为 UNIX 时间戳
hp_overridesdict[str, Any],可选仅供高级用户使用。覆盖每个候选模型的超参数,例如{"TrainingArguments.max_steps": 5}
custom_model_candiatesdict[str, Any],可选仅供高级用户使用。运行用户自定义的候选模型,替代 PaddleNLP 内置默认候选,可参考._model_candidates属性

底层机制:Ray Tune + HyperOpt 贝叶斯搜索

train()的实现位于基类 auto_trainer_base.py,其核心调度链可以概括为:

  1. 构造可训练函数:_construct_trainable()定义trainable(model_config),对每个候选配置依次执行"构造 Trainer →trainer.train()→trainer.evaluate()→trainer.save_model()"四步,并在训练后清理training_checkpoints以节约磁盘。
  2. 组织候选搜索空间:_filter_model_candidates()按language与preset过滤出候选配置集合,再包装成{"candidates": hp.choice("candidates", model_candidates)}的 HyperOpt 搜索空间。
  3. 选择搜索算法:HyperOptSearch依据metric_for_best_model与greater_is_better(决定mode="max"或"min")做贝叶斯优化;ConcurrencyLimiter施加max_concurrent_trials并发限制。
  4. 配置硬件资源:tune.with_resources为每次试验分配num_gpus/num_cpus。
  5. 调度与落盘: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.

项目地址:https://gitcode.com/gh_mirrors/pa/PaddleNLP
点击查看免费下载

相关推荐

上一篇:别让老游戏死在启动画面上:一份 ddraw.dll 免费根治 DirectX 1-7 兼容顽疾的完整指南
下一篇:两台 Windows 电脑直接传文件?SyncTrayzor 让同步不再绕道网盘

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询