PyTorch混合精度训练实战:如何用AMP让你的旧显卡也能跑大模型

Pytorch自动混合精度(AMP)训练 pytorch从1.6版本开始,已经内置了torch.cuda.amp,采用自动混合精度训练就不需要加载第三方NVIDIA的apex库了。AMP --(automatic mixed-precision training) 一 什么是自动混合精度训练(AMP) 默认情况下,大多数深度学习框架都采用32位浮点算法进行训练。2017年,NVIDIA研究了一种用于混合精度训练的方法,该方法在训练网络时将单精度(FP32)与半精度(FP16)结合在一起,并使用相同的超参数实现了与FP32几乎相同的精度。 1. 阅读详情

PyTorch混合精度训练实战:如何用AMP让你的旧显卡也能跑大模型

手里只有一张RTX 3060,甚至更老的RTX 2060,看着动辄数十GB显存需求的大模型,是不是觉得训练任务遥不可及?别急着升级硬件,也别轻易放弃。很多时候,限制我们的不是显卡的绝对性能,而是对显存利用效率的认知。混合精度训练,正是打开这扇门的钥匙。它不是什么遥不可及的实验室技术,而是PyTorch框架内置的、经过实战检验的成熟方案。今天,我们不谈空洞的理论,直接上手,看看如何用PyTorch原生的AMP(Automatic Mixed Precision)工具,让你手头的消费级显卡也能承担起大模型的训练任务。

我见过太多开发者,一遇到显存不足就本能地调小batch size,或者干脆放弃更复杂的模型结构。这其实是一种资源的浪费。现代GPU,即便是消费级产品,其Tensor Core单元对半精度浮点数(FP16)的计算吞吐量,往往是单精度(FP32)的2到8倍。这意味着,合理利用FP16,不仅能省下近一半的显存,还能大幅提升计算速度。关键在于,如何安全、稳定地使用它,避免因精度损失导致的模型不收敛或数值溢出。这就是AMP要解决的问题。

1. 混合精度训练的核心原理:不只是省显存

在深入代码之前,我们有必要花几分钟理解混合精度训练到底在做什么。这能帮助你在遇到问题时,知道该从哪里排查。

深度学习训练中的数值主要有三种:模型权重(Weights)、激活值(Activations) 和梯度(Gradients)。传统训练全程使用FP32,每个数占用4字节。FP16则只占2字节,直观上能节省一半的存储空间。但直接全部换成FP16行不通,主要因为两个问题:

  1. 数值范围不足:FP16能表示的最大正值约为65504,最小正值约为5.96e-8。而深度学习中的梯度值通常非常小,可能在1e-7甚至更小。在反向传播的链式乘法中,这些微小梯度用FP16表示时会直接下溢(Underflow)为零,导致权重无法更新。
  2. 舍入误差:当权重值很大(例如1.0),而梯度更新量很小(例如1e-5)时,FP16可能无法精确表示这个微小的变化,导致更新无效。

AMP的聪明之处在于“混合”。它并非简单地将所有计算转为FP16,而是采用了一个主权重(Master Weights) 的概念。具体流程如下:

  • 前向传播(FP16):使用FP16的权重副本和输入数据进行计算,得到FP16的损失。
  • 损失缩放(Loss Scaling):将FP16的损失乘以一个缩放因子(如1024或2048),将其“放大”到FP16能较好表示的数值范围内。这一步是关键,它保护了那些微小的梯度不被淹没。
  • 反向传播(FP16):计算得到放大后的FP16梯度。
  • 梯度反缩放与更新(转FP32):将放大后的FP16梯度转换回FP32,并除以相同的缩放因子,得到真实的FP32梯度。然后用这个FP32梯度去更新保存在FP32精度下的主权重。
  • 同步权重:将更新后的FP32主权重转换为FP16副本,用于下一次前向传播。

这个过程就像一个精密的放大器:在前向和反向计算这些“重活”上用FP16来提速省显存,而在关键的权重更新这个“精细活”上,用FP32来保证数值稳定和精度。

注意:并非所有计算都适合用FP16。像Softmax、LayerNorm这类对数值范围敏感的操作,强制使用FP16容易导致溢出或精度灾难。AMP内部维护了一个“白名单”和“黑名单”,自动为不同类型的操作分配合适的精度。

