pytorch apex混合精度训练

1、apex FP 16混合精度训练原理和bug

2、 官方教程

# Initialization
opt_level = 'O1'
model, optimizer = amp.initialize(model, optimizer, opt_level=opt_level)

# Train your model
...
with amp.scale_loss(loss, optimizer) as scaled_loss:
    scaled_loss.backward()
...

# Save checkpoint
checkpoint = {
    'model': model.state_dict(),
    'optimizer': optimizer.state_dict(),
    'amp': amp.state_dict()
}
torch.save(checkpoint, 'amp_checkpoint.pt')
...

# Restore
model = ...
optimizer = ...
checkpoint = torch.load('amp_checkpoint.pt')

model, optimizer = amp.initialize(model, optimizer, opt_level=opt_level)
model.load_state_dict(checkpoint['model'])
optimizer.load_state_dict(checkpoint['optimizer'])
amp.load_state_dict(checkpoint['amp'])

# Continue training
...

Note that we recommend restoring the model using the same opt_level. Also note that we recommend calling the load_state_dict methods after amp.initialize.

3、add apex 代码

try:
    import sys
    sys.path.insert(0, "/home/apex")  #下载的github工程
    from apex.parallel import DistributedDataParallel as DDP
    from apex.fp16_utils import *
    from apex import amp, optimizers
    from apex.multi_tensor_apply import multi_tensor_applier
except ImportError:
    print("======================================================>")
    print("Not use apex fp16 to train ,first confirm your gpu support fp16, for example 2080Ti、Titan、Tesla...")
    raise ImportError("Please install apex from https://www.github.com/nvidia/apex to run this example.")

        if cfg.SOLVER.FP16: #add 混合精度训练 opt_level='O1'
                print("使用混合精度apex 训练")
                model, optimizer = amp.initialize(model, optimizer, opt_level='O1')
        else:  #author code DDP
            # For training, wrap with DDP. But don't need this for inference.
            if comm.get_world_size() > 1:
                # ref to https://github.com/pytorch/pytorch/issues/22049 to set `find_unused_parameters=True`
                # for part of the parameters is not updated.
                model = DistributedDataParallel(
                    model, device_ids=[comm.get_local_rank()], broadcast_buffers=False
                )


        if self.FP16: #add 混合精度代码
            with amp.scale_loss(losses, self.optimizer) as scaled_loss:
                scaled_loss.backward()
        else: #author
            losses.backward()

最后torch.save  ,还是原来保存模型的接口,没有用apex 

加入apex 使用接口之后,梯度溢出,
不知道如何解决,但是训练还能回来

ttps://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate
“https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate”, UserWarning)
Gradient overflow. Skipping step, loss scaler 0 reducing loss scale to 16384.0
Gradient overflow. Skipping step, loss scaler 0 reducing loss scale to 8192.0
Gradient overflow. Skipping step, loss scaler 0 reducing loss scale to 4096.0
Gradient overflow. Skipping step, loss scaler 0 reducing loss scale to 2048.0
[08/17 11:20:26 fastreid.utils.events]: eta: 7:17:17 iter: 199 total_loss: 8.289 loss_cls: 6.490 loss_triplet: 1.803 time: 0.8417 data_time: 0.0017 lr: 3.02e-05 max_mem: 0M
[08/17 11:23:17 fastreid.utils.events]: eta: 7:14:16 iter: 399 total_loss: 7.069 loss_cls: 6.336 loss_triplet: 0.724 time: 0.8477 data_time: 0.0018 lr: 5.71e-05 max_mem: 0M
[08/17 11:26:08 fastreid.utils.events]: eta: 7:11:49 iter: 599 total_loss: 6.362 loss_cls: 5.828 loss_triplet: 0.541 time: 0.8501 data_time: 0.0018 lr: 8.39e-05 max_mem: 0M

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch AMP(Automatic Mixed Precision)是一种用于深度学习模型训练的加速技术,它可以将低精度的计算操作与高精度的计算操作混合使用,从而在保持模型精度的同时提高训练速度和减少显存占用。具体来说,PyTorch AMP 使用了 NVIDIA Apex 库中的混合精度训练技术,将一些计算操作转换为 FP16(半精度浮点数)格式,从而减少计算和存储的需求。 实现 PyTorch AMP 混合精度训练的步骤如下: 1. 引入必要的库和模块: ```python import torch from torch.cuda.amp import autocast, GradScaler ``` 2. 定义模型和优化器: ```python model = MyModel() optimizer = torch.optim.SGD(model.parameters(), lr=1e-3) ``` 3. 定义混合精度训练相关的参数: ```python scaler = GradScaler() ``` 4. 在训练过程中使用 autocast 和 GradScaler 完成混合精度训练: ```python for data, target in train_loader: # 将数据和目标值转换为合适的类型 data, target = data.to(device), target.to(device) # 使用 autocast 进行前向计算和反向传播 with autocast(): output = model(data) loss = loss_function(output, target) # 使用 GradScaler 进行梯度缩放和反向传播 scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() # 清空梯度 optimizer.zero_grad() ``` 在上面的代码中,autocast 用于自动将一些计算操作转换为 FP16 格式,从而提高训练速度;GradScaler 用于梯度缩放和反向传播,确保在低精度的计算下仍能保持模型精度。 需要注意的是,不是所有的计算操作都能够使用 FP16 格式,一些数值较大的计算操作可能会出现溢出等问题。因此,在使用 PyTorch AMP 进行混合精度训练时,需要仔细选择转换的计算操作,并且进行必要的检查和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值