首页 > 其他分享 >神经网络释放GPU显存两种方式(固定or动态)

神经网络释放GPU显存两种方式(固定or动态)

时间:2024-08-29 22:25:58浏览次数:14  
标签:显存 释放 torch epoch 神经网络 cuda memory GPU

固定的批次数后释放显存

固定的批次数后释放显存,比如每训练 100 批次释放一次显存,可以通过在训练循环中添加一个计数器来实现。以下是如何实现这种策略的示例代码:

import torch

def train():
    start_epoch = 0
    end_epoch = 100
    release_frequency = 100  # 每100个批次释放一次显存

    train_loader = DataLoader('训练数据', num_workers=4, pin_memory=True)
    eval_loader = DataLoader('预测数据', num_workers=4, pin_memory=True)
    
    for epoch in range(start_epoch, end_epoch):
        for batch_idx, (data, target) in enumerate(train_loader):
            # 模型训练代码
            # output = model(data)

            # 每训练完固定数量的批次,释放一次显存
            if (batch_idx + 1) % release_frequency == 0:
                torch.cuda.empty_cache()

            # 其他操作

        # 每个epoch结束后,也可以选择释放一次显存
        torch.cuda.empty_cache()

解释与预期效果

  1. 固定批次释放:通过 if (batch_idx + 1) % release_frequency == 0: 判断条件,每 100 个批次释放一次显存。
  2. 显存管理的平衡:这种方式可以减少显存的累积风险,同时避免每个批次都释放显存带来的性能开销。
  3. 灵活调整:如果发现显存占用仍然较高或训练时间较长,可以调整 release_frequency 的值,增加或减少显存释放的频率。

潜在问题

  • 内存占用的逐渐增加:如果训练过程中显存占用过多且释放不及时,可能会出现OOM错误。可以通过监控显存情况,适时调整 release_frequency
  • 显存碎片化:定期释放显存可以减少显存碎片化的可能性,但仍需注意在显存占用较大的情况下,可能需要额外的显存管理措施。

总结

通过这种方式,你可以在固定的批次数后释放显存,确保在显存使用和训练效率之间找到一个平衡点。这种方法在中大型数据集的训练中尤为有效,可以有效防止显存溢出,同时最大化训练速度。


动态策略:

根据显存使用情况动态决定何时释放。可以在程序中监控显存使用,当达到一定阈值时触发释放操作。

实现一个动态策略,根据显存使用情况决定何时释放显存,可以通过以下步骤进行:

1. 监控显存使用情况

你可以使用 PyTorch 提供的 torch.cuda.memory_allocated()torch.cuda.memory_reserved() 函数来监控当前显存的使用情况:

  • torch.cuda.memory_allocated():返回当前被PyTorch占用的显存量。
  • torch.cuda.memory_reserved():返回当前已分配但未使用的显存量。

2. 设置显存使用阈值

设定一个显存使用的阈值,当显存占用超过这个阈值时触发释放操作。阈值可以根据你的显卡的总显存来设定。

3. 实现动态释放显存的逻辑

在训练过程中,定期检查显存使用情况,当显存使用超过设定的阈值时,调用 torch.cuda.empty_cache() 释放显存。

示例代码

import torch

def train():
    start_epoch = 0
    end_epoch = 100
    memory_threshold = 0.8  # 设定显存阈值为总显存的80%
    release_frequency = 100  # 每100批次检查一次显存

    train_loader = DataLoader('训练数据', num_workers=4, pin_memory=True)
    eval_loader = DataLoader('预测数据', num_workers=4, pin_memory=True)

    for epoch in range(start_epoch, end_epoch):
        for batch_idx, (data, target) in enumerate(train_loader):
            # 模型训练代码
            # output = model(data)

            # 每训练完固定数量的批次,检查显存占用情况
            if (batch_idx + 1) % release_frequency == 0:
                allocated_memory = torch.cuda.memory_allocated()
                total_memory = torch.cuda.get_device_properties(0).total_memory
                memory_usage_ratio = allocated_memory / total_memory

                if memory_usage_ratio > memory_threshold:
                    torch.cuda.empty_cache()
                    print(f"显存使用达到 {memory_usage_ratio*100:.2f}%,已释放显存。")

            # 其他操作

        # 每个epoch结束后,也可以选择释放一次显存
        torch.cuda.empty_cache()

解释与调整

  1. 动态检查显存:代码每100个批次检查一次显存使用情况。如果显存占用超过设定的阈值(例如80%),则释放显存。
  2. 显存监控的灵活性:你可以根据具体的显卡情况调整 memory_threshold 的值,或者根据实际需要调整 release_frequency 的检查频率。
  3. 释放频率的调整:如果发现显存使用频繁达到阈值,可能需要降低 release_frequency 或增加 memory_threshold,以避免过于频繁的显存释放。

