PaddleNLP GPT-345M 单机单卡微调指南:基于 GLUE benchmark 的分类与回归任务实践

发布时间:2026/9/26 2:16:25
PaddleNLP GPT-345M 单机单卡微调指南:基于 GLUE benchmark 的分类与回归任务实践 人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载本教程围绕 PaddleNLP 模型仓库中 GPT-3GPT-2 架构项目的单机单卡微调展开完整讲解如何基于 GPT-345M 预训练模型在 GLUEGeneral Language Understanding Evaluationbenchmark 的 9 个数据集上完成文本分类与回归任务的微调。读完本文你将掌握从模型下载、一键脚本运行、超参数配置到逐任务启动命令的完整实战流程并理解GPTForSequenceClassification与GPTFinetuneModule的底层实现原理。一、前置准备环境与 GPT-345M 预训练模型下载微调前需要准备 Python/Paddle 运行环境并在仓库slm/model_zoo/gpt-3目录下运行该目录对应 GPT 项目的完整代码入口训练脚本为 tools/train.py。随后下载 GPT-345M 预训练模型权重# 如果已经下载可以忽略 mkdir -p ckpt wget -O ckpt/GPT_345M.tar.gz https://paddlefleetx.bj.bcebos.com/model/nlp/gpt/GPT_345M.tar.gz tar -xzf ckpt/GPT_345M.tar.gz -C ckpt/解压后得到的目录中包含模型权重文件如PaddleFleetX_GPT_345M_220826/model.pdparams其路径前缀将在后文的Model.pretrained配置中使用。注意下载地址为公开模型托管服务若网络受限可重试或配置代理。二、GLUE benchmark 数据集概览GLUE benchmark 包含 9 个数据集分别是CoLA、SST-2、MRPC、QQP、STS-B、MNLI、QNLI、RTE、WNLI涉及自然语言推断、文本蕴含、情感分析、语义相似等任务整体可归为 3 类任务类别包含数据集任务描述单句任务CoLA、SST-2可接受性判断、情感分类相似性/释义任务MRPC、QQP、STS-B句子对是否语义等价、相似度打分推断/蕴含任务MNLI、QNLI、RTE、WNLI前提-假设蕴含关系判断、阅读理解式问答各数据集的具体定义摘自 GLUE 官方数据卡CoLAThe Corpus of Linguistic Acceptability由语言学理论书籍与期刊文章中抽取的英语可接受性判断构成每条样本是一段单词序列并标注其是否为语法正确的英语句子。SST-2The Stanford Sentiment Treebank由电影评论句子与人工情感标注构成任务为预测句子情感本项目使用二分类正面/负面划分并仅使用句子级标签。MRPCThe Microsoft Research Paraphrase CorpusDolan Brockett, 2005从在线新闻源自动抽取的句子对语料人工标注句子对是否语义等价。QQPThe Quora Question Pairs2来自问答社区 Quora 的问题对集合任务是判断一对问题是否语义等价。STS-BThe Semantic Textual Similarity BenchmarkCer et al., 2017句子对来自新闻标题、视频与图片描述及自然语言推断数据每对样本由人工标注 1~5 的相似度分数。MNLIThe Multi-Genre Natural Language Inference Corpus众包收集的带文本蕴含标注的句子对语料给定前提句与假设句预测前提是蕴含假设entailment、与假设矛盾contradiction还是中性neutral前提句来自转录语音、小说、政府报告等十个来源并在匹配in-domain与不匹配cross-domain两个验证集上评估。QNLIThe Stanford Question Answering Dataset问答数据集将问题与段落中每个句子配对形成句子对分类任务判断上下文句子是否包含问题答案。RTEThe Recognizing Textual EntailmentRTE数据集来自一系列年度文本蕴含挑战赛RTE1/RTE2/RTE3/RTE5样本基于新闻与维基百科文本构建统一转换为二分类neutral 与 contradiction 合并为 not entailment。WNLIThe Winograd Schema ChallengeLevesque et al., 2011阅读理解任务系统需阅读带代词的句子并从候选项中选出代词指代对象通过用每个可能的指代对象替换歧义代词构造句子对判断替换后的句子是否被原句蕴含。这些数据集在仓库中均有对应的paddle.io.Dataset实现位于 glue_dataset.py导出CoLA、SST2、MNLI、QNLI、RTE、WNLI、MRPC、QQP、STSB共 9 个类。每个数据集类内置官方下载 URL 与 MD5 校验值实例化时会自动判断本地是否已缓存若root目录不存在则调用cached_path下载 zip 包并解压因此首次运行时请保证网络畅通自动下载失败时可尝试重试、检查代理设置或手动下载后解压到对应root目录。三、快速体验一键微调脚本仓库提供了现成的单机单卡一键微调脚本 finetune_gpt_345M_single_card.sh# cd path/to/PaddleFleetX # bash projects/gpt/finetune_gpt_345M_single_card.sh taskname [split] # taskname 可选: CoLA, SST2, MRPC, QQP, STSB, MNLI, QNLI, RTE, WNLI # 例如 bash projects/gpt/finetune_gpt_345M_single_card.sh CoLA # 注当数据集为 MNLI 时验证集有两种分别是 dev_matched 和 dev_mismatched # 其他数据集只有一种验证集因此不用选择 # 可以通过 bash projects/gpt/finetune_gpt_345M_single_card.sh MNLI dev_matched # 或者 bash projects/gpt/finetune_gpt_345M_single_card.sh MNLI dev_mismatched # 进行 finetune 训练 bash projects/gpt/finetune_gpt_345M_single_card.sh SST2脚本内部会先export CUDA_VISIBLE_DEVICES0固定使用 0 号 GPU然后根据第一个参数$1命中对应任务分支组装python ./tools/train.py -c ./ppfleetx/configs/nlp/gpt/finetune_gpt_345M_single_card_glue.yaml -o ...的完整命令MNLI 分支额外使用-o Data.Eval.dataset.split${2:-dev_matched}即第二个参数$2用于指定验证集缺省时默认dev_matched。脚本对未识别的任务名会给出提示Task name not recognized, please input CoLA, SST2, MRPC, QQP, STSB, MNLI, QNLI, RTE, WNLI.四、微调核心类与实现原理GPTForSequenceClassification分类头与池化逻辑微调的核心是把「下一个词预测」的 GPT 解码器改造成「句子分类/回归」模型。在 single_model.py 中GPTForSequenceClassification在 GPT 模型输出的 logits 基础上增加一个线性分类层并用正态分布对新增层参数进行初始化self.score nn.Linear(self.gpt.hidden_size, num_classes, bias_attrFalse) from paddle.nn.initializer import Normal normal_ Normal(stdself.gpt.initializer_range) normal_(self.score.weight)其forward会进一步做末位 token 池化由于 GPT 是因果causal解码器每个位置只能看到左侧的上下文因此取每条样本最后一个非 padding token 的 logits 作为整句的表示。源码中以eos_token_id 0为边界计算序列长度再通过gather_nd抽取对应位置的 logitssequence_lengths (input_ids ! eos_token_id).astype(int64).sum(axis-1) - 1 pooled_logits logits.gather_nd(paddle.stack([paddle.arange(output.shape[0]), sequence_lengths], axis-1)) return pooled_logitsGPTFinetuneModule微调模块的初始化与推理逻辑该类继承自BasicModule实现位于 language_module.py负责微调模型的初始化以及逻辑计算其__init__与get_model是核心__init__负责初始化 loss 函数以及评测指标函数。实现上先从配置中取出loss与metric配置块通过eval(fpaddle.nn.loss.{train_loss_cls})与eval(f{train_metric_cls})动态实例化训练/验证损失函数与指标对象eval指标支持AccuracyAndF1、Mcc、PearsonAndSpearman等自定义类定义见 metrics.py同时维护self.best_metric用于记录最优验证指标。get_model负责微调类GPTForSequenceClassification、GPTTokenizer的初始化以及预训练模型的加载。关键步骤包括从Model配置中剥离module/loss/metric/pretrained/num_classes等微调专用字段通过GPTTokenizer.from_pretrained(gpt2)实现见 gpt_tokenizer.py基于 Byte-level BPE初始化 tokenizer按num_layers/hidden_size/vocab_size/max_length打印模型参数量估算构造GPTForSequenceClassification(gpt.GPTModel(**model_setting), num_classes)加载pretrained .pdparams权重并自动处理融合 QKV 参数与分离 QKV 参数之间的相互转换源码通过检查权重中是否存在qkv_proj键来判断预训练权重与当前模型结构是否同为 fused 或 split 布局不一致时调用fuse_params/split_params完成q_proj/k_proj/v_proj与qkv_proj的 reshape、拆分与堆叠对 dtype 不一致的参数做 cast 后set_state_dict完成权重装载。微调模块还实现了training_step取input_ids, labels计算 logits 与交叉熵 loss、validation_step使用self.eval_loss_fn与self.eval_metric.compute/update以及validation_epoch_end按指标类型输出不同格式的结果AccuracyAndF1输出 acc/precision/recall/f1Mcc输出 mccPearsonAndSpearman输出 pearson/spearman其余输出 acc并更新best_metric。五、微调超参数详解微调训练也需要一套完整的超参数但涉及的核心超参数并不多。GLUE 微调的基准配置为 finetune_gpt_345M_single_card_glue.yaml它通过_base_: ./finetune_gpt_base.yaml继承基础配置见 finetune_gpt_base.yaml其中定义了Global.device: gpu、Global.seed: 42与Engine.run_mode: epoch等通用项。以下按配置块逐一说明。Engine参数字段参数含义run_mode运行的模式需要设置为 epoch 方式num_train_epochs需要 finetune 的 epoch 数Engine: run_mode: epoch num_train_epochs: 3 # WNLI 和 MRPC 数据集比较小因此 num_train_epochs5。基准配置中 Engine 还包含logging_freq: 10日志打印频率、eval_freq: 1每多少个 epoch 验证一次以及混合精度配置mix_precisionenable: True、scale_loss: 32768.0初始 loss scale并通过custom_black_list与custom_white_list指定哪些算子不参与/参与 FP16 计算如lookup_table等嵌入类算子白名单、reduce_sum等精度敏感算子黑名单。save_load块中save_epoch: 1表示每 1 个 epoch 保存一次 checkpointoutput_dir: ./output指定输出目录。Model参数字段参数含义module需要设置为 GPTFinetuneModulename需要设置为 GPTnum_classesfinetune 时的类别数根据语料库以及任务来设定pretrained预训练的权重文件路径前缀去掉 .pdparamsloss.train.namefinetune 时的训练损失函数类名loss.eval.namefinetune 时的验证损失函数类名metric.eval.namefinetune 时的验证评估函数类名微调时不同任务对应的类别数、loss 函数以及评测指标不同因此需要通过配置来改变设置Model: module: GPTFinetuneModule name: GPT num_classes: 2 # 1 or 2 or 3 pretrained: path/to/pretrained_model loss: train: name: CrossEntropyLoss eval: name: CrossEntropyLoss metric: eval: name: Accuracy在 finetune_gpt_345M_single_card_glue.yaml 中pretrained被设置为./ckpt/PaddleFleetX_GPT_345M_220826/model对应第一步解压得到的权重前缀同时给出完整的 GPT-345M 结构参数vocab_size: 50304、hidden_size: 1024、num_layers: 24、num_attention_heads: 16、ffn_hidden_size: 4096、max_position_embeddings: 1024、initializer_range: 0.02等fuse_attn_qkv: True表示注意力层采用融合的 QKV 线性投影对应前述权重转换逻辑fused_linear: False表示暂不启用融合线性层。需要说明的是num_classes取值的分布为CoLA/SST-2/MRPC/QQP/QNLI/RTE/WNLI 为 2MNLI 为 3STS-B 为 1回归任务。Optimizer 和 LRScheduler参数字段参数含义name优化器类名weight_decay权重衰减值beta1FusedAdamW 的 beta1beta2FusedAdamW 的 beta2epsilonFusedAdamW 的 epsilonmulti_precision当使用 FP16 O2 级别时是否开启参数使用多精度表示tensor_fusion是否开启 tensor_fusionlr.name学习率调整策略类名lr.warmup当参数是小数时表示 warmup 步数占总步数的比例如果是整数时则表示 warmup 的步数lr.learning_rate初始化学习率值注这里的超参会跟随优化器类的不同而不同可以自行查看优化器类和学习率调整策略类初始化函数需要设置的超参数设定。Optimizer: name: FusedAdamW weight_decay: 0.0 beta1: 0.9 beta2: 0.999 epsilon: 1e-6 multi_precision: True tensor_fusion: False lr: name: LinearDecayWithWarmup warmup: 0.1 learning_rate: 2e-5在训练入口 tools/train.py 中学习率调度器还会被补充三个运行时字段epochs取Engine.num_train_epochs、step_each_epoch取训练 DataLoader 长度与total_steps取Engine.max_steps即线性衰减带 warmup 的调度会按「总 epoch × 每 epoch 步数」换算总步数。Data参数字段参数含义Train.dataset描述 finetune 时的数据集Train.sampler描述 dataloader 所需要的 batch samplerTrain.loader描述 dataloader 所需要的相关信息例如 num_workers 等注数据集的设定会根据不同任务不同语料库不同而设定不同例如split字段不同数据集是有不同的设定请参考所需要 finetune 的数据集初始化函数即 glue_dataset.py 中各类的__init__其中CoLA/SST2支持train/dev/testMNLI支持train/dev_matched/dev_mismatched。Data: Train: dataset: name: SST2 root: ./dataset/SST-2/ split: train max_length: 128 sampler: name: DistributedBatchSampler batch_size: 32 shuffle: True drop_last: True loader: num_workers: 4 return_list: False Eval: dataset: name: SST2 root: ./dataset/SST-2/ split: dev max_length: 128 sampler: name: DistributedBatchSampler batch_size: 32 shuffle: False drop_last: False loader: num_workers: 4 return_list: False数据加载细节可以从数据集实现中印证所有 GLUE 数据集在__getitem__中使用GPTTokenizer对样本做paddingmax_length、truncationlongest_first、max_length对齐默认 128训练/验证 split 返回(input_ids, label)二元组test split 仅返回input_ids。此外基准配置还包含Distributed块dp_degree/mp_degree/pp_degree/sharding_degree/sharding_stage均为 1即单卡与Global.local_batch_size/micro_batch_size: 32的批大小设定。六、逐任务运行命令GLUE benchmark 上的语料库 finetune 大部分设置相同可以共享同一份配置只有少量区别处需要改变因此可以通过超参数的覆盖方式来设置命令格式统一为python ./tools/train.py -c ./ppfleetx/configs/nlp/gpt/finetune_gpt_345M_single_card_glue.yaml -o 需要覆盖的字段值 ...数据集加载时会自动判断是否已经缓存下载如果未缓存下载会自行下载请保证网络的畅通当自动下载失败时可以尝试多次以及检查是否有代理设置等下载失败时也可以自己下载及解压到对应目录中。以下是每个语料库的单机单卡启动命令。CoLA 数据集python ./tools/train.py -c ./ppfleetx/configs/nlp/gpt/finetune_gpt_345M_single_card_glue.yaml \ -o Data.Train.dataset.nameCoLA \ -o Data.Train.dataset.root./dataset/cola_public/ \ -o Data.Eval.dataset.nameCoLA \ -o Data.Eval.dataset.root./dataset/cola_public/ \ -o Data.Eval.dataset.splitdev \ -o Model.metric.train.nameMcc \ -o Model.metric.eval.nameMcc \ -o Model.num_classes2SST2 数据集python ./tools/train.py -c ./ppfleetx/configs/nlp/gpt/finetune_gpt_345M_single_card_glue.yaml \ -o Data.Train.dataset.nameSST2 \ -o Data.Train.dataset.root./dataset/SST-2/ \ -o Data.Eval.dataset.nameSST2 \ -o Data.Eval.dataset.root./dataset/SST-2/ \ -o Data.Eval.dataset.splitdev \ -o Model.num_classes2MRPC 数据集python ./tools/train.py -c ./ppfleetx/configs/nlp/gpt/finetune_gpt_345M_single_card_glue.yaml \ -o Engine.num_train_epochs5 \ -o Data.Train.dataset.nameMRPC \ -o Data.Train.dataset.root./dataset/MRPC/ \ -o Data.Eval.dataset.nameMRPC \ -o Data.Eval.dataset.root./dataset/MRPC/ \ -o Data.Eval.dataset.splittest \ -o Model.num_classes2 \ -o Model.metric.train.nameAccuracyAndF1 \ -o Model.metric.eval.nameAccuracyAndF1QQP 数据集python ./tools/train.py -c ./ppfleetx/configs/nlp/gpt/finetune_gpt_345M_single_card_glue.yaml \ -o Data.Train.dataset.nameQQP \ -o Data.Train.dataset.root./dataset/QQP/ \ -o Data.Eval.dataset.nameQQP \ -o Data.Eval.dataset.root./dataset/QQP/ \ -o Data.Eval.dataset.splitdev \ -o Model.num_classes2 \ -o Model.metric.train.nameAccuracyAndF1 \ -o Model.metric.eval.nameAccuracyAndF1STSB 数据集python ./tools/train.py -c ./ppfleetx/configs/nlp/gpt/finetune_gpt_345M_single_card_glue.yaml \ -o Data.Train.dataset.nameSTSB \ -o Data.Train.dataset.root./dataset/STS-B/ \ -o Data.Eval.dataset.nameSTSB \ -o Data.Eval.dataset.root./dataset/STS-B/ \ -o Data.Eval.dataset.splitdev \ -o Model.num_classes1 \ -o Model.metric.train.namePearsonAndSpearman \ -o Model.metric.eval.namePearsonAndSpearman \ -o Model.loss.train.nameMSELoss \ -o Model.loss.eval.nameMSELossMNLI 数据集注MNLI 数据集验证集分为dev_matched和dev_mismatched目前暂不支持两个集合同时评测。如果要评测两种验证集有两种方法分别 finetune 2 次Data.Eval.dataset.split设置不同的验证集保存 finetune 后的 checkpoint在不同验证集上离线评测。python ./tools/train.py -c ./ppfleetx/configs/nlp/gpt/finetune_gpt_345M_single_card_glue.yaml \ -o Data.Train.dataset.nameMNLI \ -o Data.Train.dataset.root./dataset/multinli_1.0 \ -o Data.Eval.dataset.nameMNLI \ -o Data.Eval.dataset.root./dataset/multinli_1.0 \ -o Data.Eval.dataset.splitdev_matched \ -o Model.num_classes3QNLI 数据集python ./tools/train.py -c ./ppfleetx/configs/nlp/gpt/finetune_gpt_345M_single_card_glue.yaml \ -o Data.Train.dataset.nameQNLI \ -o Data.Train.dataset.root./dataset/QNLI/ \ -o Data.Eval.dataset.nameQNLI \ -o Data.Eval.dataset.root./dataset/QNLI/ \ -o Data.Eval.dataset.splitdev \ -o Model.num_classes2RTE 数据集python ./tools/train.py -c ./ppfleetx/configs/nlp/gpt/finetune_gpt_345M_single_card_glue.yaml \ -o Data.Train.dataset.nameRTE \ -o Data.Train.dataset.root./dataset/RTE/ \ -o Data.Eval.dataset.nameRTE \ -o Data.Eval.dataset.root./dataset/RTE/ \ -o Data.Eval.dataset.splitdev \ -o Model.num_classes2WNLI 数据集python ./tools/train.py -c ./ppfleetx/configs/nlp/gpt/finetune_gpt_345M_single_card_glue.yaml \ -o Engine.num_train_epochs5 \ -o Data.Train.dataset.nameWNLI \ -o Data.Train.dataset.root./dataset/WNLI/ \ -o Data.Eval.dataset.nameWNLI \ -o Data.Eval.dataset.root./dataset/WNLI/ \ -o Data.Eval.dataset.splitdev \ -o Model.num_classes2七、运行结果参考以下指标是通过 GPT-345M 预训练模型 finetune 得到的结果仅作为参考对应不同任务的损失函数与评测指标配置分类任务用CrossEntropyLoss 相应指标STS-B 回归任务用MSELossPearsonAndSpearmanCorpusTaskDomainMetricResultCoLAacceptabilityMisc.Matthews corr0.60471SST-2sentimentMovie reviewsAccuracy0.93005MNLINLIMisc.Matched acc./Mismatched acc.0.84238/0.84815QNLIQA/NLIWikipediaAccuracy0.90445RTENLINews, WikipediaAccuracy0.70397WNLIcoreferenceBooksAccuracy0.40845MRPCparaphraseNewsAccuracy/F10.81913/0.87022QQPparaphrasesocial QA questionAccuracy/F10.86087/0.81055STS-Bsentence similarityMisc.Pearson/Spearman corr.0.85797/0.85824八、进一步阅读如果你想验证微调流程的端到端可复现性可以查看 TIPC 测试用例 CE_gpt_finetune_SST2_bs32_fp16_DP1-MP1-PP1.sh它演示了以 SST2 为样例、batch_size32、FP16 精度、DP1-MP1-PP1 拓扑的微调 benchmark 入口以acc:为收敛指标。训练入口的完整数据流配置解析 → 模块构建 → DataLoader 构建 → EagerEngine.fit可参考 tools/train.py模型结构与权重转换细节可进一步阅读 single_model.py 与 language_module.py。本项目的其他运行模式单卡预训练、混合并行、推理、量化感知训练等可参阅 docs 下的single_card.md、hybrid_parallel.md、inference.md等文档以及projects/gpt/目录中对应的pretrain_*.sh、evaluate_*.sh、export_*.sh脚本。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐PaddleNLP GLUE Benchmark 实战8 个自然语言理解任务的微调、评测指标与 Trainer 训练PaddleNLP GLUE Benchmark 实战8 个自然语言理解任务的微调、评测指标与 Trainer 训练 GLUEGeneral Languag人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP中ERNIE-Layout模型在文档图像分类任务上的微调实践PaddleNLP中ERNIE Layout模型在文档图像分类任务上的微调实践 引言文档智能化的时代需求 在数字化转型浪潮中企业每天处理海量的文档资料——发大模型NLP预训练微调模型推理服务模型量化分布式训练RLHF人工智能Transformers 音频分类任务完全指南基于 Wav2Vec2 微调与推理实战Transformers 音频分类任务完全指南基于 Wav2Vec2 微调与推理实战 音频分类Audio Classification是 Trans人工智能深度学习机器学习预训练微调NLP计算机视觉语音多模态上一篇特斯拉数据监控完整指南TeslaMate 自托管部署电池衰减与充电成本一次看清下一篇ROCm项目中GPU低功耗状态导致rocm-smi信息获取异常问题解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考