为了更直观地理解AMP模式下显存的分布变化,我们来看一个简单的对比表格:

组件FP32 训练显存占用AMP (O2) 训练显存占用说明
模型参数 (Weights)4 × Ψ2 × ΨAMP下,前向/反向时使用FP16副本。
梯度 (Gradients)4 × Ψ2 × Ψ反向传播时产生FP16梯度。
优化器状态 (如Adam)8 × Ψ12 × ΨAdam需维护动量(m)和方差(v)两个状态。FP32训练时它们也是FP32。AMP下,为了稳定更新FP32主权重,优化器状态也需保持为FP32,且需额外维护一份FP32的主权重,因此总占用反而增加。
激活值 (Activations)可变,巨大可变,约减半前向传播中产生的中间结果,与batch size和序列长度强相关。使用FP16可大幅减少其占用。
总计趋势非常大显著减少对于大模型,激活值通常是显存瓶颈。AMP通过将其转为FP16,能释放出关键的空间来增大batch size或使用更大模型。

从上表可以看出,AMP省显存的秘诀主要在于大幅削减了激活值(Activations)的占用。对于Transformer这类激活值显存消耗巨大的模型,AMP的效果尤为明显。

2. PyTorch AMP快速上手:三行代码的魔法

理论说再多,不如一行代码。PyTorch从1.6版本开始,将AMP功能集成到了torch.cuda.amp模块中,使用起来异常简单。我们从一个最简单的训练循环开始改造。

假设你原本的训练循环长这样:

import torch
import torch.nn as nn
import torch.optim as optim

model = YourModel().cuda()
optimizer = optim.Adam(model.parameters(), lr=1e-4)
criterion = nn.CrossEntropyLoss()

for data, target in dataloader:
    data, target = data.cuda(), target.cuda()
    
    optimizer.zero_grad()
    output = model(data)          # 前向传播
    loss = criterion(output, target) # 计算损失
    loss.backward()               # 反向传播
    optimizer.step()              # 更新权重

启用AMP只需要引入两个关键对象,并修改三处:

import torch
import torch.nn as nn
import torch.optim as optim
from torch.cuda.amp import autocast, GradScaler  # 关键导入

model = YourModel().cuda()
optimizer = optim.Adam(model.parameters(), lr=1e-4)
criterion = nn.CrossEntropyLoss()
scaler = GradScaler()  # 关键对象1:梯度缩放器

for data, target in dataloader:
    data, target = data.cuda(), target.cuda()
    
    optimizer.zero_grad()
    
    # 关键修改1:用autocast上下文管理器包裹前向计算
    with autocast():
        output = model(data)
        loss = criterion(output, target)
    
    # 关键修改2:用scaler.scale对loss进行缩放,再backward
    scaler.scale(loss).backward()
    
    # 关键修改3:用scaler.step和scaler.update来更新权重和缩放因子
    scaler.step(optimizer)
    scaler.update()

是的,核心就是GradScaler和autocast。autocast上下文管理器会自动将其范围内的计算转换为合适的精度(大部分转为FP16)。GradScaler则负责我们前面提到的损失缩放与反缩放流程。scaler.update()还会根据梯度是否出现溢出(NaN/Inf)来动态调整缩放因子,这是一个非常鲁棒的设计。

3. 深入AMP配置:O1与O2模式的选择与调优

PyTorch的AMP主要通过autocast的上下文来管理精度。虽然没有像NVIDIA Apex库那样显式的opt_level参数,但我们可以通过配置autocast和手动管理模型权重精度来模拟不同的优化级别。

3.1 O1模式(默认推荐):自动黑白名单

我们上面展示的用法,其实就是O1模式的思路。autocast()默认使用PyTorch预设的操作类型黑白名单:

  • 白名单操作:如torch.mm, torch.matmul, torch.conv2d等计算密集型操作,在autocast区域内会使用FP16计算以获得加速。
  • 黑名单操作:如torch.softmax, torch.log, torch.exp等对数值范围敏感的操作,即使在autocast区域内也会保持FP32计算以保证稳定性。
  • 灰名单操作:其余操作,其输入数据类型决定计算精度。如果所有输入都是FP16,则用FP16计算;否则用FP32。

