循环训练时出现太多打开文件错误



我有一个非常简单的设置,如下所示:

while True:
model.fit(mySeqGen(xx), ..., use_multiprocessing=True, workers=8)
<stuff>
model.save_weights(fname)
gc.collect()

它运行很长时间,但如果过夜,我会发现它在每个循环迭代中都会生成OSError: [Errno 24] Too many open files。完整堆栈跟踪在另一台机器上,但它有多个对多处理的引用。

这肯定与实际的文件无关,而是在引擎盖下创建的线程未正确清理的副产品。有没有一种简单的方法可以让这个循环在长时间内保持稳定,并在每次传球后清理干净?

这可能是系统限制。

输入以下命令:

$ ulimit -n

一千二十四

结果是1024,这意味着系统被限制为同时打开1024个文件。

修改方式:

  1. 减少线程数量以满足此限制(仅方法(。

  2. 增加此限制。

a。Ulimit-N 2048(此方法暂时修改,当前有效。退出后恢复原始设置(

b。修改以下文件

sudo-vim/etc/security/limits。conf

软文件2048

硬盘文件2048

保存后重新启动。

*无限制

数据段长度:ulimit - D unlimited

最大内存大小:ulimit - M unlimited

堆栈大小:ulimit - s unlimited

您可以监控进程打开的线程、连接和文件的数量:

import psutil
p = psutil.Process()
while True:
model.fit(mySeqGen(xx), ..., use_multiprocessing=True, workers=8)
<stuff>
model.save_weights(fname)
gc.collect()
print(f'files={len(p.open_files())} conn={len(p.connections(kind='tcp'))} threads={p.num_threads()}')

至少你会知道该解决什么问题。

相关内容

  • 没有找到相关文章

最新更新