pytorch计算模型的显存占用率和节省内存技巧

本文探讨了在Pytorch中优化显存使用的多种策略,包括调整Batch-size、使用半精度float16、分步计算模型、软batch训练、减少全连接层及优化optimizer等。并提供了详细的代码示例和跟踪显存变化的工具。

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

计算模型的显存占用率

节省内存的技巧

  • 减小Batch-size;
  • 减小图片尺寸;
  • 将计算过程分为多步,保存中间结果再计算后面一半的模型,参考此文
  • 使用软batch训练model,即通过修改优化算法,是网络进行N次前向传播,但只进行一次反向传播;
  • 使用pooling,减小特征图的size;
  • 减少全连接层的使用。relu(inplace=true),inplace_abn使用半精度float16;
  • optimizer的变换使用,理论上,sgd<momentum<adam,可以从计算公式中看出有额外的中间变量;
  • Depthwise Convolution;
  • 尽可能使用inplace操作, 比如relu 可以使用 inplace=True;
  • 不要一次性把数据加载进来,使用 pytorch 的 Dataset api;
    大致程序如下:

    from torch.utils.data import DataLoader
    data_train_loader = DataLoader(data_train, batch_size=64, shuffle=True)
    for batch_idx, samples inenumerate(data_train_loader):
    net(samples)

优化pytorch代码

### 解决PyTorch程序分配所有可用GPU内存的方法 在处理大规模模型或数据集时,可能会遇到CUDA内存不足的问题。为了使PyTorch尽可能多地利用GPU上的所有可用内存,可以采取以下几种策略: #### 调整`PYTORCH_CUDA_ALLOC_CONF` 通过配置环境变量`PYTORCH_CUDA_ALLOC_CONF`来优化CUDA内存管理。此参数允许调整最大分割大小(`max_split_size_mb`)以减少碎片化并更高效地使用显存[^1]。 ```bash export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512 ``` #### 设置`torch.cuda.empty_cache()` 虽然这不会增加总的可分配量,但在某些情况下清理缓存可以帮助回收不再使用的部分内存空间,从而间接提高整体利用率[^4]。 ```python import torch torch.cuda.empty_cache() ``` #### 修改批处理尺寸(batch size) 适当减小批量大小能够有效降低单次迭代所需的临时存储需求,使得整个训练过程可以在有限的资源下顺利执行。尽管这样做可能会影响收敛速度最终效果,但对于硬件条件受限的情况来说是一个可行的选择[^2]。 #### 利用混合精度(Half Precision Training) 采用FP16半精度浮点数代替传统的FP32全精度表示法,在不影响计算准确性的同时大幅减少了所需占用的空间。需要注意的是,并不是所有的网络结构都支持这种模式,具体取决于所使用的框架版本以及底层库的支持程度[^3]。 #### 启用异步预取(Prefetching with `pin_memory=True`) 对于输入管道的数据加载阶段而言,开启`pin_memory`选项可以让CPU端准备好的批次直接映射至GPU地址空间而无需经过额外拷贝操作,进而加快传输效率并节省中间过渡区域内的开销。 ```python train_loader = DataLoader(dataset=train_dataset, batch_size=32, shuffle=True, num_workers=4, pin_memory=True) ``` 以上措施综合运用有助于最大化挖掘现有设备潜力,确保应用程序能够在接近理论极限的状态下稳定工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值