Pytorch训练深度强化学习时CPU内存占用一直在快速增加

最近在用MATD3算法解决多机器人任务,但是在训练过程中,CPU内存一直在增加(注意,不是GPU显存)。我很头疼,以为是算法代码出了问题,导致了内存泄漏,折腾了1天也没解决。后来用memory_profiler对代码分析,才发现是这个函数占用的内存一直在增加:

def store_transition()

说白了,就是经验池的存储函数,也就是因为一直往经验池里加数据导致内存增加。那为啥以前我没感觉到内存明显增加呢?想了想,可能是因为我最近修改了算法输入,把图像作为状态输入的一部分了,此外换了配置更好的电脑,程序运行速度也提升了。二者综合作用下,内存才会有明显增加,从而被我发现!(我真是脑子抽了,这么简单的问题一直没想到。。。。)

解决方法:终极方法就是换大内存。。。。一些小技巧的话也有,来看看ChatGPT是怎么说的:

  1. 降低图像分辨率

    减小输入图像的分辨率。较低分辨率的图像需要更少的内存。您可以在图像输入被神经网络处理之前使用图像缩放技术来减小图像尺寸。但要小心,不要将分辨率降低到丢失重要细节的程度,因为这可能会对学习产生负面影响。

  2. 使用灰度图像

    考虑将彩色图像转换为灰度图像。灰度图像比彩色图像需要的内存明显少。

  3. 限制重放缓冲区大小

    减小经验重放缓冲区的大小。这种方法将限制存储在内存中的数据量,但也可能影响代理的学习质量。您需要在缓冲区大小和训练稳定性之间取得平衡。

  4. 实施有限经验重放

    有限经验重放(PER)是一种技术,根据学习进展为经验分配不同的优先级。您可以使用PER来更有效地分配内存,将更高的优先级分配给对学习更有信息价值的经验。

  5. 使用状态预处理器

    实施状态预处理器,用于在将图像输入馈送到神经网络之前处理图像以提取相关信息并减小输入数据的维度。这可以帮助减小内存占用。

  6. 批处理

    不要一次处理重放缓冲区中的所有经验,而是执行批处理。这包括在每个训练迭代中抽样一个较小的经验批次。虽然这不会直接减小内存使用,但可以更有效地管理内存。

  7. 分布式计算

    如果可行,考虑使用具有多台计算机或GPU的分布式计算环境。分布式训练可以将内存使用分散到不同的资源中。

  8. 优化代码

    确保您的代码具有高效的内存使用。审查数据加载、处理和模型训练流程,以最小化内存消耗。避免不必要的内存复制,并使用生成器或数据流水线来实时加载和处理数据。

  9. 监控内存使用

    使用内存分析工具监控训练过程的内存使用情况。这有助于识别特定的内存热点或内存泄漏。

  10. 批量图像压缩

    如果可能,在将图像数据存储到重放缓冲区之前对图像数据进行压缩。压缩可以显着减小图像数据的内存占用。

  11. 增量训练

    而不是训练一定数量的剧集,考虑增量训练。将代理分成较小的块进行训练,并定期保存和清除经验重放缓冲区。这样,您可以更有效地控制内存使用。

PS:前3点我觉得挺好用的,有其他好的手段也欢迎大家补充!

相关推荐
封步宇AIGC18 分钟前
量化交易系统开发-实时行情自动化交易-Okex K线数据
人工智能·python·机器学习·数据挖掘
封步宇AIGC20 分钟前
量化交易系统开发-实时行情自动化交易-Okex交易数据
人工智能·python·机器学习·数据挖掘
z千鑫23 分钟前
【人工智能】利用大语言模型(LLM)实现机器学习模型选择与实验的自动化
人工智能·gpt·机器学习·语言模型·自然语言处理·自动化·codemoss
小爬虫程序猿23 分钟前
如何利用Python解析API返回的数据结构?
数据结构·数据库·python
shelly聊AI24 分钟前
AI赋能财务管理,AI技术助力企业自动化处理财务数据
人工智能·财务管理
波点兔25 分钟前
【部署glm4】属性找不到、参数错误问题解决(思路:修改模型包版本)
人工智能·python·机器学习·本地部署大模型·chatglm4
佚明zj1 小时前
全卷积和全连接
人工智能·深度学习
一点媛艺3 小时前
Kotlin函数由易到难
开发语言·python·kotlin
qzhqbb4 小时前
基于统计方法的语言模型
人工智能·语言模型·easyui
冷眼看人间恩怨4 小时前
【话题讨论】AI大模型重塑软件开发:定义、应用、优势与挑战
人工智能·ai编程·软件开发