尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

DeepSpeed 课程学习(Curriculum Learning)实战指南:以序列长度驱动的稳定高效大规模 GPT 预训练

DeepSpeed 课程学习(Curriculum Learning)实战指南:以序列长度驱动的稳定高效大规模 GPT 预训练 DeepSpeed 课程学习Curriculum Learning实战指南以序列长度驱动的稳定高效大规模 GPT 预训练【免费下载链接】DeepSpeedDeepSpeed is a deep learning optimization library that makes distributed training and inference easy, efficient, and effective.项目地址: https://gitcode.com/GitHub_Trending/de/DeepSpeed本篇教程围绕 DeepSpeed 早期推出的基于数据管线的课程学习Curriculum Learning特性展开介绍如何通过先易后难的样本呈现策略在以 Megatron-LM GPT-2 为代表的大规模预训练任务中换取更大的 batch size / 学习率训练稳定性与吞吐收益。读完本文你将掌握curriculum_learning配置块的完整字段语义、fixed_linear/fixed_root/fixed_discrete三种难度调度策略的取舍、以及为启用seqlen截断所需配合的训练脚本改动禁用 batch size warmup、token 化训练终止与 LR 衰减等。为什么需要课程学习稳定训练与加速的入口在超大规模 GPT 模型预训练中工程师常希望通过放大 batch size 与学习率来缩短训练时间但直接放大往往导致训练发散divergence。DeepSpeed 的课程学习数据管线给出的思路是把更容易/更简单的样本放在训练早期让模型在初期接触更规则的信号从而允许训练以更大 batch size其测试中约 8 倍与更大学习率约 4 倍稳定推进而基线配置在此区间已经发散。基于序列长度seqlen度量的课程学习在 GPT-2 预训练117M 与 1.5B 参数规模上获得约 3.3 倍的加速同时带来更好的 token 级收敛速度与 WikiText-103 / LAMBADA zero-shot 评测结果。由于课程学习只作用于数据管线其收益天然可以与其他 DeepSpeed 优化手段叠加使用例如与 ZeRO Redundancy Optimizer、ZeRO-Offload、3D 并行流水线并行 同时开启。版本注意本特性属于 DeepSpeed 于 2022 年 12 月发布 Data Efficiency Library 之前的遗留legacy课程学习实现。该遗留能力依然受支持但官方推荐改用功能更通用、以data_efficiency配置块组织的数据效率库其教程见 Data Efficiency 教程。1. 配置方法与核心参数课程学习只需在 DeepSpeed 配置文件中设置curriculum_learning键。以下是针对 Megatron-LM GPT-2 预训练的一份完整配置示例{ train_batch_size: 4096, gradient_accumulation_steps: 1, steps_per_print: 1, optimizer: { type: Adam, params: { lr: 0.00015, max_grad_norm: 1.0, betas: [0.9, 0.95] } }, gradient_clipping: 1.0, fp16: { enabled: true, loss_scale: 0, loss_scale_window: 1000, hysteresis: 2, consecutive_hysteresis: false, min_loss_scale: 1 }, curriculum_learning: { enabled: true, curriculum_type: seqlen, min_difficulty: 8, max_difficulty: 1024, schedule_type: fixed_linear, schedule_config: { total_curriculum_step: 15000, difficulty_step: 8 } } }对照 data_pipeline 配置常量定义 与 参数解析实现上述新增参数的含义如下curriculum_type课程难度度量类型目前支持seqlen即在训练早期呈现更短的序列。该类型的实现方式是在真正的前向传播之前对训练数据序列进行截断truncation截断逻辑与注入点详见下文第 4、5 节。min_difficulty起始难度。对seqlen度量即初始序列长度。一般而言更低的min_difficulty带来更好的稳定性/收敛速度但有两个注意点其一某些情况尤其大模型下起点过小可能造成严重过拟合例如训练 loss 发散或验证困惑度剧烈波动而伤害收敛其二建议把min_difficulty设为 8FP16 数据或 16INT8 数据的倍数以启用 NVIDIA GPU 的 Tensor Core 加速。调参建议从 8百万级模型或 64十亿级模型起步若在训练初期观察到发散或验证困惑度波动则调大该值。max_difficulty结束难度。对seqlen度量应设为完整序列长度例如 Megatron-LM GPT-2 预训练取 1024。schedule_type难度调度策略即某个训练步应该使用哪个难度级别。支持fixed_linear、fixed_root、fixed_discrete三种官方推荐优先尝试易于调参且稳定性/效率收益良好的fixed_linear。每种调度拥有各自的schedule_config。从配置解析的角度看enabled被置为true是整套特性的总开关启用后CurriculumScheduler构造时会强制校验min_difficulty、max_difficulty、schedule_type等键存在缺失即断言报错再依据schedule_type校验对应的schedule_config子键。1.1 fixed_linear 调度schedule_type: fixed_linear, schedule_config: { total_curriculum_step: 15000, difficulty_step: 8 }total_curriculum_step课程学习的总步数难度在 [min_difficulty, max_difficulty] 区间内随这若干步线性递增。该值必须针对每个训练任务单独调优过小则课程学习来不及提供足够稳定性、训练仍可能发散过大则模型在较简单数据上停留太久造成过拟合而伤害最终收敛。官方建议采用二分搜索找到在最初若干倍 LR warmup 步内不出现显著验证困惑度波动的最大total_curriculum_step其背后原理见原论文附录 A.1。difficulty_step保证任意时刻的难度都是该值的倍数。更小的值曲线更平滑、稳定性更好通常设为 8FP16或 16INT8以兼容 Tensor Core若与硬件无关可设为 1。1.2 fixed_root 调度schedule_type: fixed_root, schedule_config: { total_curriculum_step: 15000, difficulty_step: 8, root_degree: 2 }total_curriculum_step与difficulty_step含义同上。新增的root_degree决定开根度数2 为平方根、3 为立方根。某一步的难度由下式决定difficulty(step) ((current_step / total_curriculum_step) ** (1/root_degree)) * (max_difficulty - min_difficulty) min_difficulty因此root_degree 1时fixed_root退化为fixed_linear。依据原文档的有限研究结论fixed_root相对fixed_linear并无明显优势却多出一个参数通常不优先选用。1.3 fixed_discrete 调度schedule_type: fixed_discrete, schedule_config: { difficulty: [1,2,3], max_step: [5,10] }difficulty调度中依次使用的难度级别列表。max_step切换到下一难度的时间戳列表。上例含义为第 15 步用难度 1第 610 步用难度 2第 11 步起用难度 3。该调度最灵活但存在风险若模型在某一难度停留过久可能因严重过拟合而在切换到下一难度时发生训练发散。2. 源码剖析CurriculumScheduler 与难度注入课程学习的调度大脑是 curriculum_scheduler.py 中的CurriculumScheduler类。调度相关的关键状态与行为可以在源码中一一对上号状态维护构造时保存min_difficulty、max_difficulty、schedule_type并把当前难度current_difficulty初始化为min_difficulty。调度曲线实际生效的前提是update_difficulty(global_steps)仅在current_difficulty max_difficulty时推进达到max_difficulty后难度封顶不再变化。fixed_discrete的边界约定源码断言max_step必须比difficulty恰好少一个元素——最后一个难度用于 max_step 覆盖范围之后的所有步。fixed_linear即root_degree1的fixed_rootget_difficulty对两种调度都分发到同一个__fixed_root_get_difficulty线性调度传入固定的根度 1每次计算会先套用上节公式再向下对齐到difficulty_step的倍数最后夹取到[min_difficulty, max_difficulty]区间。对齐保底逻辑向下取整到difficulty_step倍数可能让首步难度跌破配置的min_difficulty例如文档推荐的min_difficulty8配difficulty_step16时首步会被算成 0对seqlen即零长度序列。当前源码会把下限抬升为不小于min_difficulty的第一个difficulty_step倍数从而同时满足不低于起点与是步长倍数两条契约。难度值随后在训练循环中被引擎消费。在 runtime/engine.py 的前向入口处可以看到if self.module.training and self.curriculum_enabled_legacy(): self.curriculum_scheduler_legacy.update_difficulty(self.global_steps 1) if self.curriculum_params_legacy()[curriculum_type] seqlen: kwargs.update({curriculum_seqlen: self.curriculum_scheduler_legacy.get_current_difficulty()})即引擎在每个训练步前推进调度器并把当前seqlen通过名为curriculum_seqlen的关键字参数注入模型的 forward 调用模型据此截断训练数据序列后再做真正的前向计算。而紧邻其上的注释也解释了工程上的一个边界——PipelineEngine 因架构限制难以在 forward 中注入该参数故流水线并行场景需要在用户侧另行处理见下文第 4 节。3. 调度器正确性的测试保障课程学习调度器的边界行为并非孤证仓库中 tests/unit/runtime/test_data_efficiency.py 提供了直接验证可作为读者自行扩展自定义调度时的参考范式test_curriculum_never_starts_below_min_difficulty参数化覆盖fixed_linear/fixed_root与(min_difficulty, difficulty_step)的多种组合如(8,16)、(1,8)、(10,8)、(64,16)等断言调度产生的全部难度都落在[min_difficulty, max_difficulty]且均被difficulty_step整除test_curriculum_first_difficulty_is_the_aligned_min验证min_difficulty8、difficulty_step16时首个难度是向上对齐后的 16而已是步长倍数的min_difficulty如 64原样使用test_curriculum_tops_out_at_the_configured_max验证即使max_difficulty不是步长倍数封顶值仍精确等于配置上限例如(16, 1000, 16)下封顶为 1000。4. Megatron-LM GPT-2 预训练中的课程学习实践为演示完整接入流程官方以 Megatron-LM GPT-2 预训练为例任务本身细节见 Megatron-LM GPT2 教程。需要说明的是示例代码托管在独立的 Megatron-DeepSpeed / DeepSpeedExamples 仓库中不在本仓库内。截至 2021-10-29 的教程更新共存在两个基于不同 Megatron-LM fork 的课程学习示例各有取舍新式 Megatron fork 集成Megatron-DeepSpeed的examples_deepspeed/curriculum_learning目录基于较新的 Megatron-LM fork是唯一支持流水线并行的课程学习示例但截至教程更新时尚未在该 fork 上验证 ZeRO-2 与 ZeRO-3。若模型不需要 ZeRO-2/3官方强烈推荐采用此示例。旧式 Megatron-LM 硬拷贝集成DeepSpeedExamples的Megatron-LM-v1.1.5-ZeRO3/curriculum_learning目录基于将被弃用的旧版 Megatron-LM 硬拷贝不支持流水线并行仅当模型需要 ZeRO-2/3 时才建议使用。除第 1 节的 DeepSpeed JSON 配置外用户侧还必须在训练脚本与模型代码中完成以下配套改动。4.1 训练数据截断seqlen 注入启用seqlen课程学习的核心是按当前课程序列长度截断训练数据无流水线并行在模型 forward 中新增curriculum_seqlen参数并用其截断数据。对 Megatron-LM GPT-2截断分别落在megatron/model/gpt2_model.py的forward()与pretrain_gpt2.py的forward_step()。这正是引擎在上一节展示的kwargs.update({curriculum_seqlen: ...})所对接的调用约定。有流水线并行受 DeepSpeed 引擎PipelineEngine限制无法在 forward 注入curriculum_seqlen需要在用户侧复制一份deepspeed.runtime.data_pipeline.curriculum_scheduler的调度器实例自行取出curriculum_seqlen实现位于 Megatron fork 的megatron/training.py。4.2 关闭 batch size warmup去掉--rampup-batch-size原论文第 5.4 节的实验表明seqlen课程学习相比 OpenAI GPT-3 引入的 batch size warmup 技术能提供显著更好的训练稳定性。两者都会减少每个 batch 内的 token 数因此启用课程学习时应从训练脚本中移除--rampup-batch-size不建议二者并用。同时可考虑加大 micro batch size——没有了 batch size warmup全局 batch size 现在是固定的。4.3 基于 token 的训练终止--train-tokens由于课程学习不断改变每条样本的序列长度用步数/样本数精确在目标 token 数处终止训练几乎不可能。为此引入--train-tokens做精确的 token 级终止。建议把原来的--train-samples或--train-iters放大到足够大例如基线值的 3 倍并让--train-tokens精确等于期望的训练 token 总数由后者承担真正的中止判定。4.4 基于 token 的 LR 衰减--lr-decay-tokens课程学习同样改变每个 batch 的 token 数原论文附录 A.2 论证了原因按步数衰减 LR 会导致衰减过快因此需把 LR 衰减改为 token 驱动即新增--lr-decay-tokens若此前使用--lr-decay-samples将原值乘以完整seqlenGPT-2 约 1K、GPT-3 约 2K即为--lr-decay-tokens若此前使用--lr-decay-iters将原值乘以完整seqlen与全局 batch size 即为--lr-decay-tokens。随后在脚本中把--lr-decay-samples/--lr-decay-iters替换为--lr-decay-tokens。4.5 LR warmup 调整LR warmup不改为 token 驱动课程学习场景下做 token 化 warmup 会不必要且有弊地拖慢 LR 上升。但由于不再使用--rampup-batch-size每个 batch 的样本数在训练初期与基线不同仍可能需要调整--lr-warmup-samples或--lr-warmup-iters。若希望用 X 个 token 完成 warmupOpenAI GPT-3 约为 375M tokens则课程学习场景下应设--lr-warmup-samples X / min_difficulty或--lr-warmup-iters X / (min_difficulty * --global-batch-size)。这是基于课程学习从min_difficulty长度起步、且在 LR warmup 期间难度变化不大的粗略估算。5. 使用边界与调优小结综合源码与官方文档使用本特性时有几点值得注意定位是遗留能力当前仓库在配置解析上区分了两套体系——教程所讲的顶层curriculum_learning块curriculum_type/schedule_type一族被标记为 legacy 配置而新版 Data Efficiency 库把课程学习收纳到data_efficiency.data_sampling.curriculum_learning下并使用curriculum_metrics等更通用的度量接口见 config.py。新项目建议先看 Data Efficiency 教程。收益与风险并存total_curriculum_step过小导致不稳定、过大导致过拟合fixed_discrete在同一难度停留过久会在切换难度时发散min_difficulty起点过低也可能造成早期过拟合——这些都需要针对任务做实证调参。与系统级优化的兼容性课程学习只改动数据呈现顺序与序列长度不影响优化器状态与并行策略因此可与 ZeRO、ZeRO-Offload、流水线并行 正交叠加若读者需要理解其在十亿级模型上的完整理论动机与消融实验包括 batch size warmup 对比、token 化 LR 衰减必要性、A.1/A.2 节调参原理可参阅原论文《Curriculum Learning: A Regularization Method for Efficient and Stable Billion-Scale GPT Model Pre-Training》。接入路径可以概括为一句话在 DeepSpeed 配置中声明curriculum_learning块并选定调度策略在模型 forward 中实现按curriculum_seqlen的数据截断或流水线场景下自建调度器副本同时把训练终止、LR 衰减与 warmup 的计数单位从样本/步迁移到与课程长度相匹配的 token 口径。【免费下载链接】DeepSpeedDeepSpeed is a deep learning optimization library that makes distributed training and inference easy, efficient, and effective.项目地址: https://gitcode.com/GitHub_Trending/de/DeepSpeed创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表