2301_77452531 2025-08-04 21:22 采纳率: 0%
浏览 12

MobileMamba训练时占用显存很少,环境也没问题,换了其他的网络显存占用和利用率正常

地址:


论文:MobileMamba: Lightweight Multi-Receptive Visual Mamba Network

1、问题现象描述:
环境配置正常,无报错,但是占用显存少,利用率为0,一直是这样

| 0 NVIDIA GeForce RTX 4090 Off | 00000000:01:00.0 On | Off |
| 0% 59C P2 67W / 450W | 5037MiB / 24564MiB | 0% Default |
| | | N/A |

[GFlops: 0.358G][Params: 8.809M]
[Batchsize: 4] [GPU-Speed: 0.143]

运行项目中的文件:model/mobilemamba/mobilemamba.py时,就花了很长时间,显存占用几百MB,利用率为0.

  • 写回答

5条回答 默认 最新

  • 檀越@新空间 2025-08-04 21:23
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    根据你描述的问题现象,MobileMamba 在训练时 显存占用很少,利用率几乎为0,这可能意味着模型没有正确地使用 GPU 进行计算。虽然环境配置正常、无报错,但问题可能出在以下几点:


    一、可能原因分析

    1. 模型未被正确加载到 GPU 上

      • 即使代码运行无报错,也可能因为模型或数据未被正确移动到 GPU。
    2. 模型结构中没有可训练参数

      • 如果 MobileMamba 的某些部分是固定的(如冻结层),可能导致大部分计算未被激活。
    3. 输入数据未被正确送入 GPU

      • 数据未被 .to(device)cuda() 处理,导致模型无法使用 GPU 计算。
    4. 优化器或梯度未被正确初始化

      • 如果模型没有参数需要更新,优化器不会触发任何操作,导致利用率低。
    5. 框架版本兼容性问题

      • 某些 PyTorch 版本对 Mamba 模型支持不完善,可能导致性能异常。
    6. 模型本身设计为“轻量”模式

      • MobileMamba 可能默认启用了轻量模式,导致实际计算量较少。

    二、解决方案

    1. 确保模型和数据都移动到 GPU

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model = MobileMamba().to(device)
    inputs = inputs.to(device)
    

    重点: 必须将 模型和输入数据都移动到 GPU 上,否则所有计算都会在 CPU 上执行。


    2. 检查模型是否有可训练参数

    print(sum(p.numel() for p in model.parameters()))
    

    重点: 如果输出为 0,说明模型没有可训练参数,可能是冻结了所有层,或者模型结构存在问题。


    3. 检查是否启用了梯度计算

    with torch.enable_grad():
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
    

    重点: 确保在训练过程中开启了梯度计算,否则不会有任何更新,导致 GPU 利用率为 0。


    4. 查看模型的 forward 方法是否真的执行了计算

    def forward(self, x):
        print("Forward is called")
        # your code
    

    重点: 添加打印语句确认模型的 forward 方法是否被执行,避免模型未被调用。


    5. 使用 PyTorch Profiler 检查 GPU 使用情况

    from torch.profiler import profile, record_function, ProfilerActivity
    
    with profile(activities=[ProfilerActivity.CUDA],
                 profile_memory=True,
                 record_shapes=True) as prof:
        for i, (inputs, labels) in enumerate(train_loader):
            inputs, labels = inputs.to(device), labels.to(device)
            with record_function("model_inference"):
                outputs = model(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
            prof.step()
    
    print(prof.key_averages().table(sort_by="cuda_time_total", row_limit=10))
    

    重点: 通过 prof.key_averages() 查看 GPU 上实际执行的操作,判断是否真的在使用 GPU。


    6. 尝试使用不同的模型配置

    如果你使用的是 MobileMamba 的某种变体(如 mobilemamba_smallmobilemamba_base),可以尝试切换模型大小:

    from mobilemamba import mobilemamba_small
    model = mobilemamba_small(pretrained=True).to(device)
    

    重点: 小模型可能计算量小,显存占用少,但若想提升利用率,可尝试更大版本。


    三、修改后的示例代码(完整训练流程)

    import torch
    from mobilemamba import mobilemamba_small
    from torch.utils.data import DataLoader, TensorDataset
    import torch.nn as nn
    import torch.optim as optim
    
    # 设备设置
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    
    # 模型初始化
    model = mobilemamba_small(pretrained=True).to(device)
    
    # 假设我们有一个数据集
    inputs = torch.randn(100, 3, 224, 224)  # 假设是图像数据
    labels = torch.randint(0, 10, (100,))
    dataset = TensorDataset(inputs, labels)
    loader = DataLoader(dataset, batch_size=32, shuffle=True)
    
    # 损失函数和优化器
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.Adam(model.parameters(), lr=0.001)
    
    # 训练循环
    for epoch in range(5):
        for inputs, labels in loader:
            inputs, labels = inputs.to(device), labels.to(device)
            optimizer.zero_grad()
            outputs = model(inputs)
            loss = criterion(outputs, labels)
            loss.backward()
            optimizer.step()
            print(f"Epoch {epoch}, Loss: {loss.item():.4f}")
    

    四、总结

    | 问题 | 解决方案 | |------|----------| | 模型未加载到 GPU | 使用 .to(device) | | 输入数据未加载到 GPU | 确保 inputs.to(device) | | 模型无可训练参数 | 检查 sum(p.numel()) | | 未启用梯度计算 | 使用 with torch.enable_grad() | | 显存利用率低 | 使用 PyTorch Profiler 分析 GPU 操作 |


    如有更多关于 MobileMamba 的具体实现细节,欢迎提供代码片段,我可以进一步帮助你定位问题。

    评论

报告相同问题?

问题事件

  • 修改了问题 8月4日
  • 修改了问题 8月4日
  • 创建了问题 8月4日