这种模式在速度和稳定性之间取得了很好的平衡,是大多数情况下的首选。你几乎不需要额外配置。

3.2 O2模式:极致性能与手动控制

O2模式更为激进,它的目标是让几乎所有操作都使用FP16,仅将少数必须的操作(如Softmax、LayerNorm)和优化器更新步骤保留为FP32。在PyTorch中实现O2,需要手动将模型权重转换为FP16。

import torch
import torch.nn as nn
from torch.cuda.amp import autocast, GradScaler

model = YourModel().cuda()
optimizer = optim.Adam(model.parameters(), lr=1e-4)
scaler = GradScaler()

# 关键步骤:将模型权重转换为FP16
model.half()  # 这将把模型中所有浮点参数和缓冲区转换为FP16

for data, target in dataloader:
    data, target = data.cuda(), target.cuda()
    data = data.half()  # 输入数据也需要转换为FP16
    
    optimizer.zero_grad()
    
    # 注意:此时autocast仍然需要,因为它会保护黑名单操作(如LayerNorm)使用FP32
    with autocast():
        # 模型权重和输入已是FP16,大部分计算在此进行
        output = model(data)
        loss = criterion(output, target)
    
    scaler.scale(loss).backward()
    scaler.step(optimizer)
    scaler.update()

O2模式能最大程度节省显存和提升速度,因为它连模型参数本身都存储为FP16。但它对模型和任务更挑剔。如果模型中有自定义的、对精度敏感的操作,或者任务本身对数值稳定性要求极高,O2可能导致训练发散。我的经验是,对于成熟的视觉CNN模型(如ResNet)和大多数NLP Transformer模型,O2通常工作良好。但对于一些新颖的、未经充分测试的架构,建议从O1开始。

3.3 关键配置:梯度缩放器(GradScaler)

GradScaler有几个重要的初始化参数,理解它们有助于调试:

scaler = GradScaler(
    init_scale=2.**16,      # 初始缩放因子,默认65536
    growth_factor=2.0,       # 当连续`growth_interval`步无溢出时,缩放因子乘以此值
    backoff_factor=0.5,      # 当发生溢出时,缩放因子乘以此值
    growth_interval=2000,    # 连续无溢出的步数阈值,用于增大缩放因子
    enabled=True             # 是否启用缩放,可用于动态开关AMP
)
  • 动态缩放:这是AMP稳定训练的核心。如果检测到梯度溢出(出现Inf/NaN),scaler.step(optimizer)会跳过本次权重更新,并且scaler.update()会将缩放因子乘以backoff_factor(如0.5)以减少下次的缩放幅度。如果连续多步(growth_interval)没有溢出,则会乘以growth_factor(如2.0)尝试增大缩放因子,以更充分地利用FP16的动态范围。
  • 跳过更新:当发生溢出时,scaler.step()不会执行optimizer.step()。这是保护机制,防止NaN污染模型权重。你可以在训练日志中监控这一点。

4. 实战技巧:针对Transformer等大模型的精细调整

对于BERT、GPT这类基于Transformer的大模型,直接应用上述基础AMP方法可能还不够。我们需要一些额外的技巧来保证稳定性和最大化收益。

4.1 保持LayerNorm和Softmax为FP32

Transformer中的LayerNorm和注意力机制中的Softmax是数值敏感的操作。在O2模式下,由于模型权重已是FP16,autocast会自动将这些黑名单操作保持在FP32。但在O1模式下,或者当你手动控制时,需要确保它们运行在FP32上下文。

方法一:依赖autocast(推荐) 最简单的方式就是相信autocast。PyTorch的默认黑名单已经包含了F.layer_norm和F.softmax。只要这些操作在with autocast():块内,它们就会被安全地执行在FP32下。

方法二:手动包装(用于自定义模块或复杂控制) 如果你需要更精细的控制,或者编写自定义模块,可以手动指定某些部分的计算精度:

import torch.nn.functional as F
from torch.cuda.amp import custom_fwd, custom_bwd

