GradScaler 是否需要使用 pytorch 进行混合精度训练?

Des*_*wal 6 nvidia apex deep-learning torch pytorch

因此,查看AMP:普通网络的自动混合精度训练教程,我发现有两个版本,Automatic并且GradScaler. 我只是想知道是否建议/有必要GradScaler在培训中使用它,因为文档中写道:

\n
\n

当使用混合精度进行训练时,梯度缩放有助于防止小幅度梯度冲至零 (\xe2\x80\x9cunderflowing\xe2\x80\x9d)。

\n
\n
scaler = torch.cuda.amp.GradScaler()\nfor epoch in range(1):\n    for input, target in zip(data, targets):\n        with torch.cuda.amp.autocast():\n            output = net(input)\n            loss = loss_fn(output, target)\n\n        scaler.scale(loss).backward()\n        scaler.step(opt)\n        scaler.update()\n        opt.zero_grad()\n
Run Code Online (Sandbox Code Playgroud)\n

另外,查看PyTorch 的 NVIDIA Apex 文档,他们将其用作,

\n
from apex import amp\n\nmodel, optimizer = amp.initialize(model, optimizer)\n\nloss = criterion(\xe2\x80\xa6)\nwith amp.scale_loss(loss, optimizer) as scaled_loss:\n    scaled_loss.backward()\noptimizer.step()\n
Run Code Online (Sandbox Code Playgroud)\n

我认为这也是GradScaler如此,所以我认为这是必须的。有人可以帮我解决这里的查询吗?

\n

dx2*_*-66 11

简短的回答:是的,如果没有GradScaler().

使用 FP16 存在三个基本问题:

  • 权重更新:半精度,1 + 0.0001 四舍五入到 1。autocast()处理这个。
  • 梯度消失:半精度时,任何小于(大约)2e-14 的值都会四舍五入到 0,这与单精度 2e-126 不同。GradScaler()照顾这个。
  • 爆炸性损失:与上面类似,半精度时溢出的可能性也更大。这也是由autocast()上下文管理的。