进阶内容#

本节例子中假设你已经处于你的实验目录中,你的模型配置文件名为 resnet50.py

DTR#

BaseCls 支持利用 DTR 技术进行训练。相关知识内容请参考文档。

通过修改模型配置文件中的 dtr 相关字段开启:

cfg.dtr = True

也可以在终端中追加参数覆盖模型配置文件中的字段:

cls_train -f resnet50.py dtr True

AMP#

BaseCls 支持利用 AMP 自动混合精度进行训练,可以提升训练吞吐。相关知识内容请参考文档。

通过修改模型配置文件中的 amp 相关字段开启:

cfg.amp.enabled = True

也可以在终端中追加参数覆盖模型配置文件中的字段:

cls_train -f resnet50.py amp.enabled True

混合精度训练中使用 fp16 代替 fp32 进行梯度计算,因此会涉及浮点数表达能力的问题。为了防止小量级的梯度在 fp16 表示中损失精度,实践中往往将损失函数扩大适当的倍率,称为 loss_scale ,在 GradScaler 中实现了相关逻辑。

混合精度的默认行为是固定 loss_scale = 128.0 ,另外一种动态调整 loss_scale 的方法可以更好地利用fp16的动态范围,可以使用 dynamic_scale 字段开启。开启时初始 loss_scale = 65536.0 ,并每 2000 轮迭代进行一次翻倍,当遇到梯度为 inf 时会立即将其减半:

cfg.amp.dynamic_scale = True

Model EMA#

Model EMA 是一种加快模型收敛的方法,常用于较新的卷积模型和 Transformer 类模型。通过统计模型参数的滑动平均,能够获得更好的泛化能力。

通过修改模型配置文件中的 model_ema 相关字段开启,默认每步迭代都会更新 Model EMA:

cfg.model_ema.enabled = True
cfg.model_ema.momentum = 0.9999
cfg.model_ema.update_period = 1

也可以设置 update_period 隔一定步数进行更新,一个建议是当提升更新间隔时,要相应减小 momentum 的值:

cfg.model_ema.enabled = True
cfg.model_ema.momentum = 0.9992
cfg.model_ema.update_period = 8

另外如果对于设置正确的 momentum 没有经验,也可以设置 alpha 的默认配置,momentum 会根据更新间隔和更新量 alpha 自动适配:

cfg.model_ema.enabled = True
cfg.model_ema.alpha = 1e-5
cfg.model_ema.update_period = 32

相关更新公式为:

\[\mathrm{momentum} = 1 - \alpha \times \frac{\mathrm{update\_period} \times \mathrm{total\_batch\_size}}{\mathrm{max\_epochs}}\]