class StableTransformerLayer(nn.Module):
    def __init__(self, dim, heads):
        super().__init__()
        self.attention = nn.MultiheadAttention(dim, heads)
        self.norm1 = nn.LayerNorm(dim)
        self.norm2 = nn.LayerNorm(dim)
        self.mlp = nn.Sequential(...)
    
    @custom_fwd(cast_inputs=torch.float32)  # 强制前向传播的输入转换为FP32
    def forward(self, x):
        # 即使外部是autocast(FP16),这里的norm1计算也会使用FP32
        nx = self.norm1(x)
        attn_output, _ = self.attention(nx, nx, nx)
        x = x + attn_output
        
        nx = self.norm2(x)
        mlp_output = self.mlp(nx)
        x = x + mlp_output
        return x

使用@custom_fwd装饰器可以强制该函数内的计算使用指定的数据类型。

4.2 监控显存与检测溢出

开启AMP后,监控工具变得尤为重要。

  • 显存监控:在训练循环中定期打印显存使用情况。

    import torch
    print(f"Allocated: {torch.cuda.memory_allocated() / 1e9:.2f} GB")
    print(f"Cached: {torch.cuda.memory_reserved() / 1e9:.2f} GB")
    

    你会观察到,开启AMP后,allocated内存(当前已分配的张量)会显著下降,而cached内存(PyTorch缓存的内存池)可能变化不大。这是正常的。

  • 梯度溢出检测:GradScaler提供了方便的方法来检查上一步是否发生了溢出。

    scaler.step(optimizer)
    scaler.update()
    
    if scaler.get_scale() != prev_scale:
        print(f"Loss scale changed from {prev_scale} to {scaler.get_scale()}")
        # 缩放因子变化意味着发生了溢出或增长
    

    如果频繁发生溢出(缩放因子持续下降),你可能需要:

    1. 检查模型结构,确保敏感操作运行在FP32。
    2. 尝试减小init_scale。
    3. 检查数据中是否存在异常值(如NaN)。

4.3 与梯度累积(Gradient Accumulation)结合

当单卡显存即使开了AMP也无法容纳想要的batch size时,梯度累积是另一个救命稻草。它的原理是:连续进行多次前向传播和反向传播,但不更新权重(optimizer.step()),只是累积梯度。在累积了N个微批次(micro-batch)后,用累积的总梯度更新一次权重。这相当于用时间换空间,实现了更大的有效batch size。

AMP与梯度累积能完美配合:

scaler = GradScaler()
accumulation_steps = 4  # 累积4步
optimizer.zero_grad()

for i, (data, target) in enumerate(dataloader):
    data, target = data.cuda(), target.cuda()
    
    with autocast():
        output = model(data)
        loss = criterion(output, target)
        loss = loss / accumulation_steps  # 损失按累积步数平均
    
    scaler.scale(loss).backward()
    
    # 每 accumulation_steps 步更新一次权重
    if (i + 1) % accumulation_steps == 0:
        scaler.step(optimizer)
        scaler.update()
        optimizer.zero_grad()
        print(f"Step updated at iteration {i+1}")

注意,我们将loss除以了accumulation_steps。这是因为backward()会累加梯度。如果不除以步数,那么累积N步后的梯度相当于单个大batch的N倍,这会导致更新步长过大,破坏优化过程。除以N后,累积梯度在数值上就等价于一个大batch的梯度。

5. 常见陷阱与性能调优指南

混合精度训练并非银弹,实践中会遇到一些坑。这里总结几个最常见的问题和解决方案。

问题一:训练Loss变成NaN或突然爆炸。

  • 可能原因:梯度溢出。FP16的动态范围有限,即使有Loss Scaling,某些极端大的梯度值仍可能溢出。
  • 解决方案:
    1. 启用梯度裁剪(Gradient Clipping):在scaler.step(optimizer)之前,使用scaler.unscale_(optimizer)将梯度反缩放回FP32,然后进行裁剪。
      scaler.unscale_(optimizer)
      torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)  # 裁剪梯度范数
      scaler.step(optimizer)
      scaler.update()
      
    2. 检查数据:确保输入数据没有异常值(如inf或nan)。
    3. 降低初始缩放因子:创建GradScaler时,尝试更小的init_scale,例如2.**10。

