当前位置: 首页 > news >正文

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点我觉得挺好用的,有其他好的手段也欢迎大家补充!

http://www.lryc.cn/news/199378.html

相关文章:

  • git第一次推送出现推送被拒绝
  • CRC16计算FC(博途SCL语言)
  • setsockopt()函数的用法
  • 【AOP系列】6.缓存处理
  • 云函数cron-parser解析时区问题
  • Android11修改自动允许连接到建议的WLAN网络
  • 基于Qt HTTP应用程序项目案例
  • OpenGL —— 2.7、绘制多个自旋转的贴图正方体(附源码,glfw+glad)
  • linux之perf(8)annotate标注
  • 【广州华锐互动】VR建筑安全培训体验为建筑行业人才培养提供有力支持
  • 【Javascript保姆级教程】运算符
  • 图论与网络优化
  • 【论文复现】基于多模态深度学习方法的单细胞多组学数据聚类(【生物信息学】实验二:多组学数据融合:scMDC)
  • mysql按指定字符截取
  • 搜索引擎-在URL地址栏输入信息,不跳转
  • 10种新型网络安全威胁和攻击手法
  • Elasticsearch:painless script 语法基础和实战
  • 《数据结构、算法与应用C++语言描述》使用C++语言实现数组双端队列
  • TikTok Shop新结算政策:卖家选择权加强,电商市场蓄势待发
  • asp.net特色商品购物网站系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
  • 解决一则诡异的javascript函数不执行的问题
  • 汽车安全的未来:毫米波雷达在碰撞避免系统中的角色
  • 体感互动游戏研发虚拟场景3D漫游
  • 微信小程序获取手机号(2023年10月 python版)[无需订阅]
  • Linux下设置网关以及网络相关命令
  • linux三剑客~sed命令的使用
  • virtualBox虚拟机安装多个+主机访问虚拟机+虚拟机访问外网配置
  • 正点原子嵌入式linux驱动开发——Linux按键输入
  • java--强制类型转换
  • java后端调用接口Basic auth认证