ARTICLE DETAIL

资讯详情

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

Apex Fused Optimizers 全面指南:FusedAdam、FusedLAMB、FusedNovoGrad 与 FusedSGD 的融合原理与实战用法

Apex Fused Optimizers 全面指南:FusedAdam、FusedLAMB、FusedNovoGrad 与 FusedSGD 的融合原理与实战用法 人工智能深度学习分布式训练模型优化【免费下载链接】apexA PyTorch Extension: Tools for easy mixed precision and distributed training in Pytorch项目地址https://gitcode.com/gh_mirrors/ap/apex点击查看免费下载ApexA PyTorch Extension为 PyTorch 提供了面向混合精度与分布式训练的高性能工具集其中apex.optimizers模块下的 Fused 系列优化器是其在训练加速方面的核心组件。本文以官方 API 文档 docs/source/optimizers.rst 为骨架结合apex/optimizers/目录下的完整源码实现系统讲解 FusedAdam、FusedLAMB、FusedNovoGrad、FusedSGD 等融合优化器的算法原理、全部参数语义、与 Amp 的配合方式及底层多张量合并启动机制帮助读者在训练脚本中正确、高效地使用这些优化器。一、模块定位optimizers.rst 与 apex.optimizers 的对应关系docs/source/optimizers.rst是 Apex 官方 Sphinx 文档中“Fused Optimizers”章节的入口它通过automodule与autoclass指令把apex.optimizers包内的四个核心类渲染为 API 文档FusedAdamapex/optimizers/fused_adam.pyFusedLAMBapex/optimizers/fused_lamb.pyFusedNovoGradapex/optimizers/fused_novograd.pyFusedSGDapex/optimizers/fused_sgd.py也就是说该 RST 文件本身只是文档骨架真正承载技术内容的是各个优化器源码顶部的类 docstring算法出处、参数默认值、用法示例、Amp 兼容说明以及底层 CUDA 实现。此外从 apex/optimizers/init.py 可以看到该包还额外导出了FusedAdagrad与FusedMixedPrecisionLamb它们与文档列出的四个类共用同一套融合与多张量启动框架本文一并介绍。二、共性前提GPU-only 与安装要求四个文档优化器的 docstring 开头都明确写着同一句话Currently GPU-only当前仅支持 GPU。这意味着必须通过编译 CUDA/C 扩展的方式安装 Apex官方推荐的安装命令为pip install -v --no-cache-dir --global-option--cpp_ext --global-option--cuda_ext ./若未编译扩展multi_tensor_applier会处于不可用状态。从 apex/multi_tensor_apply/multi_tensor_apply.py 的源码可以看到MultiTensorApply.__init__中通过try: import amp_C探测 CUDA 扩展是否可用不可用时available False随后构造 Fused 优化器时如 fused_adam.py 所示会直接抛出RuntimeError: apex.optimizers.FusedAdam requires cuda extensions所有 Fused 优化器都只支持fp16 与 fp32两种参数精度FusedAdam 额外支持 bfloat16遇到其他 dtype 会抛出 “only support fp16 and fp32” 的运行时错误同时不支持稀疏梯度遇到稀疏梯度时源码会建议改用SparseAdam。三、两大融合点元素级算子融合 多张量批量启动四个优化器的 docstring 都声明本版本实现了2 种融合融合 1更新规则中元素级运算的合并。以 Adam 为例原本需要多次 kernel launch 才能完成“动量更新 → 二阶矩更新 → 参数更新 → 权重衰减”的串行操作融合后在单个 CUDA kernel 内一次性完成。融合 2多张量启动multi-tensor apply。把模型中所有参数的更新请求打包进一次或少数几次 kernel launch 中执行大幅降低 kernel 启动开销——这是大模型训练参数数量级在千万到数十亿中最主要的加速来源。这两个融合点的落地依赖apex.multi_tensor_apply模块。从 apex/multi_tensor_apply/init.py 可以看到multi_tensor_applier MultiTensorApply(2048 * 32)即默认以2048 * 32 65536个张量为一个 chunk 进行分批。MultiTensorApply.__call__multi_tensor_apply.py最终调用amp_C中对应的 CUDA 入口例如multi_tensor_adam、multi_tensor_lamb、multi_tensor_novograd、multi_tensor_sgd、multi_tensor_adagrad等这些入口的实现分布在仓库 csrc/multi_tensor_adam.cu、csrc/multi_tensor_lamb.cu、csrc/multi_tensor_novograd.cu、csrc/multi_tensor_sgd_kernel.cu 中。四、FusedAdamAdam 与 AdamW 的即插即用替代4.1 算法背景与定位FusedAdam 实现的是 Adam 算法论文《Adam: A Method for Stochastic Optimization》并可作为torch.optim.AdamW的直接替代品若设置adam_w_modeFalse则等价于torch.optim.Adam。最小用法与普通 PyTorch 优化器完全一致opt apex.optimizers.FusedAdam(model.parameters(), lr1e-3) # ... 训练循环 opt.step()4.2 完整参数表FusedAdam 的构造签名与默认值见 fused_adam.py如下参数类型默认值说明paramsiterable必填待优化参数或定义参数组的 dict 列表lrfloat1e-3学习率capturableTrue时必须是位于 GPU 上的torch.tensorfloat32源码在__init__中会自动把普通 float 转为 tensorbias_correctionboolTrue是否进行偏差校正bias correction控制1 - beta^step修正项是否参与计算betasTuple[float, float](0.9, 0.999)一阶、二阶矩的指数衰减系数epsfloat1e-8分母数值稳定性项adam_w_modeboolTrueTrue表示解耦权重衰减AdamW 风格False表示 L2 正则化方式weight_decayfloat0.0权重衰减系数amsgradboolFalseFusedAdam 不支持 AMSGrad 变体传True会直接抛RuntimeError(FusedAdam does not support the AMSGrad variant.)set_grad_noneboolTruezero_grad()时是否直接将p.grad置为None省内存、更快capturableboolFalse是否使用可与 CUDA Graph 配合的版本master_weightsboolFalse是否在优化器内维护 FP32 master weights用于 FP16 混合精度训练当前仅能与capturableTrue组合使用否则抛 RuntimeError4.3 源码实现要点从 fused_adam.py 的step()实现可以提炼出以下实现事实按精度分流遍历每个参数组把参数按 dtype 分别归入g_16/p_16/m_16/v_16fp16、g_bf/p_bf/m_bf/v_bfbfloat16、g_32/p_32/m_32/v_32fp32三组列表再分别调用multi_tensor_applier每组一次或少数几次 launch。状态初始化首次遇到参数时创建exp_avg梯度的一阶矩与exp_avg_sq梯度的二阶矩均以torch.zeros_like(p.data).float()初始化即始终以 float32 精度维护动量状态。step 计数非 capturable 模式下group[step] 1capturable 模式下 step 保存为 GPU 上的 int tensor并以self._dummy_overflow_buf ! 1判断是否递增仅在无溢出时推进 step。overflow 检查与动态缩放capturable 模式与torch.cuda.amp.GradScaler协同工作——通过grad_scaler._check_inf_per_device检查梯度是否溢出found_inf写入 dummy buffer缩放因子通过scale.double().reciprocal().float()求得inv_scale传入 kernel实现“检查溢出 反缩放 更新”的无同步融合。master weights当master_weightsTrue时__init__中会为每个参数p.clone().detach().float()创建一份全精度副本存入param_groups_masterkernel 更新全精度 master 后再由它驱动低精度参数。step() 的历史参数已废弃旧版本step()支持grads、output_params、scale、grad_norms等额外参数现在这些参数已被弃用若传入会抛出提示 “Simply initialize it identically to torch.optim.Adam, and call step() with no arguments.” 的 RuntimeError只需无参调用opt.step()。五、FusedLAMB面向大批量训练的分层自适应矩优化5.1 算法背景与定位FusedLAMB 实现 LAMB 算法论文《Large Batch Optimization for Deep Learning: Training BERT in 76 minutes》其核心思想是逐层layer-wise的自适应学习率根据该层权重的范数与更新量的范数之比对学习率进行缩放从而在超大批量如数万样本/step下仍能保持稳定的收敛行为。其使用方式与普通 PyTorch 优化器完全一致opt apex.optimizers.FusedLAMB(model.parameters(), lr1e-3) opt.step()5.2 完整参数表FusedLAMB 构造签名与默认值见 fused_lamb.py注意它与 FusedAdam 有几处关键默认值差异参数类型默认值说明paramsiterable必填待优化参数lrfloat1e-3学习率bias_correctionboolTrue偏差校正开关betasTuple[float, float](0.9, 0.999)一阶、二阶矩衰减系数epsfloat1e-6数值稳定性项注意默认值与 FusedAdam 的1e-8不同weight_decayfloat0.01权重衰减默认非零amsgradboolFalse不支持传True抛 RuntimeErroradam_w_modeboolTrue解耦权重衰减AdamW 风格开关grad_averagingboolTrue计算梯度运行平均时是否对梯度乘以(1-beta2)set_grad_noneboolTruezero_grad()是否置p.grad Nonemax_grad_normfloat1.0全局梯度范数裁剪阈值use_nvlambboolFalse是否对权重衰减为 0 的参数也应用自适应学习率5.3 源码实现要点全局梯度范数的三步计算FusedLAMB 在step()fused_lamb.py中内建了梯度裁剪逻辑全局梯度范数分三步计算把参数按 fp16 / fp32 分组分别用amp_C.multi_tensor_l2norm计算两组梯度的 L2 范数g_norm_32、g_norm_16再把两个标量范数合并做一次 l2norm得到全局global_grad_norm随后作为参数传给multi_tensor_lambkernel在 kernel 内部完成 “梯度裁剪相对max_grad_norm 层自适应学习率 Adam 风格更新” 的融合操作。值得注意的实现细节与 FusedAdam 不同FusedLAMB 的exp_avg、exp_avg_sq使用torch.zeros_like(p.data)初始化保持与参数同精度且use_nvlambTrue时会对零权重衰减参数同样施以自适应学习率。六、FusedNovoGradJasper 声学模型中的归一化梯度优化器6.1 算法背景与定位FusedNovoGrad 实现 NovoGrad 算法出自论文《Jasper: An End-to-End Convolutional Neural Acoustic Model》。NovoGrad 的关键区别在于一阶矩的归一化使用每层的梯度范数而非逐元素二阶矩——即只对每个张量维护一个范数值exp_avg_sq是每层一个标量而不是与参数同形状的张量从而显著降低显存占用。用法与普通优化器一致opt apex.optimizers.FusedNovoGrad(model.parameters(), lr1e-3) opt.step()6.2 完整参数表FusedNovoGrad 构造签名与默认值见 fused_novograd.py参数类型默认值说明paramsiterable必填待优化参数lrfloat1e-3学习率bias_correctionboolTrue偏差校正开关betasTuple[float, float](0.9, 0.999)一阶矩衰减系数与范数衰减系数epsfloat1e-8数值稳定性项weight_decayfloat0.0权重衰减amsgradboolFalse不支持传True抛 RuntimeErrorreg_inside_momentboolFalseTrue表示在动量计算中一并做正则化norm 与 L2False表示仅在更新项上做正则化grad_averagingboolTrue计算梯度运行平均时是否乘以(1-beta1)norm_typeint2每层范数的类型2为 L2 范数0为无穷范数inf norm仅支持这两种init_zeroboolFalseTrue表示范数从 0 开始累积第 1 步即参与平均False表示用第 1 步的梯度范数初始化从第 2 步开始平均set_grad_noneboolTruezero_grad()是否置p.grad None6.3 源码实现要点范数以张量为单位存储源码注释明确说明“we store per weight norm as one tensor for one group/precision combination”即每个参数组 × 精度组合只维护一个范数向量group[exp_avg_sq]其长度为该组合的参数个数这与 Adam 系优化器每参数维护一个exp_avg_sq张量有本质区别fused_novograd.py。范数初始化init_zeroFalse时按norm_type计算首步范数——norm_type0用torch.max(torch.abs(g))无穷范数norm_type2用torch.sum(torch.pow(g, 2)).sqrt()L2 范数否则抛RuntimeError(FusedNovoGrad only support l2/inf norm now.)。状态迁移处理重写了load_state_dict确保 checkpoint 恢复时exp_avg_sq被迁移到与参数相同的设备上。moment_modereg_inside_momentFalse时moment_mode1正则化仅作用于更新项True时moment_mode0正则化进入动量计算。七、FusedSGD带动量与 Nesterov 的随机梯度下降7.1 用法与参数FusedSGD 可作为torch.optim.SGD的直接替代品其构造签名与默认值见 fused_sgd.py参数类型默认值说明paramsiterable必填待优化参数lrfloat必填学习率与 PyTorch 的required语义一致必须显式给出momentumfloat0动量系数dampeningfloat0动量阻尼weight_decayfloat0权重衰减L2 惩罚nesterovboolFalse是否启用 Nesterov 动量启用时要求momentum 0且dampening 0否则抛 ValueErrorwd_after_momentumboolFalse权重衰减是否在动量更新之后施加materialize_master_gradsboolTrue使用 Amp 且存在 fp16 参数时是否将 fp32 master 梯度实体化后传入 kernelset_grad_noneboolFalsezero_grad()是否置p.grad None注意默认值与 FusedAdam/LAMB/NovoGrad 的True不同7.2 动量更新公式的注意点docstring 明确指出 FusedSGD 的动量实现与 Sutskever 等人的原始论文及其他框架存在细微差别本实现采用v rho * v g p p - lr * v的形式动量与学习率分离而原始论文形式为v rho * v lr * g; p p - v。Nesterov 版本按同样方式修正。这一点与 PyTorch 官方torch.optim.SGD的实现语义保持一致因此作为 drop-in 替代时数值行为可预期。7.3 源码实现要点Amp 下的三种组合step()实现fused_sgd.py针对 Amp 混合精度场景处理了三种(grad_type, param_to_update_type, momentum_type)组合fp16, fp16, fp16无 fp16 模型副本需求fp32, fp32, fp32fp16, fp32, fp32Amp O1/O2 下 fp16 模型参数 fp32 master 参数需要requires_fp16_model_copy。当检测到_amp_stash.fp32_from_fp16_groups时即处于 Amp 的显式 master 参数模式会通过get_momentums为 fp32 master 参数维护动量缓冲区并依据materialize_master_grads决定是否把 fp16 模型梯度实体化到 fp32 再更新。此外step()中传入1.0 / self.most_recent_scale作为缩放因子支持与 Amp 的 loss scaling 协同。八、补充优化器FusedAdagrad 与 FusedMixedPrecisionLamb虽然docs/source/optimizers.rst只列出四个类但 apex/optimizers/init.py 还导出了另外两个融合优化器与前述实现共享同一套框架8.1 FusedAdagradfused_adagrad.py实现 Adagrad论文《Adaptive Subgradient Methods for Online Learning and Stochastic Optimization》参数为lr1e-2、eps1e-10、weight_decay0.0、set_grad_noneTrue、adagrad_w_modeFalse。其中adagrad_w_modeTrue表示解耦权重衰减AdamW 风格。状态仅需一个累积平方和state[sum]同样按 fp16/fp32 分流并调用amp_C.multi_tensor_adagrad。8.2 FusedMixedPrecisionLambfused_mixed_precision_lamb.py面向 Device-Sync-Free设备同步无阻塞训练的 LAMB 变体lr与step被固化为 GPU 上的 tensor源码注释“The learning rate (lr) and optimizer step (step) should be located on device in order to facilitated device sync free execution”从而避免优化器更新路径中的设备同步通过reduced_precision_dtype指定低精度参数类型如 fp16_setup_full_precision_params()会为低精度参数克隆维护一份 fp32 全精度副本动量与速度始终保持在全精度其load_state_dict重写的注释明确指出混合精度 LAMB 的 momentum/velocity 应为全精度而参数为低精度底层使用amp_C.multi_tensor_l2norm_mp与amp_C.multi_tensor_lamb_mp并声明_step_supports_amp_scaling True。九、与 Amp 的配合任意 opt_level 均可使用四个文档优化器的 docstring 都给出了同一条兼容性说明Fused 优化器可以带 Amp 使用也可以不带 Amp 使用若配合 Amp可选择任意opt_levelopt apex.optimizers.FusedAdam(model.parameters(), lr1e-3) model, opt amp.initialize(model, opt, opt_levelO0) # 或 O1 / O2 opt.step()并且文档明确建议一般情况下推荐opt_levelO1。其中 FusedSGD 还针对 Amp 的 master 参数机制做了专门适配见上文 7.3 节FusedAdam 在capturableTrue时支持与torch.cuda.amp.GradScaler的无同步协同溢出检查 反缩放融合进 kernelFusedMixedPrecisionLamb 则声明自身支持 Amp 缩放。十、测试与验证仓库内证据仓库在tests/L0/run_optimizers/目录下为这些优化器提供了可直接运行的验证测试tests/L0/run_optimizers/test_adam.pyFusedAdam 与torch.optim.Adam/AdamW的数值一致性对比tests/L0/run_optimizers/test_lamb.pyFusedLAMB 与 PyTorch 参考实现的对比tests/L0/run_optimizers/test_fused_novograd.pyFusedNovoGrad 的收敛与数值正确性验证tests/L0/run_optimizers/test_fused_optimizer.py融合优化器的通用行为测试tests/L0/run_optimizers/test_fused_novograd.py 之外tests/L0/run_optimizers/下还有__init__.py标识其作为可发现测试包。这些测试通过“与 PyTorch 原生优化器逐参数对比更新结果”的方式验证融合实现与参考实现的数值一致性——这正是把 Fused 优化器作为 drop-in 替代品的安全性来源。十一、总结如何选择优化器适用场景关键差异化特性FusedAdam常规训练、Adam/AdamW 直接替代支持 capturable CUDA Graph、master weights、bf16FusedLAMB大批量数千~数万样本/step预训练逐层自适应学习率 内建全局梯度裁剪FusedNovoGrad显存受限、声学模型等场景每层仅一个范数标量二阶矩开销极小FusedSGD基线训练、卷积网络 fine-tune与 torch.optim.SGD 语义一致Amp master 参数深度适配选用时需注意三条硬性约束仅 GPU 可用需--cpp_ext --cuda_ext编译安装仅支持 fp16/fp32FusedAdam 另支持 bf16不支持稀疏梯度与 AMSGrad。在满足这些前提后Fused 系列优化器即可在保持与 PyTorch 原生优化器数值一致的基础上通过“元素级算子融合 多张量批量启动”双重融合显著降低训练中的 kernel 启动开销。赞分享人工智能深度学习分布式训练模型优化【免费下载链接】apexA PyTorch Extension: Tools for easy mixed precision and distributed training in Pytorch项目地址https://gitcode.com/gh_mirrors/ap/apex点击查看免费下载相关推荐ik_llama.cpp 的 Fused MoE ffn_up/ffn_gate 优化-fmoe 融合算子原理、用法与实测性能ik_llama.cpp 的 Fused MoE ffn_up/ffn_gate 优化 fmoe 融合算子原理、用法与实测性能 导读 本文围绕 ik_llam人工智能大模型推理引擎本地部署模型量化Cilium CLI cilium upgrade 完全指南基于 Helm 的无缝升级、参数详解与源码级工作原理Cilium CLI cilium upgrade 完全指南基于 Helm 的无缝升级、参数详解与源码级工作原理 cilium upgrade 是 Ciliu人工智能语音音频深度学习NLPPuppeteer 页面 HTTP 认证完全指南Page.authenticate() 原理、用法与实战Puppeteer 页面 HTTP 认证完全指南Page.authenticate 原理、用法与实战 在自动化浏览器访问受 Basic Auth / Dige浏览器控制测试网页爬虫开发工具上一篇Cilium Generic Veth CNI Chaining在任意 veth 模型 CNI 插件之上叠加 eBPF 网络能力下一篇ingress-nginx 版本演进全解读从 Changelog 看控制器发布历史、破坏性变更与安全加固路线创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表