问题二:开启AMP后速度没有提升,甚至变慢。

  • 可能原因1:你的GPU不支持Tensor Core(计算能力低于7.0),或者驱动/CUDA版本太旧。AMP在Volta(V100)、Turing(RTX 20系列)、Ampere(RTX 30系列)及更新架构上才有显著的Tensor Core加速。
  • 可能原因2:模型的计算瓶颈不在GPU,而在数据加载或CPU预处理(DataLoader)。使用torch.utils.data.DataLoader时,设置num_workers>0和pin_memory=True,并确保数据预处理不会成为瓶颈。
  • 可能原因3:模型太小或操作类型不适合FP16加速。如果模型主要由元素级操作(如ReLU、加法)构成,而不是矩阵乘(MatMul)或卷积(Conv),那么FP16的加速收益可能被类型转换的开销抵消。

问题三:验证集精度略有下降。

  • 可能原因:这是精度损失的正常体现。FP16毕竟损失了部分精度。
  • 解决方案:
    1. 在验证/测试时关闭AMP:评估模型时,使用FP32精度以确保最高的准确性。
      @torch.no_grad()
      def evaluate(model, dataloader):
          model.eval()
          # 不使用autocast,确保全精度计算
          for data, target in dataloader:
              data, target = data.cuda(), target.cuda()
              output = model(data)  # 这里是FP32计算
              # ... 计算指标
      
    2. 微调超参数:有时稍微降低学习率或调整其他超参数可以弥补精度损失。
    3. 坚持使用O1模式:O2模式虽然更快,但精度损失风险也更高。如果O1能达到满意的精度和速度,就没必要追求O2。

性能调优终极建议:

  1. 从O1模式开始:它最稳定,适合绝大多数模型。
  2. 逐步增大batch size:开启AMP后,显存占用降低,尝试逐步增加batch_size直到占满显存。更大的batch size有时能带来更稳定的训练和更好的最终性能。
  3. 监控Loss Scale:如果scaler.get_scale()稳定在一个较高的值(如几千),说明训练很健康。如果它持续下降并保持在很低的值(如1或2),说明梯度溢出频繁,需要排查问题。
  4. 使用更现代的优化器:像AdamW通常比原始Adam对混合精度训练更友好。LAMB优化器在大batch训练中表现也很好。

混合精度训练已经从一项前沿技术变成了深度学习训练的标配。对于个人开发者和小型团队而言,它是在有限硬件条件下探索更大模型、更复杂任务的必备技能。我自己的RTX 3060 12GB显卡,通过AMP结合梯度累积,曾经成功微调过70亿参数的模型,而这在纯FP32模式下是不可想象的。关键在于理解其原理,耐心调试,并善用监控工具。下次当你再看到“CUDA out of memory”时,不妨先别急着抱怨硬件,试试打开AMP,或许会有惊喜。

大规模训练中的梯度累积与混合精度实战:扩散模型训练效率优化路径解析 在扩散模型(如Stable Diffusion)等大规模生成模型的训练过程中,显存限制与计算资源瓶颈是工程落地的主要挑战之一。梯度累积与混合精度训练是当前最具实效的两种优化路径。本文结合实际工程经验,深入剖析梯度累积(Gradient Accumulation)与自动混合精度(Automatic Mixed Precision, AMP)的底层原理、实现方法与调试技巧。基于 PyTorch、HuggingFace Diffusers 和 Accelerate 框架,详细讲解如何在资源受限环境下完成大模型稳定 阅读详情

相关推荐

PyTorch自动混合精度(AMP)训练实战:从理论到代码实现

本文详细介绍了PyTorch自动混合精度(AMP)训练的理论与实践,从基础概念到代码实现,帮助开发者显著提升训练速度和显存效率。通过FP16和FP32的智能结合,AMP技术可在保持模型精度的同时加速计算,特别适合BERT等大型模型训练。文章包含环境配置、模型改造、性能调优及典型问题解决方案,是掌握AMP技术的实用指南。

weixin_30485379的博客 350

pytorch原生支持的apex混合精度和nvidia apex混合精度AMP技术加速模型训练效果对比

apex的AMP库和pytorch中自带的amp——自动混合精度 了解一下算法原理 参考文章 Pytorch 1.6使用自动混合精度训练(AMP) 使用AMP得到更高效的PyTorch模型​​​​​​​ ...

HUSTHY的博客 1万+

Sharding-JDBC 系列专题 - 第九篇:高可用性与集群管理

