提问人:Daniel Redder 提问时间:11/1/2023 更新时间:11/4/2023 访问量:115
Pytorch CPU OOM 杀死 linux 上的 ssh 服务器
Pytorch CPU OOM kills ssh server on linux
问:
我遇到了一个问题,即 pytorch(使用 2.0.1+cu117 测试)在发生 CPU OOM 时不会正常失败。具体来说,我失去了所有 ssh 连接和对 VM 或裸机的 Xserver 访问权限。
我还没有测试过这是否发生在任何其他操作系统上。
我找到的唯一解决方案是直接重新启动计算机(通过 vSphere 或只是一个电源按钮)。
我考虑过将 python 别名(考虑 conda 环境切换)以将每个进程添加到直接限制内存使用的 cgroup 中,但我被告知弄乱 cgroups 通常是一个坏主意。
很难判断一个模型将占用多少内存,我需要一种优雅的方式来杀死它,而不会杀死我的 ssh-server。
一些注意事项: 我已经在两台设备上尝试过,一台 VM,一台裸机,都是 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,因为如上所述。我也只是对操作系统的东西非常熟悉,我不愿用它做任何事情,以免我破坏了我无法修复的东西。
答:
您可以尝试使用以下命令进行调整:oom_score_adj
choom
choom -n 1000 -- python yourscript.py
引用:man proc
/proc/<pid>/oom_score_adj
[..]调整用于选择在内存不足情况下终止的进程的不良启发式方法。[坏值]的范围从 0(从不终止)到 1000(始终终止),以确定目标进程。
如果您不确定 OOM 杀手是否处于活动状态,可以使用 检查内核日志中发生了什么。(如果必须重新启动,请添加 。它看起来像这样:journalctl -ke
--boot -1
内存不足:终止进程 68412 (python3) total-vm:70398288kB, anon-rss:61052944kB, file-rss:2304kB, shmem-rss:0kB, UID:1000 pgtables:119712kB oom_score_adj:1000
延伸阅读:
- 关于oom_score_adj (unix.stackexchange.com)
- Linux 内存过量使用和 OOM 杀手 (baeldung.com)
评论
cat /proc/swaps
swapoff -a
#https://www.geeksforgeeks.org/python-how-to-put-limits-on-memory-and-cpu-usage/
^ 我之前错误地实现了这一点(限制属性的拼写错误),但这实际上确实解决了问题并防止了RAM的过度使用。
https://github.com/daniel-redder/mem_restrict/blob/main/mem_restrict.py ^ import 约束
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 杀手级的东西,因为它很有趣,但我想提出一个简单的解决方案)
评论