我遇到了一个问题,当CPU OOM发生时,pytorch(用2.0.1+cu117测试)不会正常失败。具体来说,我失去了所有ssh连接和Xserver对VM或裸机的访问。
我没有测试过这种情况是否发生在其他操作系统上。
我发现的唯一解决方案是直接重新启动机器(通过vsphere或只是一个电源按钮)。
我曾考虑过将python别名化(考虑conda env切换)以将每个进程添加到cgroup中,这直接限制了内存使用,但我被告知,与cgroups混在一起是一个坏主意。
很难判断一个模型将占用多少内存,我需要一种优雅的方式来杀死它,而不会杀死我的ssh服务器。
一些注解:我已经在两个设备上尝试过了,一个是虚拟机,一个是裸机,都是Ubuntu 22.04,我相信两者都启用了操作系统级的OOM杀手。这在GPU OOM中是不可重现的,因为这实际上会杀死进程并返回典型的GPU OOM错误,而只是在RAM中。
我试过将RLIMIT设置为https://www.geeksforgeeks.org/python-how-to-put-limits-on-memory-and-cpu-usage/,但这并没有解决我的问题。
我还考虑过在训练中添加一个条件,检查可用内存和中断,但这似乎是一个不干净的解决方案。
我还没有尝试过cgroups,因为如上所述,我也只是对操作系统的东西有点熟悉,我犹豫着用它做任何事情,以免我破坏了一些我不能修复的东西。
2条答案
按热度按时间jv2fixgn1#
您可以尝试使用
choom
命令优化oom_score_adj
:字符串
引用
man proc
关于/proc/<pid>/oom_score_adj
:[..]调整用于选择在内存不足的情况下杀死哪个进程的badness heuristic。[badness value is]范围从0(从不杀死)到1000(总是杀死),以确定目标进程。
如果你不确定OOM杀手是否处于活动状态,你可以用
journalctl -ke
检查内核日志中发生了什么。(如果你不得不重新启动,添加--boot -1
。)它看起来像这样:进一步阅读:
rekjcdws2#
https://www.geeksforgeeks.org/python-how-to-put-limits-on-memory-and-cpu-usage/
^我之前错误地实现了这个(restricted属性上的拼写错误),但这实际上解决了问题,并防止了RAM的过度使用。
https://github.com/daniel-redder/mem_restrict/blob/main/mem_restrict.py ^导入以约束
字符串
(我将继续讨论OOM杀手的东西,因为它很有趣,但我想提出简单的解决方案)