高可用性是指系统在面对故障(如数据库宕机、网络中断)时,能够快速恢复并继续提供服务。Sharding-JDBC 和 Sharding-Proxy 提供了多种机制支持高可用性,同时需要结合底层数据库的高可用方案(如 MySQL 主从复制、MHA)来实现。高可用性和集群管理是 Sharding-JDBC 和 Sharding-Proxy 在生产环境中成功应用的关键。本篇详细介绍了数据库高可用方案、Sharding-JDBC 的故障切换机制、Sharding-Proxy 的集群部署,以及分布式治理功能。

资深架构师分享:深入剖析软件架构,探讨云计算、微服务、大数据等前沿技术。分享实践经验,促进技术交流,共同构建卓越系统。 1393

pytorch 使用amp进行混合精度训练

简介 AMP:Automatic mixed precision,自动混合精度,可以在神经网络推理过程中,针对不同的层,采用不同的数据精度进行计算,从而实现节省显存和加快速度的目的。在Pytorch 1.5版本及以前,通过NVIDIA提供的apex库可以实现amp功能。但是在使用过程中会伴随着一些版本兼容和奇怪的报错问题。从1.6版本开始,Pytorch原生支持自动混合精度训练,并已进入稳定阶段,AMP 训练能在 Tensor Core GPU 上实现更高的性能并节省多达 50% 的内存。 环境 Py

qq_38284951的博客 4212

一、两电平IGBT整流器

电压源换流器(Voltage source converter,VSC)连接交流主网和直流电网,起到交直流网络连接、功率输送和电能变换的作用。采用电压控制手段可维持直流电压的稳定;或采用功率控制手段保证系统功率输出达到预期。VSC的三相电压平衡方程如式(1)所示:式中,igx和ugx分别表示主网三相电流与电压(x=a,b,c);ucx表示换流器VSC 交流输出电压;Rg表示交流主网等效电阻;Lg表示交流主网等效电感。

TUCHACHINA的博客 4165

门信号表达式_毫米波FMCW体制雷达的信号处理中的FFT等效为相干积累的解释

