混合精度与单精度对比

混合精度训练
本文探讨了混合精度在深度学习训练中的应用。使用较少的代码改动即可实现,尤其适用于显存有限的情况。实验证明,在PASCAL架构显卡上,虽然能增加批次大小,但训练时间会有所延长。

使用混合精度代码更改很少
 

scaler = GradScaler()


with autocast():
    out = model(data)
    loss = loss_func(out, target)
scaler.scale(loss).backward()
scaler.step(opt)
scaler.update()


只有PASCAL架构显卡

CIFAR1000最大批次
TITAN X PASCAL 12G
单精度batch=3100 混合精度batch=5000  批次大小提升61%倍
GTX1070 8G
单精度batch=2000 混合精度batch=2900  批次大小提升45%倍

CIFAR1000速率测试
batch=2500
TITAN X PASCAL 12G
单精度 15.47s/batch  混合精度 22.8秒/bitch  速率变慢了47%
GTX1070 8G
单精度 18.13s/batch  混合精度 29.6秒/bitch  速度变慢了63%

显存不够可以试试混合精度,PASCAL架构显卡混合精度更慢,有tensor core显卡应该可以加速。

### 对比损失混合精度的关系 对比损失(Contrastive Loss)通常用于训练模型以学习样本之间的相似性和差异性。这种类型的损失函数广泛应用于度量学习、图像检索以及自监督学习等领域。当涉及到大规模数据集和复杂网络架构时,计算资源的需求会显著增加。 #### 混合精度的作用 为了提高训练效率并减少内存占用,在实际应用中常常采用混合精度技术来加速深度神经网络的训练过程[^1]。通过利用半精度浮点数(FP16),可以在保持几乎相同收敛性能的同时大幅降低显存消耗和缩短迭代时间。然而,对于某些特定操作如梯度更新,则仍需使用单精度浮点数(FP32)以确保数值稳定性。 #### 实现方法 在PyTorch框架下实现带有混合精度支持的对比损失可以按照如下方式进行: ```python import torch from torch.cuda.amp import GradScaler, autocast def contrastive_loss(embedding_1, embedding_2, label, margin=1.0): distance = F.pairwise_distance(embedding_1, embedding_2) loss_contrastive = torch.mean((label) * torch.pow(distance, 2) + (1-label) * torch.pow(torch.clamp(margin - distance, min=0.0), 2)) return loss_contrastive model.train() scaler = GradScaler() for batch_idx, (data, target) in enumerate(train_loader): optimizer.zero_grad() with autocast(): output1, output2 = model(data[0].cuda(), data[1].cuda()) loss = contrastive_loss(output1, output2, target.float().cuda()) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() ``` 上述代码展示了如何结合`torch.cuda.amp.autocast()`上下文管理器自动处理前向传播中的张量类型转换,并借助`GradScaler`对象完成反向传播阶段的梯度缩放工作,从而实现了高效的混合精度训练流程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值