ARTICLE DETAIL

资讯详情

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

使用 Hugging Face Transformers 在 PyTorch 中训练语言模型:CLM / MLM / PLM 实战指南(基于 FlexGen 仓库)

使用 Hugging Face Transformers 在 PyTorch 中训练语言模型:CLM / MLM / PLM 实战指南(基于 FlexGen 仓库) 推理引擎大模型【免费下载链接】FlexGenRunning large language models on a single GPU for throughput-oriented scenarios.项目地址https://gitcode.com/gh_mirrors/fl/FlexGen点击查看免费下载导读本指南围绕 FlexGen 仓库benchmark/third_party/transformers中附带的一套完整 PyTorch 语言建模示例展开讲解如何用因果语言建模CLM、掩码语言建模MLM和置换语言建模PLM三种训练目标对 GPT-2、RoBERTa、XLNet 等模型进行微调或从零训练。读者将掌握基于 Trainer API 与基于 Accelerate 自定义训练循环no_trainer系列两套脚本的完整用法、核心命令行参数、自有文本数据集接入方法以及模型在线生成--config_overrides的配置技巧。概述三套训练目标与六份脚本训练目标与适用模型语言建模是预训练/微调 Transformer 语言模型的核心任务不同架构使用不同的建模目标因果语言建模CLMGPT、GPT-2 等自回归模型使用。模型只能看到当前 token 之前的上下文按顺序逐个预测下一个 token。掩码语言建模MLMBERT、ALBERT、DistilBERT、RoBERTa 等双向模型使用。随机掩蔽输入中的部分 token让模型根据左右两侧上下文进行预测与预训练阶段的目标一致。置换语言建模PLMXLNet 使用。通过最大化输入序列所有排列因式分解顺序下的期望似然以自回归方式学习双向上下文。两套脚本体系示例目录 language-modeling 下共提供六份脚本分为两组脚本训练目标训练循环依赖run_clm.pyCLMTrainer APItransformers、datasets、evaluaterun_clm_no_trainer.pyCLM自定义循环 Accelerate同上 acceleraterun_mlm.pyMLMTrainer API同上run_mlm_no_trainer.pyMLM自定义循环 Accelerate同上run_plm.pyPLMXLNetTrainer API同上Trainer系列脚本封装了训练/评估的绝大部分细节适合快速起步no_trainer系列使用 Accelerate 库提供的自定义训练循环适合需要精细控制训练过程的场景。两组脚本都基于 Datasets 库加载数据可方便地根据需求扩展数据集预处理逻辑。需要指出旧版run_language_modeling.py已迁移至examples/legacy目录本仓库中对应 legacy/run_language_modeling.py。所有脚本均在文件头部通过check_min_version(4.24.0)校验 transformers 最低版本并通过require_version(datasets1.8.0, ...)校验 datasets 版本依赖清单见 requirements.txt含accelerate、torch 1.3、datasets 1.8.0、sentencepiece ! 0.1.92、protobuf、evaluate。GPT-2 / GPT 的因果语言建模CLM微调使用 Hub 数据集微调以下命令在 WikiText-2 上微调 GPT-2直接使用原始 WikiText-2tokenization 之前未做任何 token 替换训练目标为因果语言建模python run_clm.py \ --model_name_or_path gpt2 \ --dataset_name wikitext \ --dataset_config_name wikitext-2-raw-v1 \ --per_device_train_batch_size 8 \ --per_device_eval_batch_size 8 \ --do_train \ --do_eval \ --output_dir /tmp/test-clm据文档描述该命令在单张 K80 GPU 上训练约半小时评估约一分钟微调后困惑度perplexity约为 20。使用自有文本文件微调若希望在自己的训练/验证文件上运行改为通过--train_file与--validation_file指定路径python run_clm.py \ --model_name_or_path gpt2 \ --train_file path_to_train_file \ --validation_file path_to_validation_file \ --per_device_train_batch_size 8 \ --per_device_eval_batch_size 8 \ --do_train \ --do_eval \ --output_dir /tmp/test-clm使用自定义训练循环Accelerate若想使用自定义训练循环可基于run_clm_no_trainer.py调整。以 WikiText-2 为例python run_clm_no_trainer.py \ --dataset_name wikitext \ --dataset_config_name wikitext-2-raw-v1 \ --model_name_or_path gpt2 \ --output_dir /tmp/test-clmno_trainer脚本通过argparse提供了丰富的可调参数从源码 run_clm_no_trainer.py 可以看到其默认值与作用参数默认值说明--per_device_train_batch_size/--per_device_eval_batch_size8单设备训练/评估批次大小--learning_rate5e-5初始学习率warmup 之后生效--weight_decay0.0权重衰减--num_train_epochs3训练轮数--max_train_steps存在时优先于轮数--gradient_accumulation_steps1梯度累积步数--lr_scheduler_typelinear调度器类型可选 linear / cosine / cosine_with_restarts / polynomial / constant / constant_with_warmup--num_warmup_steps0学习率 warmup 步数--block_sizeNonetokenization 后的序列长度默认取模型最大输入长度超过 1024 时自动回退到 1024--validation_split_percentage5无验证集时从训练集划分出的验证比例--preprocessing_num_workersNone预处理使用的进程数--checkpointing_stepsNone每 N 步或每 epoch 保存状态--resume_from_checkpointNone从 checkpoint 目录继续训练--with_tracking/--report_to/ all实验日志跟踪支持 tensorboard、wandb、comet_ml--push_to_hub/--hub_model_id/--hub_token/训练完成后将模型推送到 Hub数据预处理与分组源码解析run_clm.py的数据流水线值得关注它决定了自有数据的处理方式核心逻辑位于 run_clm.py 的main()中数据加载通过load_dataset加载 Hub 数据集或本地文件txt/csv/json若数据集中没有validation划分则按validation_split_percentage默认 5%从训练集中切分。对于 CSV/JSON 文件脚本优先使用名为text的列否则使用第一列。tokenization对text列执行批量 tokenize长文本超过block_size会被切块脚本会捕获并提示long input will be chunked into smaller bits。分组group_texts将所有文本拼接chain(*examples[k])后按block_size切成等长块尾部不足一块的余数被丢弃。labels直接复制input_ids因果 LM 内部通过移位完成预测。块长回退block_size未指定时取tokenizer.model_max_length若大于 1024 则回退到 1024并提示可通过--block_size覆盖。评估阶段通过preprocess_logits_for_metrics对 logits 取argmax再计算 accuracy并在eval_loss基础上用math.exp换算困惑度溢出时记为inf。RoBERTa / BERT / DistilBERT 的掩码语言建模MLM微调使用 Hub 数据集微调以下命令在 WikiText-2 上微调 RoBERTa。由于 BERT/RoBERTa 具备双向机制此处使用与预训练一致的掩码语言建模损失python run_mlm.py \ --model_name_or_path roberta-base \ --dataset_name wikitext \ --dataset_config_name wikitext-2-raw-v1 \ --per_device_train_batch_size 8 \ --per_device_eval_batch_size 8 \ --do_train \ --do_eval \ --output_dir /tmp/test-mlm依据 RoBERTa 论文脚本默认采用动态掩码而非静态掩码——掩码位置在每次训练时动态生成。动态掩码会使模型收敛略慢过拟合需要更多 epoch但泛化更稳健。使用自有文本文件微调python run_mlm.py \ --model_name_or_path roberta-base \ --train_file path_to_train_file \ --validation_file path_to_validation_file \ --per_device_train_batch_size 8 \ --per_device_eval_batch_size 8 \ --do_train \ --do_eval \ --output_dir /tmp/test-mlm如果数据集按每行一个样本组织可加--line_by_line标志否则脚本会将所有文本拼接后按等长块切分。使用自定义训练循环python run_mlm_no_trainer.py \ --dataset_name wikitext \ --dataset_config_name wikitext-2-raw-v1 \ --model_name_or_path roberta-base \ --output_dir /tmp/test-mlmMLM 关键参数与掩码实现源码解析run_mlm.py中定义的数据参数见 run_mlm.py参数默认值说明--mlm_probability0.15掩码语言建模损失中被掩蔽 token 的比例--line_by_lineFalse是否将数据集中的每一行视为独立序列--pad_to_max_lengthFalse是否将所有样本 pad 到max_seq_lengthFalse 时按 batch 内最大长度动态 padding--max_seq_lengthNonetokenization 后最大序列长度超长截断--overwrite_cacheFalse覆盖缓存的训练/评估数据集--validation_split_percentage5无验证集时的训练集划分比例预处理上MLM 与 CLM 的重要区别在于当--line_by_line为 False 时同样执行拼接 按max_seq_length切块的group_texts逻辑掩码操作由DataCollatorForLanguageModeling在训练时动态完成脚本注释明确指出使用该 collator 比在预处理阶段静态掩码更高效因为动态掩码每个 epoch 生成不同的掩码模式预处理阶段仅生成input_ids与special_tokens_maskreturn_special_tokens_maskTrue将掩码责任交给 collator。TPU 提示在 TPU 上应同时使用--pad_to_max_length与--line_by_line确保所有 batch 长度一致。XLNet 的置换语言建模PLM微调XLNet 的训练目标不同于前两者——置换语言建模Permutation Language Modeling。它是一种自回归方法通过最大化输入序列因式分解顺序的所有排列下的期望似然来学习双向上下文。两个专属参数--plm_probability定义掩蔽 token 跨度长度与周围上下文长度的比例默认1/6。文档中指出该参数用于定义掩蔽 token 跨度长度与周围上下文长度的比例。--max_span_length限制掩蔽 token 跨度的最大长度默认 5。使用 Hub 数据集微调 XLNetpython run_plm.py \ --model_name_or_pathxlnet-base-cased \ --dataset_name wikitext \ --dataset_config_name wikitext-2-raw-v1 \ --per_device_train_batch_size 8 \ --per_device_eval_batch_size 8 \ --do_train \ --do_eval \ --output_dir /tmp/test-plm使用自有文本文件微调python run_plm.py \ --model_name_or_pathxlnet-base-cased \ --train_file path_to_train_file \ --validation_file path_to_validation_file \ --per_device_train_batch_size 8 \ --per_device_eval_batch_size 8 \ --do_train \ --do_eval \ --output_dir /tmp/test-plm同样支持--line_by_line每行一个样本与 TPU 上的--pad_to_max_length组合用法。PLM 数据与掩码实现源码解析在 run_plm.py 中--max_seq_length默认值为512超出 tokenizer 最大长度时会警告并回退--plm_probability默认1/6--max_span_length默认 5掩码由DataCollatorForPermutationLanguageModeling完成构造时传入tokenizer、plm_probability与max_span_length对应源码 479-483 行无验证集时同样按validation_split_percentage默认 5%切分评估困惑度同样由eval_loss经math.exp换算。从零创建模型使用 --config_overrides当训练一个从零开始的模型不加载预训练权重时可以用--config_overrides覆盖配置默认值。例如用 GPT-2 结构从零训练一个更大/更小的模型python run_clm.py --model_type gpt2 --tokenizer_name gpt2 \ --config_overridesn_embd1024,n_head16,n_layer48,n_positions102 \ [...]该特性仅在run_clm.py、run_plm.py和run_mlm.py中可用no_trainer版本不支持。从零训练的源码机制结合源码看从零训练的关键分支如下以run_clm.py为例若未指定--model_name_or_path与--config_name则通过CONFIG_MAPPING[model_args.model_type]()实例化一个全新的配置对象并调用config.update_from_string(model_args.config_overrides)应用覆盖项模型通过AutoModelForCausalLM.from_config(config)创建脚本会打印参数量Training new model from scratch - Total size...M params重要约束--config_overrides不能与--config_name或--model_name_or_path同时使用ModelArguments.__post_init__中会直接抛出ValueError阻止这种非法组合tokenizer 无法从零实例化必须通过--tokenizer_name指定已有的 tokenizer脚本会明确报错提示从零训练后通过model.resize_token_embeddings(len(tokenizer))对齐词表大小。run_plm.py中的从零分支则固定使用XLNetConfig()XLNetLMHeadModel(config)run_mlm.py使用AutoModelForMaskedLM.from_config(config)。通用运行与工程实践输出目录与断点续训Trainer 系列脚本在启动时会检测--output_dir若目录已存在且非空、且未加--overwrite_output_dir会通过get_last_checkpoint查找最后一个 checkpoint 并自动从中恢复训练日志打印Checkpoint detected, resuming training at ...若目录存在但无 checkpoint 且非空则直接报错要求使用--overwrite_output_dir。no_trainer系列则通过--resume_from_checkpoint显式指定恢复目录配合--checkpointing_steps定期保存状态。模型卡片与 Hub 推送训练/评估完成后脚本默认调用trainer.create_model_card(**kwargs)生成模型卡片kwargs中自动携带finetuned_from、tasks、dataset_tags等元数据若指定--push_to_hub则改为trainer.push_to_hub(**kwargs)将模型推送到 Hub。在 FlexGen 仓库中的定位该目录位于 FlexGen 仓库的benchmark/third_party/transformers下属于随附的第三方基线工具集用于与 FlexGen 自身的吞吐导向推理方案做对照评估。文中的脚本与参数均以当前仓库内实际代码为准运行前需按 requirements.txt 安装依赖并确保 transformers 4.24.0、datasets 1.8.0。同一 PyTorch 示例集合还包含问答、文本分类、文本生成、翻译等任务可在 examples/pytorch 总览中查看。赞分享推理引擎大模型【免费下载链接】FlexGenRunning large language models on a single GPU for throughput-oriented scenarios.项目地址https://gitcode.com/gh_mirrors/fl/FlexGen点击查看免费下载相关推荐FlexGen 基准测试仓库中的 Hugging Face Transformers预训练模型加载、pipeline 推理与多框架实践指南FlexGen 基准测试仓库中的 Hugging Face Transformers预训练模型加载、pipeline 推理与多框架实践指南 本篇技术指南以当前推理引擎大模型在 Hugging Face Transformers 中使用 PhoBERT越南语预训练语言模型与词级 BPE 分词实践指南在 Hugging Face Transformers 中使用 PhoBERT越南语预训练语言模型与词级 BPE 分词实践指南 PhoBERT 是由 VinA人工智能深度学习机器学习预训练微调NLP计算机视觉语音多模态在 Fairseq 中训练跨语言语言模型XLM基于 cross_lingual_lm 任务的 MLM 预训练完整指南在 Fairseq 中训练跨语言语言模型XLM基于 cross_lingual_lm 任务的 MLM 预训练完整指南 本篇技术指南聚焦 Facebook人工智能深度学习预训练NLP语音上一篇【免费下载】 i2C的时钟延展问题解析下一篇【亲测免费】 开源项目 ViGEmBus 亮点深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表