民用的77G或24G毫米波雷达目前普遍采用发射波形为一连串线性调频连续波(即所谓chirp信号,啁啾信号,线性调频波如果能够下变频到人耳可接收的频段,听起来很类似“啁啾”“啁啾”的鸟叫声)。一串前后相继的chirp信号与一段长时间的“空闲”组成一帧信号(比如汽车雷达整机厂普遍采用一帧为50ms)。用频谱仪观察chirp信号串,横坐标为时间,纵坐标为频率,如下图所示(此处引用TI产品手册...

weixin_39725756的博客 1949

PyTorch-混合精度训练

介绍如何使用PyTorch自带的amp模块进行混合精度训练。

周先森爱吃素的博客 6739

软解调详解

在这个示例中,生成了一个随机的比特序列,将其调制为QPSK信号,添加了高斯白噪声,然后计算了每个比特的LLR,并根据LLR的符号进行了解调判决。软解调是一种基于接收信号的概率估计进行解调的方法。与传统的硬解调相比,软解调不仅考虑了接收信号的幅度和相位信息,还利用统计特性计算每个比特为0或1的概率,从而提高了解调性能。软解调过程中涉及的主要公式包括对数似然比(LLR)的计算公式、信号的概率分布函数以及解调判决公式等。软解调的计算处理流程包括信号接收、预处理、相位估计、LLR计算、解调判决和输出等步骤。

ahah12345678的博客 1227

pytorch原生支持的amp混合精度和nvidia apex混合精度AMP技术

从英伟达网页Apex (A PyTorch Extension) — Apex 0.1.0 documentation可以得到apex的全称——A PyTorch Extension(Apex)——其实就是一种pytorch的拓展插件。它的目的就是为了是用户能够快速实现amp——自动混合精度技术在它们的N卡系列上训练模型也构建的一个库。简简单单的在你自定义的模型训练代码中添加少量代码(4行代码)就能够使用自动混合精度的技术来提高模型的训练速度,提高生产力。

flyingluohaipeng的博客 2454

道路场景分割:车道线、可行驶区域与路沿检测

道路场景分割:车道线、可行驶区域与路沿检测​ ,人工智能,计算机视觉,大模型,AI,文章围绕道路场景分割展开,涵盖车道线、可行驶区域与路沿检测。介绍了基本概念、重要性,各部分检测的类型、方法、难点及解决思路,还涉及技术融合、数据集、评价指标、发展趋势、应用案例、代码示例、不同天气处理、实际问题与方案、实现流程、相关技术工具、教育研究应用、产业前景、伦理安全问题及学习资源等,全面阐述了道路场景分割的多方面内容,为相关学习和研究提供了丰富信息。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 22万+

铁路场景雷达点云目标识别与追踪系统

本文介绍了一种基于毫米波雷达的铁路货运车站安全监控系统。该系统采用分布式架构,通过多个毫米波雷达节点采集点云数据,经过坐标转换、多雷达融合等处理后,利用机器学习算法实现列车、行人等目标的实时识别与追踪。系统包含数据采集层、处理层、目标识别层、追踪层、预警决策层和可视化层,能够克服传统视频监控受环境影响大的缺点,实现全天候可靠监测。文中详细展示了雷达数据解析和点云预处理的代码实现,包括坐标转换、数据格式解析和体素网格滤波等关键技术。该系统可有效预警铁路场景下的碰撞风险,提升货运车站的安全管理水平。

huanghm88的专栏 125

在PyTorch中使用混合精度训练(AMP)提升GPU效率

通过PyTorch的AMP技术结合CUDA容器镜像,实现GPU训练加速与显存优化。利用autocast自动分配精度、GradScaler防止梯度下溢,再配合Docker环境隔离,显著提升深度学习开发效率,适用于从单卡实验到大规模分布式训练的过渡。

weixin_34268462的博客 831

流体动力学仿真软件:SU2_(1).SU2简介与安装

SU2 是一个开源的计算流体动力学(CFD)和计算结构动力学(CSD)仿真软件,由斯坦福大学的航空航天系开发。它主要用于解决流体动力学问题,包括但不限于空气动力学、热力学、化学反应流等。SU2 的特点在于其高度的灵活性和可扩展性,使其成为科研和工业领域中非常受欢迎的工具。SU2 采用有限体积法(FVM)和有限元法(FEM)进行数值求解,支持多种物理模型和求解器,如 Euler 方程、Navier-Stokes 方程、RANS 方程等。

kkchenjj的博客 1313

PyTorch-CUDA-v2.7镜像中使用AMP进行自动混合精度训练

在PyTorch-CUDA-v2.7容器环境中,通过自动混合精度(AMP)显著降低显存消耗并加速模型训练。利用autocast与GradScaler技术,在几乎不损失精度的前提下实现训练速度提升近两倍,显存占用减少超40%,适用于主流大模型与多卡分布式场景。

weixin_35756624的博客 847

SAP-ABAP:SAP IDOC 全面学习指南

SAP-ABAP:SAP IDOC 全面学习指南

baidu_35680696的博客 1617

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【Pytorch】Pytorch的自动混合精度(AMP)

1. 什么是自动混合精度训练?        我们知道神经网络框架的计算核心是Tensor,也就是那个从scaler -> array -> matrix -> tensor 维度一路丰富过来的tensor。在PyTorch中,我们可以这样创建一个Tensor: >>> import torch >>> gemfield = torch.zeros(70,30) >>&

Roaddd的博客 1355

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Pytorch中的自动混合精度

最近在训练yolo v5的模型时,出现了这样一个bug: cannot import name 'amp' 这个模块之前从来没有见过,所以就去了解了一下,发现是pytorch中的自动混合精度模块。这是yolov5新使用的技术,v4,v3都没有出现过。 1.什么是自动混合精度 自动混合精度(automatic mixed precision (AMP))是在pytorch1.6版本中发布的。 神经网络计算框架的核心就是Tensor, 在深度学习中,Tensor实际上就是一个多维数组(multidimens

qq_44419614的博客 3950

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

PyTorch的自动混合精度(AMP)

背景 PyTorch 1.6版本带来的最大更新就是自动混合精度。release说明的标题是: Stable release of automatic mixed precision (AMP). New Beta features include a TensorPipe backend for RPC, memory profiler, and several improvements to distributed training for both RPC and DDP. 可见自动混合精度正是

weixin_44166449的博客 790

PyTorch混合精度训练实战:如何用AMP让你的模型训练速度翻倍(附A100实测数据)

本文深入解析PyTorch自动混合精度训练(AMP)的核心原理与实战技巧,通过A100显卡实测数据展示其显著加速效果。详细介绍了AMP在ResNet50和Transformer模型上的性能对比,以及关键配置参数、常见问题解决方案和高级优化技巧,帮助开发者实现模型训练速度翻倍。

happy2的博客 927

pytorch 训练_在PyTorch中使用混合精度训练

简介PyTorch在进行模型训练时采用的都是单精度(FP32)训练的方法,,也就是每个数据都占用4个字节(32bit)的空间。半精度(FP16)数据则只占用2个字节(16bit)的存储空间。因此FP16相比FP32节省了一半的存储空间和位宽,不仅在相同显存占用的情况下容纳更多样本,而且可以加快计算速度。而在多数情况下,FP16带来的精度降低对模型性能的损失很小,并且有许多可行的办法可以进...

weixin_39989796的博客 1414

pytorch 混合精度训练

半精度混合训练,省显存且能提速一倍。混合精度训练,需要硬件设备支持才可以。混合精度需要Tensor Core支持,P4卡不支持混合精度训练。Tensor Core:我们知道在深度学习中大量的运算都是在高维矩阵(张量 Tensor)间进行的,Tensor Core可以让tensor的计算速度急速上升。Tensor Core专业执行矩阵数学运算,适用于深度学习和某些类型的HPC。...

alex1801 2069

PyTorch-CUDA-v2.9镜像是否支持混合精度训练?支持AMP

PyTorch-CUDA-v2.9镜像全面支持混合精度训练,集成PyTorch 2.9、CUDA 11.8+与cuDNN优化库,配合Ampere等现代GPU可显著降低显存占用并加速训练。只需正确使用autocast与GradScaler,无需额外配置即可开箱即用,是当前高效训练大模型的推荐实践。

weixin_36047538的博客 867

Pytorch混合精度(FP16&FP32)(AMP自动混合精度)/半精度 训练(一) —— 原理(torch.half)

一般用混合精度(AMP, Automatic mixed precision),用半精度可能对acc的影响较大 混合精度的performance也要看网络,有些网络的提升不大,有些网络会影响acc AMP自动混合精度,可以在神经网络推理过程中,针对不同的层,采用不同的数据精度进行计算,从而实现节省显存和加快速度的目的。在Pytorch 1.5版本及以前,通过NVIDIA提供的apex库可以实现amp功能。但是在使用过程中会伴随着一些版本兼容和奇怪的报错问题。从...

hxxjxw的博客 1万+

混合精度训练全解析:从公式到实战,让你的模型训练飞起来

混合精度训练是AI工程师必备的显存优化技术,通过FP16计算加速和FP32权重存储实现"又快又稳"的训练效果。其核心原理包括:1)权重更新流程在FP16计算、FP32存储;2)损失缩放技术防止梯度下溢。BF16因更大的数值范围正成为新趋势。该技术特别适用于大模型训练、边缘部署、生成式AI等场景,可节省40-50%显存并提升1.5-2倍速度。主流框架如PyTorch、TensorFlow都提供便捷API支持,但也需注意精度损失问题,可通过动态损失缩放、敏感层保持FP32等方法解决。未来FP

1088

【PyTorch】多卡训练/混合精度/分布式训练之踩坑指北

【pytorch】多卡训练/混合精度/分布式训练之踩坑指北 1. 混合精度 1.1 目的 训练网络的基本上都是在N卡上面执行的,数据集比较大时,训练网络会耗费大量的时间。由于我们需要使用反向传播来更新具有细微变化的权重,因而我们在训练网络的过程中通常会选用FP32类型的数据和权重。 混合精度训练,即当你使用N卡训练你的网络时,混合精度会在内存中用FP16做储存和乘法从而加速计算,用FP32做累加避免舍入误差。 它的优势就是可以使你的训练时间减少一半左右。它的缺陷是只能在支持FP16操作的一些特定类型的显卡上

heroybc的博客 8238
上一篇: 实战教程:用Visio快速绘制专业级N-S盒图(附赠PAD图转换技巧)
下一篇: 手把手教你用C++实现三种低通滤波器(SMA/EMA/Butterworth)
sql99
博客等级 码龄19年 168粉丝 1905原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值