apex.optimizers

class apex.optimizers.FusedAdam(params, lr=0.001, bias_correction=True, betas=(0.9, 0.999), eps=1e-08, adam_w_mode=True, weight_decay=0.0, amsgrad=False, set_grad_none=True)[源代码]

实现 Adam 算法。

目前仅支持 GPU。 需要通过 pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./ 安装 Apex。

此版本的融合 Adam 实现了 2 个融合。

  • Adam 更新的元素操作的融合

  • 一个多张量应用启动器,将应用于所有模型参数的元素更新批量处理为一个或几个内核启动器。

apex.optimizers.FusedAdam 可以用作 torch.optim.Adam 的直接替代品

opt = apex.optimizers.FusedAdam(model.parameters(), lr = ....)
...
opt.step()

apex.optimizers.FusedAdam 可以与 Amp 一起使用或不一起使用。 如果您希望将 FusedAdam 与 Amp 一起使用,您可以选择任何 opt_level

opt = apex.optimizers.FusedAdam(model.parameters(), lr = ....)
model, opt = amp.initialize(model, opt, opt_level="O0" or "O1 or "O2")
...
opt.step()

通常,建议使用 opt_level="O1"

警告

FusedAdam 的先前版本允许向 step 传递许多其他参数。 这些附加参数现在已弃用且不必要。

Adam 已在 Adam: A Method for Stochastic Optimization 中提出。

参数
  • params (iterable) – 要优化的参数的可迭代对象或定义参数组的字典。

  • lr (float, optional) – 学习率。 (默认:1e-3)

  • betas (Tuple[float, float], optional) – 用于计算梯度及其平方的运行平均值的系数。(默认:(0.9,0.999))

  • eps (float, optional) – 添加到分母以提高数值稳定性的项。(默认:1e-8)

  • weight_decay (float, optional) – 权重衰减(L2惩罚)(默认:0)

  • amsgrad (boolean, optional) – 是否使用论文 On the Convergence of Adam and Beyond 中的此算法的 AMSGrad 变体 (default: False) FusedAdam 中不支持!

  • adam_w_mode (boolean, optional) – 应用 L2 正则化或权重衰减,True 表示解耦权重衰减(也称为 AdamW)(默认:True)

  • set_grad_none (bool, optional) – 调用 zero_grad() 方法时是否将 grad 设置为 None。(默认:True)

step(closure=None, grads=None, output_params=None, scale=None, grad_norms=None)[源代码]

执行单个优化步骤。

参数

closure (callable, optional) – 一个重新评估模型并返回损失的闭包。

其余参数已弃用,仅保留(目前)用于错误检查目的。

zero_grad()[源代码]

清除所有优化后的 torch.Tensor 的梯度。

class apex.optimizers.FusedLAMB(params, lr=0.001, bias_correction=True, betas=(0.9, 0.999), eps=1e-06, weight_decay=0.01, amsgrad=False, adam_w_mode=True, grad_averaging=True, set_grad_none=True, max_grad_norm=1.0)[源代码]

实现 LAMB 算法。

目前仅支持 GPU。 需要通过 pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./ 安装 Apex。

此版本的融合 LAMB 实现了 2 个融合。

  • LAMB 更新的元素操作的融合

  • 一个多张量应用启动器,将应用于所有模型参数的元素更新批量处理为一个或几个内核启动器。

apex.optimizers.FusedLAMB 的用法与任何普通 Pytorch 优化器相同

opt = apex.optimizers.FusedLAMB(model.parameters(), lr = ....)
...
opt.step()

apex.optimizers.FusedLAMB 可以与 Amp 一起使用或不一起使用。 如果您希望将 FusedLAMB 与 Amp 一起使用,您可以选择任何 opt_level

opt = apex.optimizers.FusedLAMB(model.parameters(), lr = ....)
model, opt = amp.initialize(model, opt, opt_level="O0" or "O1 or "O2")
...
opt.step()

通常,建议使用 opt_level="O1"

LAMB 在 Large Batch Optimization for Deep Learning: Training BERT in 76 minutes 中提出。

参数
  • params (iterable) – 要优化的参数的可迭代对象或定义参数组的字典。

  • lr (float, optional) – 学习率。 (默认:1e-3)

  • betas (Tuple[float, float], optional) – 用于计算梯度及其范数的运行平均值的系数。(默认:(0.9,0.999))

  • eps (float, optional) – 添加到分母以提高数值稳定性的项。(默认:1e-8)

  • weight_decay (float, optional) – 权重衰减(L2惩罚)(默认:0)

  • amsgrad (boolean, optional) – 是否使用论文 On the Convergence of Adam and Beyond 中的此算法的 AMSGrad 变体,现在不支持!(默认:False)

  • adam_w_mode (boolean, optional) – 应用 L2 正则化或权重衰减,True 表示解耦权重衰减(也称为 AdamW)(默认:True)

  • grad_averaging (bool, optional) – 在计算梯度的运行平均值时,是否将 (1-beta2) 应用于 grad。(默认:True)

  • set_grad_none (bool, optional) – 调用 zero_grad() 方法时是否将 grad 设置为 None。(默认:True)

  • max_grad_norm (float, optional) – 用于裁剪全局 grad 范数的值(默认:1.0)

step(closure=None)[源代码]

执行单个优化步骤。

参数

closure (callable, optional) – 一个重新评估模型并返回损失的闭包。

zero_grad()[源代码]

清除所有优化后的 torch.Tensor 的梯度。

class apex.optimizers.FusedNovoGrad(params, lr=0.001, bias_correction=True, betas=(0.9, 0.999), eps=1e-08, weight_decay=0.0, amsgrad=False, reg_inside_moment=False, grad_averaging=True, norm_type=2, init_zero=False, set_grad_none=True)[源代码]

实现 NovoGrad 算法。

目前仅支持 GPU。 需要通过 pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./ 安装 Apex。

此版本的融合 NovoGrad 实现了 2 个融合。

  • NovoGrad 更新的元素操作的融合

  • 一个多张量应用启动器,将应用于所有模型参数的元素更新批量处理为一个或几个内核启动器。

apex.optimizers.FusedNovoGrad 的用法与任何 Pytorch 优化器相同

opt = apex.optimizers.FusedNovoGrad(model.parameters(), lr = ....)
...
opt.step()

apex.optimizers.FusedNovoGrad 可以与 Amp 一起使用或不一起使用。 如果您希望将 FusedNovoGrad 与 Amp 一起使用,您可以选择任何 opt_level

opt = apex.optimizers.FusedNovoGrad(model.parameters(), lr = ....)
model, opt = amp.initialize(model, opt, opt_level="O0" or "O1 or "O2")
...
opt.step()

通常,建议使用 opt_level="O1"

它已在 Jasper: An End-to-End Convolutional Neural Acoustic Model 中提出。 更多信息: https://nvda.org.cn/OpenSeq2Seq/html/optimizers.html#novograd

参数
  • params (iterable) – 要优化的参数的可迭代对象或定义参数组的字典。

  • lr (float, optional) – 学习率。 (默认:1e-3)

  • betas (Tuple[float, float], optional) – 用于计算梯度及其范数的运行平均值的系数。(默认:(0.9,0.999))

  • eps (float, optional) – 添加到分母以提高数值稳定性的项。(默认:1e-8)

  • weight_decay (float, optional) – 权重衰减(L2惩罚)(默认:0)

  • amsgrad (boolean, optional) – 是否使用论文 On the Convergence of Adam and Beyond 中的此算法的 AMSGrad 变体,现在不支持!(默认:False)

  • reg_inside_moment (bool, optional) – 是否在动量计算中进行正则化(范数和 L2)。 True 表示包括,False 表示不包括,仅在更新项上进行。(默认:False)

  • grad_averaging (bool, optional) – 在计算梯度的运行平均值时,是否将 (1-beta2) 应用于 grad。(默认:True)

  • norm_type (int, optional) – 为每一层计算哪个范数。 2 表示 L2 范数,0 表示无穷范数。 现在只支持这 2 种类型。(默认:2)

  • init_zero (bool, 可选) – 是否使用 0 初始化 norm (从第一步开始平均) 还是使用第一步的 norm (从第二步开始平均)。True 表示使用 0 初始化。(默认值:False)

  • set_grad_none (bool, optional) – 调用 zero_grad() 方法时是否将 grad 设置为 None。(默认:True)

load_state_dict(state_dict)[源代码]

加载优化器状态。

参数

state_dict (dict) – 优化器状态。应该是一个从调用 state_dict() 返回的对象。

step(closure=None)[源代码]

执行单个优化步骤。

参数

closure (callable, optional) – 一个重新评估模型并返回损失的闭包。

zero_grad()[源代码]

清除所有优化后的 torch.Tensor 的梯度。

class apex.optimizers.FusedSGD(params, lr=<required parameter>, momentum=0, dampening=0, weight_decay=0, nesterov=False, wd_after_momentum=False, materialize_master_grads=True)[源代码]

实现了随机梯度下降(可以选择使用动量)。

目前仅支持 GPU。 需要通过 pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./ 安装 Apex。

此版本的 fused SGD 实现了 2 个融合。

  • SGD 更新的元素级操作的融合

  • 一个多张量应用启动器,将应用于所有模型参数的元素更新批量处理为一个或几个内核启动器。

apex.optimizers.FusedSGD 可以用作 torch.optim.SGD 的直接替代品

opt = apex.optimizers.FusedSGD(model.parameters(), lr = ....)
...
opt.step()

apex.optimizers.FusedSGD 可以与 Amp 一起使用或不一起使用。 如果您希望将 FusedSGD 与 Amp 一起使用,您可以选择任何 opt_level

opt = apex.optimizers.FusedSGD(model.parameters(), lr = ....)
model, opt = amp.initialize(model, opt, opt_level="O0" or "O1 or "O2")
...
opt.step()

通常,建议使用 opt_level="O1"

Nesterov 动量基于 On the importance of initialization and momentum in deep learning 中的公式。

参数
  • params (iterable) – 要优化的参数的可迭代对象或定义参数组的字典

  • lr (float) – 学习率

  • momentum (float, 可选) – 动量因子(默认值:0)

  • weight_decay (float, optional) – 权重衰减(L2惩罚)(默认:0)

  • dampening (float, 可选) – 动量阻尼(默认值:0)

  • nesterov (bool, 可选) – 启用 Nesterov 动量(默认值:False)

例子

>>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
>>> optimizer.zero_grad()
>>> loss_fn(model(input), target).backward()
>>> optimizer.step()

注意

带有动量/Nesterov 的 SGD 的实现与 Sutskever et. al. 和其他一些框架中的实现略有不同。

考虑到动量的具体情况,更新可以写成

\[\begin{split}v = \rho * v + g \\ p = p - lr * v\end{split}\]

其中 p、g、v 和 \(\rho\) 分别表示参数、梯度、速度和动量。

这与 Sutskever et. al. 和其他框架形成对比,后者采用以下形式的更新

\[\begin{split}v = \rho * v + lr * g \\ p = p - v\end{split}\]

Nesterov 版本也进行了类似修改。

step(closure=None)[源代码]

执行单个优化步骤。

参数

closure (callable, optional) – 一个重新评估模型并返回损失的闭包。