Pytorch CPU OOM在Linux上杀死ssh服务器

2q5ifsrm  于 4个月前  发布在  Linux
关注(0)|答案(2)|浏览(85)

我遇到了一个问题,当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,因为如上所述,我也只是对操作系统的东西有点熟悉,我犹豫着用它做任何事情,以免我破坏了一些我不能修复的东西。

jv2fixgn

jv2fixgn1#

您可以尝试使用choom命令优化oom_score_adj

choom -n 1000 -- python yourscript.py

字符串
引用man proc关于/proc/<pid>/oom_score_adj
[..]调整用于选择在内存不足的情况下杀死哪个进程的badness heuristic。[badness value is]范围从0(从不杀死)到1000(总是杀死),以确定目标进程。
如果你不确定OOM杀手是否处于活动状态,你可以用journalctl -ke检查内核日志中发生了什么。(如果你不得不重新启动,添加--boot -1。)它看起来像这样:

  • 内存不足:Killed process 68412(python3)total-vm:70398288kB,anon-rss:61052944kB,file-rss:2304kB,shmem-rss:0kB,UID:1000 pgtables:119712kB oom_score_adj:1000*

进一步阅读:

rekjcdws

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 ^导入以约束

import psutil
import resource

#https://www.geeksforgeeks.org/python-how-to-put-limits-on-memory-and-cpu-usage/

PERCENTAGE_MEMORY_ALLOWED = 0.8

# Calculate the maximum memory limit (80% of available memory)
virtual_memory = psutil.virtual_memory()
available_memory = virtual_memory.available
memory_limit = int(available_memory * PERCENTAGE_MEMORY_ALLOWED)

print(f'{memory_limit} memory limit, available: {available_memory}')

# Set the memory limit
resource.setrlimit(resource.RLIMIT_AS, (memory_limit, memory_limit))

字符串
(我将继续讨论OOM杀手的东西,因为它很有趣,但我想提出简单的解决方案)

相关问题