PyTorch重大更新:将支持自动混合精度训练!

混合精度训练可通过提升训练速度同时保持模型准确性,适用于多种深度学习框架。PyTorch即将提供内置支持,利用torch.cuda.amp.autocast自动选择GPU操作的精度,并通过torch.cuda.amp.GradScaler调整梯度规模避免过小问题,从而实现自动混合精度训练。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

混合精度训练(mixed precision training)可以让模型训练在尽量不降低性能的情形下提升训练速度,而且也可以降低显卡使用内存。目前主流的深度学习框架都开始支持混合精度训练。对于PyTorch,混合精度训练还主要是采用NVIDIA开源的apex库。但是,PyTorch将迎来重大更新,那就是提供内部支持的混合精度训练,而且是自动混合精度训练:
torch.cuda.amp.autocast :自动为GPU op选择精度来提升训练性能而不降低模型准确度。
torch.cuda.amp.GradScaler : 对梯度进行scale来加快模型收敛,因为float16梯度容易出现underflow(梯度过小)
两者结合在一起,可以实现自动混合精度训练:

Creates model and optimizer in default precision

model = Net().cuda()
optimizer = optim.SGD(model.parameters(), …)

Creates a GradScaler once at the beginning of training.

scaler = GradScaler()

for epoch in epochs:
for input, target in data:
optimizer.zero_grad()

    # Runs the forward pass with autocasting.
    with autocast():
        output = model(input)
        loss = loss_fn(output, target)

    # Scales loss.  Calls backward() on scaled loss to create scaled gradients.
    # Backward passes under autocast are not recommended.
    # Backward ops run in the same precision that autocast used for corresponding forward ops.
    scaler.scale(loss).backward()

    # scaler.step() first unscales the gradients of the optimizer's assigned params.
    # If these gradients do not contain infs or NaNs, optimizer.step() is then called,
    # otherwise, optimizer.step() is skipped.
    scaler.step(optimizer)

    # Updates the scale for next iteration.
    scaler.update()
    可以看到,为了防止梯度的underflow,首先scaler.scale(loss).backward()会对loss乘以一个scale因子,然后backward时所有梯度都会乘以相同的scale因子,这样保证梯度有较大的magnitude而不会出现为0。我们不希望这个scale因子对学习速率产生影响,那么scaler.step(optimizer)会先unscale要更新的梯度然后再更新,如果梯度出现infs或者NaNs,optimizer将忽略这次迭代训练。

如果你想在梯度更新前对梯度进行clip,也是可以的:
scaler = GradScaler()
for epoch in epochs: for input, target in data: optimizer.zero_grad() with autocast(): output = model(input) loss = loss_fn(output, target) scaler.scale(loss).backward() # Unscales the gradients of optimizer’s assigned params in-place scaler.unscale_(optimizer) # Since the gradients of optimizer’s assigned params are unscaled, clips as usual: torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm) # optimizer’s gradients are already unscaled, so scaler.step does not unscale them, # although it still skips optimizer.step() if the gradients contain infs or NaNs. scaler.step(optimizer) # Updates the scale for next iteration. scaler.update()当然,混合精度训练肯定要支持分布式训练,由于autocast是thread local的,所以要注意以下不同的情形:如果使用torch.nn.DataParallel:此时只有一个进程,而不同GPU上是各自的线程跑forward过程的,所以下面操作时无效的:model = MyModel()dp_model = nn.DataParallel(model)# Sets autocast in the main threadwith autocast(): # dp_model’s internal threads won’t autocast. The main thread’s autocast state has no effect. output = dp_model(input) # loss_fn still autocasts, but it’s too late… loss = loss_fn(output)此时你需要对model的forward方法用autocast装饰:MyModel(nn.Module): … @autocast() def forward(self, input): …# AlternativelyMyModel(nn.Module): … def forward(self, input): with autocast(): …model = MyModel()dp_model = nn.DataParallel(model)with autocast(): output = dp_model(input) loss = loss_fn(output)如果使用torch.nn.parallel.DistributedDataParallel:一般情形下是单GPU进程的,此时原来的用来就没有问题,但是如果是多GPU一个进程那么就和上述问题一样,需要用autocast装饰model的forward。

### 关于 UniApp 框架推荐资源与教程 #### 1. **Uniapp 官方文档** 官方文档是最权威的学习资料之一,涵盖了从基础概念到高级特性的全方位讲解。对于初学者来说,这是了解 UniApp 架构技术细节的最佳起点[^3]。 #### 2. **《Uniapp 从入门到精通:案例分析与最佳实践》** 该文章提供了系统的知识体系,帮助开发者掌握 Uniapp 的基础知识、实际应用以及开发过程中的最佳实践方法。它不仅适合新手快速上手,也能够为有经验的开发者提供深入的技术指导[^1]。 #### 3. **ThorUI-uniapp 开源项目教程** 这是一个专注于 UI 组件库设计实现的教学材料,基于 ThorUI 提供了一系列实用的功能模块。通过学习此开源项目的具体实现方式,可以更好地理解如何高效构建美观且一致的应用界面[^2]。 #### 4. **跨平台开发利器:UniApp 全面解析与实践指南** 这篇文章按照章节形式详细阐述了 UniApp 的各个方面,包括但不限于其工作原理、技术栈介绍、开发环境配置等内容,并附带丰富的实例演示来辅助说明理论知识点。 以下是几个重要的主题摘选: - **核心特性解析**:解释了跨端运行机制、底层架构组成及其主要功能特点。 - **开发实践指南**:给出了具体的页面编写样例代码,展示了不同设备间 API 调用的方法论。 - **性能优化建议**:针对启动时间缩短、图形绘制效率提升等方面提出了可行策略。 ```javascript // 示例代码片段展示条件编译语法 export default { methods: { showPlatform() { console.log(process.env.UNI_PLATFORM); // 输出当前平台名称 #ifdef APP-PLUS console.log('Running on App'); #endif #ifdef H5 console.log('Running on Web'); #endif } } } ``` #### 5. **其他补充资源** 除了上述提到的内容外,还有许多在线课程视频可供选择,比如 Bilibili 上的一些免费系列讲座;另外 GitHub GitCode 平台上也有不少优质的社区贡献作品值得借鉴研究。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值