ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Transformers TensorFlow 多选问答微调实战:基于 SWAG 的 run_swag.py 脚本深度解析

Transformers TensorFlow 多选问答微调实战:基于 SWAG 的 run_swag.py 脚本深度解析 推理引擎大模型【免费下载链接】FlexGenRunning large language models on a single GPU for throughput-oriented scenarios.项目地址https://gitcode.com/gh_mirrors/fl/FlexGen点击查看免费下载本篇技术指南以 benchmark/third_party/transformers/examples/tensorflow/multiple-choice/README.md 为骨架结合 run_swag.py 完整源码系统讲解如何使用 Transformers 在 TensorFlow/Keras 上微调多选问答Multiple-choice模型。读完本文你将掌握该脚本的三段式参数体系、SWAG 数据预处理与自定义 Data Collator 的实现原理、多 GPU/TPU 分布式训练的配置方法并能将其直接迁移到自己的多选任务如常识推理、阅读理解候选题中。该示例位于本仓库benchmark/third_party/transformers目录下作为第三方模型基线之一被 FlexGen 性能评测脚本引用对照理解其训练与推理形态也有助于读懂后续的基准对比逻辑。一、脚本概述一个开箱即用的多选问答微调示例multiple-choice目录下包含三个文件核心训练脚本 run_swag.py、依赖清单 requirements.txt 以及本 README。该脚本演示的是**多选作答multiple-choice answering**范式给定一段上下文和若干候选结尾/选项模型需要预测正确的那一个。SWAGSituations With Adversarial Generations是这一任务最具代表性的公开数据集脚本默认直接使用它。对于常规使用场景该脚本无需任何修改即可直接运行源码中通过注释明确标出了需要针对自有项目进行调整的部分如数据集列名、选项数量、预处理逻辑等。从实现看脚本依赖以下关键 Transformers 组件见 run_swag.pyTFAutoModelForMultipleChoice多选任务专用的 TensorFlow 模型基类TFTrainingArguments涵盖训练超参、分布式策略、输出与 Hub 推送等全部训练参数HfArgumentParser将命令行/JSON 参数解析为类型安全的 dataclasscreate_optimizer构建带 warmup 与权重衰减的 AdamW 优化器及学习率调度DefaultDataCollator与自定义DataCollatorForMultipleChoice负责批次组装与动态填充。脚本开头的check_min_version(4.24.0)强制要求 Transformers 版本不低于 4.24.0低于此版本会直接报错这是使用前需要确认的环境前提。二、环境依赖与安装前提requirements.txt 给出的依赖极其精简只有三项sentencepiece ! 0.1.92 protobuf tensorflow 2.3其中sentencepiece用于某些 BPE 类分词器如 XLM、XLNet 等的底层切词排除 0.1.92 版本是为了规避该版本已知问题protobuf是 TensorFlow 生态的公共依赖tensorflow 2.3声明了脚本可运行的最低 TensorFlow 版本。此外脚本运行时还需要datasets、transformers两个库二者在 run_swag.py 顶部导入。安装方式为常规 pip 安装上述依赖后直接运行脚本无需编译任何自定义算子。三、参数体系三类 dataclass 的完整对照脚本通过HfArgumentParser同时解析三类参数见 run_swag.py模型参数ModelArguments、数据参数DataTrainingArguments、训练参数TFTrainingArguments。支持两种传参方式命令行传参python run_swag.py --model_name_or_path ...JSON 文件传参当只传入一个以.json结尾的参数时自动走parser.parse_json_file()分支把 JSON 反序列化为上述三类参数。3.1 模型参数ModelArguments参数默认值含义model_name_or_path必填预训练模型路径或 Hugging Face Hub 模型标识如distilbert-base-casedconfig_nameNone预训练配置名称/路径与模型名不同时使用tokenizer_nameNone分词器名称/路径与模型名不同时使用cache_dirNone下载的预训练模型缓存目录use_fast_tokenizerTrue是否使用 tokenizers 库支撑的快速分词器model_revisionmain模型版本分支名、标签名或 commit iduse_auth_tokenFalse是否使用huggingface-cli login生成的令牌访问私有模型时需要参数定义见 run_swag.py。其中config_name与tokenizer_name的设计允许用户对同一个模型权重搭配不同的配置与分词器例如更换词表或调整结构。3.2 数据参数DataTrainingArguments参数默认值含义train_fileNone本地训练数据文件仅支持 csv 或 json脚本会断言扩展名validation_fileNone本地评估数据文件仅支持 csv 或 jsonoverwrite_cacheFalse是否覆盖预处理缓存preprocessing_num_workersNone预处理并行进程数max_seq_lengthNone分词后的最大序列长度超长截断、超短填充pad_to_max_lengthFalse是否把全部样本填充到最大长度False时按批次动态填充GPU 上更高效但对 TPU 很不友好max_train_samplesNone截断训练样本数调试/快速验证用max_eval_samplesNone截断评估样本数调试/快速验证用参数定义见 run_swag.py。需要特别说明的是pad_to_max_length与max_seq_length的组合行为当max_seq_length未指定时脚本读取tokenizer.model_max_length若该值大于 1024 则自动回退到 1024日志中会给出警告可通过--max_seq_length xxx覆盖当显式传入的max_seq_length超过tokenizer.model_max_length时脚本取二者较小值并给出警告见 run_swag.py。3.3 训练参数TFTrainingArguments该参数集来自 Transformers 库的TFTrainingArguments脚本运行示例中直接用到--output_dir、--do_eval、--do_train其余常用项包括--output_dir输出目录模型与结果保存位置必填--do_train/--do_eval是否执行训练/评估评估不依赖训练可单独运行--per_device_train_batch_size/--per_device_eval_batch_size单设备单 GPU 或 TPU 核批大小总批大小会在训练时按副本数放大--num_train_epochs训练轮数--learning_rate、--warmup_steps/--warmup_ratio学习率与预热二者任一大于 0 即生效warmup_ratio按总步数比例计算--adam_beta1/--adam_beta2/--adam_epsilonAdam 超参--weight_decay权重衰减系数--max_grad_norm梯度全局裁剪范数--xla启用jit_compile即 XLA 编译--seed随机种子在模型初始化前调用set_seed--overwrite_output_dir输出目录已存在且非空时是否覆盖继续--push_to_hub系列--push_to_hub_model_id、--push_to_hub_organization、--push_to_hub_token用于把模型推送到 Hub。完整参数可通过python run_swag.py --help查看源码注释指向src/transformers/training_args.py。四、数据加载与预处理全流程4.1 数据集来源两种模式脚本支持两种数据来源见 run_swag.py默认模式不传train_file/validation_file时自动从 Hub 下载 SWAG 数据集即load_dataset(swag, regular)本地文件模式传入train_file/validation_file后按扩展名csv/json加载本地数据。分布式场景下load_dataset保证同一数据只由一个本地进程负责下载。4.2 SWAG 数据结构与列名约定SWAG 数据集的字段约定被硬编码在脚本中见 run_swag.pyending_names [fending{i} for i in range(4)]4 个候选结尾列ending0~ending3context_name sent1上下文前提句question_header_name sent2附加问题/引导句与每个候选结尾拼接成完整选项。换用自有数据集时这里就是要改的第一个位置选项数量变了就调整ending_names的长度字段名不同就替换三个变量名并在预处理函数中保持同样的拼接语义。4.3 预处理函数 preprocess_function核心预处理逻辑见 run_swag.py分四步上下文复制把sent1复制 4 份得到[[context] * 4 ...]与 4 个候选一一对应选项拼接对每个样本把sent2header与其 4 个ending分别拼接构成第二个句子扁平化list(chain(*...))把(N, 4)结构展平为4N个独立序列交给tokenizer(first_sentences, second_sentences, truncationTrue, max_lengthmax_seq_length)成批分词还原形状把分词结果按每 4 个一组切回(N, 4)结构产出每个样本一个input_ids/attention_mask的 4×seq_len 张量。4.4 为什么需要自定义 Data Collator多选任务的难点在于每个训练样本实际包含 4 个输入序列4 个选项但标签只有一个整数下标。Transformers 自带的数据整理器无法直接处理这种一标签对多序列的结构因此脚本在 run_swag.py 中实现了DataCollatorForMultipleChoice其工作流程是从每个 feature 中弹出label兼容labels命名把(batch_size, num_choices)的特征扁平化为batch_size * num_choices个单序列调用tokenizer.pad()统一填充支持三种填充策略True/longest动态填充到批内最长、max_length按最大长度、False不填充以及pad_to_multiple_of参数将序列对齐到某值的整数倍用tf.reshape(v, (batch_size, num_choices, -1))还原 3D 形状使模型能以(batch, choices, tokens)的维度接收输入重新附上tf.int64类型的labels。其中pad_to_multiple_of的实战价值在于将序列长度对齐为 8 的倍数可满足 NVIDIA Volta 及更新架构算力 ≥ 7.5上 Tensor Core 的 GEMM 对齐要求显著提升 GPU 利用率。脚本对两种填充路径做了分流见 run_swag.pypad_to_max_lengthTrue时使用DefaultDataCollator固定长度适合 TPU否则使用上述自定义 collator动态填充GPU 更高效但对 TPU 非常不友好。五、模型构建、优化器与训练执行5.1 TFAutoModelForMultipleChoice 与支持的模型家族脚本通过TFAutoModelForMultipleChoice.from_pretrained(...)按model_name_or_path自动加载对应架构的多选头模型见 run_swag.py。从 modeling_tf_auto.py 的映射表可以确认该 Auto 类当前覆盖 17 个模型家族ALBERT、BERT、CamemBERT、ConvBERT、DistilBERT、ELECTRA、FlauBERT、Funnel、Longformer、MobileBERT、MPNet、RemBERT、RoBERTa、RoFormer、XLM、XLM-RoBERTa、XLNet。也就是说把--model_name_or_path换成这些家族中任意一个 Hub 标识或本地路径脚本即可直接微调。5.2 分布式策略与批大小核算在进入训练前脚本把所有模型构建放在training_args.strategy.scope()上下文内。默认策略是MirroredStrategy只要机器上有多个 GPU 就会被自动利用这是 README 中多 GPU 有效使用承诺的实现基础。--tpu参数则用于指定 TPU 资源名将策略切换为 TPU 策略。总批大小按副本数放大见 run_swag.pynum_replicas training_args.strategy.num_replicas_in_sync total_train_batch_size training_args.per_device_train_batch_size * num_replicas total_eval_batch_size training_args.per_device_eval_batch_size * num_replicas即配置中的per_device_*是单设备批大小实际送入model.fit的批大小会自动乘以设备数。5.3 优化器与学习率调度训练步数与优化器均由create_optimizer统一创建见 run_swag.pynum_train_steps (len(train_dataset) // total_train_batch_size) * int(training_args.num_train_epochs)num_warmup_steps的优先级为warmup_steps 0时直接采用否则若warmup_ratio 0按总步数比例折算两者都未配置则为 0。优化器为 AdamW融合了weight_decay_rate与adam_global_clipnorm梯度全局裁剪。模型随后执行model.compile(optimizeroptimizer, metrics[accuracy], jit_compiletraining_args.xla)jit_compiletraining_args.xla意味着传入--xla即可启用 XLA 编译加速。5.4 tf.data 管线prepare_tf_dataset 的正确打开方式训练与评估数据通过model.prepare_tf_dataset()封装见 run_swag.py。从底层实现 modeling_tf_utils.py 看该方法会把datasets.Dataset包装为可直接送入 Kerasfit()/evaluate()的tf.data.Dataset并自动完成三件事根据模型call签名推断输入列名、按标签名识别label/labels列、剔除与模型无关的多余列。因此它是官方推荐的接入方式若需完全掌控列名映射才降级使用dataset.to_tf_dataset()手写细节。脚本还在数据集上设置了tf.data.Options()把experimental_distribute.auto_shard_policy显式置为AutoShardPolicy.OFF见 run_swag.py避免多副本自动分片带来的数据重复/丢失问题。评估数据集额外传了drop_remainderTrue保证每批形状完整。训练本体即一次标准的 Keras 调用history model.fit( tf_train_dataset, validation_datavalidation_data, epochsint(training_args.num_train_epochs), callbackscallbacks, )callbacks中仅在--push_to_hub开启时包含PushToHubCallback默认模型 ID 形如{model_name}-finetuned-multiplechoice。5.5 检查点自动恢复脚本启动时会检查输出目录见 run_swag.py若目录中同时存在CONFIG_NAMEconfig.json与TF2_WEIGHTS_NAMETF 权重文件则判定为已有检查点自动从该目录恢复训练并打印提示日志若目录非空但缺少上述两个文件直接抛出ValueError提示改用--overwrite_output_dir或更换--output_dir。这一机制让中断后的续训变得安全且显式。六、评估、结果落盘与模型保存评估支持两种路径训练中评估do_train与do_eval同时开启时model.fit的validation_data负责产出每个 epoch 的验证指标最后取history.history各指标末位值作为eval_metrics见 run_swag.py独立评估仅do_eval时单独构建评估数据集执行model.evaluate(tf_eval_dataset)得到{val_loss: ..., val_accuracy: ...}见 run_swag.py。无论哪种路径指标最终都以 JSON 形式写入{output_dir}/all_results.json见 run_swag.py方便后续程序化读取。未开启--push_to_hub时训练/评估结束后调用model.save_pretrained(training_args.output_dir)在本地保存完整模型见 run_swag.py。七、实战从示例命令到自定义任务README 给出的最小示例命令为python run_swag.py \ --model_name_or_path distilbert-base-cased \ --output_dir output \ --do_eval \ --do_train结合前文参数体系一个面向实际训练、覆盖关键超参与 TPU 场景的完整命令可以是python run_swag.py \ --model_name_or_path bert-base-uncased \ --output_dir output_swag \ --do_train \ --do_eval \ --per_device_train_batch_size 32 \ --per_device_eval_batch_size 64 \ --num_train_epochs 3 \ --learning_rate 5e-5 \ --warmup_ratio 0.1 \ --weight_decay 0.01 \ --max_grad_norm 1.0 \ --max_seq_length 128 \ --seed 42多 GPU 环境无需额外配置MirroredStrategy自动生效TPU 环境追加--tpu TPU_RESOURCE_NAME同时建议开启--pad_to_max_length固定长度填充更契合 TPU 的数据管线约束本地自定义数据集csv/json只需追加--train_file train.csv --validation_file valid.csv并同步修改 run_swag.py 中的列名约定调试阶段用--max_train_samples 100 --max_eval_samples 100快速验证管线正式训练前再移除。关于内存的注意事项同样来自 README 的明确提示脚本会将全部数据一次性载入内存。绝大多数多选数据集规模较小这不成问题但若数据集非常大则必须改造脚本引入数据流式streaming加载——尤其是 TPU 场景其对数据供给速率的要求更高全量驻留内存的做法难以满足持续供数需求。八、小结与仓库定位本文完整拆解了run_swag.py从参数解析、数据预处理、自定义 collator、分布式训练到评估落盘的全链路核心要点包括三类 dataclass 参数体系、SWAG 的 4 选项展平/还原预处理、DataCollatorForMultipleChoice的动态填充与 3D 形状还原、prepare_tf_dataset的自动列推断以及MirroredStrategy/TPU 策略下的批大小核算。将该脚本换一个model_name_or_path、改一处列名约定即可覆盖绝大多数基于预训练语言模型的多选问答微调场景。需要提醒的是本目录位于仓库的 benchmark/third_party/transformers 第三方基准模块中其定位是作为独立的模型训练/推理基线与本仓库 FlexGen 核心的吞吐优化引擎并无代码耦合。若你在研究 FlexGen 的基准对比可进一步阅读 benchmark/README.md 与 benchmark/hf_ds/README.md理解第三方模型基线与 FlexGen 评测套件的组织关系。赞分享推理引擎大模型【免费下载链接】FlexGenRunning large language models on a single GPU for throughput-oriented scenarios.项目地址https://gitcode.com/gh_mirrors/fl/FlexGen点击查看免费下载相关推荐FlexGen 仓库中的 TensorFlow 问答微调实战基于 Transformers run_qa.py 训练与评估 SQuADFlexGen 仓库中的 TensorFlow 问答微调实战基于 Transformers run_qa.py 训练与评估 SQuAD 导读本仓库Flex推理引擎大模型OpCore Simplify自动生成 OpenCore EFI 的黑苹果引导配置指南OpCore Simplify自动生成 OpenCore EFI 的黑苹果引导配置指南 手动跟过 OpenCoremacOS 的开源引导加载器安装文档的人开发工具CLI用 RoBERTa 微调 Commonsense QA基于 Fairseq 的多选问答实战指南用 RoBERTa 微调 Commonsense QA基于 Fairseq 的多选问答实战指南 本文围绕 infoxlm/fairseq/examples/r人工智能大模型预训练深度学习NLP计算机视觉多模态语音音频微调上一篇Binwalk终极升级指南7步完成版本迁移与兼容性处理下一篇iOS骨架屏终极指南SkeletonView集成CocoaPods与SPM完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表