总结

动态显存释放策略可以根据显存实际使用情况灵活地管理资源,避免了显存不足带来的问题,同时又能保持较高的训练效率。这个方法特别适合在不确定显存使用情况的复杂训练任务中应用。

标签:显存,释放,torch,epoch,神经网络,cuda,memory,GPU
From: https://blog.51cto.com/u_16420155/11870143

相关文章

  • Python深度学习股价预测、量化交易策略:LSTM、GRU深度门控循环神经网络|附代码数据
    全文链接:https://tecdat.cn/?p=37539原文出处:拓端数据部落公众号 分析师:ShuoZhang本文以上证综指近22年的日交易数据为样本,构建深度门控循环神经网络模型,从股价预测和制定交易策略两方面入手,量化循环神经网络在股票预测以及交易策略中的效果,结合一个Python深度学习股价预测......
  • zabbix监控GPU使用率
    vi/etc/zabbix/zabbix_agent.conf(最后添加)UserParameter=GPU.Usage,/usr/bin/nvidia-smi-q|grep-A3"Utilization"|grepGpu|awk'{print$3}'|awk'{a+=$1}END{printa/NR}'#UserParameter=GPU.Memory,/usr/bin/nvidia-smi-q|gre......
  • 图神经网络——GCN聚合原理理解
    本博客基于B站UP主望舒同学的图神经网络系列讲解及代码实现-GCN1。GCN的核心思想:通过邻接矩阵A对结点特征进行聚合,用于更新某结点特征。不同的聚合方式\(\rightarrow\)GCN变体。GCN基于的一个假设:结点的特征与其邻居结点有密切的关系,并且距离越近的邻居关系越大。GCN聚合直......
  • 深入浅出LLamaSharp:打造智能.NET应用,不需GPU也能玩转LLaMA模型
            在如今的.NET社区中,机器学习和人工智能的应用越来越普遍。今天我要给大家推荐一个名叫LLamaSharp的开源项目。这是llama.cpp的C#/.NET绑定,提供了高级的API,使得我们能在本地设备上使用C#/.NET推理LLaMA模型,并且部署它。        LLamaSharp支持在Windo......
  • 图神经网络知识总结——归一化
    本文以GraphWaveNet为主体,总结其使用到的(图)神经网络知识点以及相应代码实现方式。对称归一化邻接矩阵介绍对称归一化邻接矩阵(Symmetricallynormalizeadjacencymatrix),更适合无向图。作用将邻接矩阵归一化处理,使得每一行/列的和等于1(类比“数独”游戏),同时保持矩阵的对称......
  • 错误处理、cuda模型、GPU架构杂谈
    错误处理、cuda模型、GPU架构杂谈错误处理所有编程都需要对错误进行处理,早起的编码错误,编译器会帮搞定,内存错误也能观察出来,但是有些逻辑错误很难发现,甚至到了上线运行时才会被发现,而且有些厉害的bug复现会很难,不总出现,但是很致命,而且CUDA基本都是异步执行的,当错误出现的时候,不......
  • GPU的Fermi 架构与Kepler架构杂谈
    Fermi架构Fermi架构是第一个完整的GPU架构,如图10-15所示。图10-15Fermi架构是第一个完整的GPU架构Fermi架构逻辑图,如图10-15所示,具体数据如下:1)512个加速核心,CUDA核2)每个CUDA核心都有一个全流水线的整数算数逻辑单元ALU,和一个浮点数运算单元FPU3)CUDA核被组织到16个SM上4......
  • 从零开始的PyTorch【03】:优化你的神经网络模型
    从零开始的PyTorch【03】:优化你的神经网络模型前言欢迎回到PyTorch学习系列的第三篇!在前两篇文章中,我们学习了如何构建一个简单的神经网络并训练它,同时探索了数据集调整对模型性能的影响。今天,我们将深入探讨如何优化你的神经网络模型,使其在更复杂的任务中表现更好。我们......
  • 并行动力:用PyTorch在多GPU上释放深度学习潜能
    标题:并行动力:用PyTorch在多GPU上释放深度学习潜能随着深度学习模型变得越来越复杂,单GPU训练往往难以满足需求。幸运的是,PyTorch提供了强大的多GPU训练支持,允许我们利用多个GPU来加速模型的训练过程。本文将详细介绍如何在PyTorch中使用多GPU训练,包括数据并行、模型并行以及......
  • Android 常用的性能分析工具详解:GPU呈现模式
    此篇将重点介绍几种常用的Android性能分析工具:一、Logcat日志选取Tag=ActivityManager,可以粗略地知道界面Displaying的时间消耗。当我们打开一个Activity的时候,log会打印一串log如下:I/ActivityManager﹕Displayedxxx.xxx.xxx/TestActivity:+1s272ms(total+3s843ms)第一......