记一个不常见SLURM Device Busy BUG
运行环境
- SLURM 深度学习集群。
- 系统:Ubuntu 20.04.5 LTS
- 造成BUG的程序:深度学习训练代码。
- 具体造成BUG的库:python的
multiprocessing
。
现象
训练了几十个epoch都没有问题,突然狂报这个错:
1
2
3
4
5
6
7
8
9
10
11
12
13
14OSError: [Errno 16] Device or resource busy: '.nfsf7f2453cdbd6a8c40001fce6'
Traceback (most recent call last):
File "/work/<USER>/anaconda3/envs/ROMP/lib/python3.9/multiprocessing/util.py", line 300, in _run_finalizers
finalizer()
File "/work/<USER>/anaconda3/envs/ROMP/lib/python3.9/multiprocessing/util.py", line 224, in __call__
res = self._callback(*self._args, **self._kwargs)
File "/work/<USER>/anaconda3/envs/ROMP/lib/python3.9/multiprocessing/util.py", line 133, in _remove_temp_dir
rmtree(tempdir)
File "/work/<USER>/anaconda3/envs/ROMP/lib/python3.9/shutil.py", line 734, in rmtree
_rmtree_safe_fd(fd, path, onerror)
File "/work/<USER>/anaconda3/envs/ROMP/lib/python3.9/shutil.py", line 690, in _rmtree_safe_fd
onerror(os.unlink, fullname, sys.exc_info())
File "/work/<USER>/anaconda3/envs/ROMP/lib/python3.9/shutil.py", line 688, in _rmtree_safe_fd
os.unlink(entry.name, dir_fd=topfd).nfs<xxxxxxxxxx>
后面的这一串符号会不断变化,其他报错信息基本稳定。
解决
经过查询得到,OSError [Errno 16] Device or resource busy 往往是某个资源正在被其他程序访问。然而这里的“资源”都是
multiprocessing
库用来在进程间交流信息的临时文件。当该错误和
.nfs<xxxxxxx>
一起出现时,表明该资源位于一个网络位置上。这里是因为集群的储存都是以挂载的网络位置方式进行的。经过一番Google,最初认为可能原因和某几个帖子一样,是disk quota已经用光了,所以会无法新建文件等,所以我先删除了一波东西,然而error依旧,且往各个位置下载大文件也并不会报类似的错误,所以暂时认为不是这个原因。
最终解决方案是,因为这些文件都是临时文件,所以问题一定是出在了储存临时文件的位置处,大概率是集群本身的问题(集群还是挺经常出各种奇怪问题的),所以只需要在程序开始处重新指定临时文件存储目录即可。
值得注意的是,跑代码需要在GPU node上跑,每个node都有自己的临时文件文件夹(估计是为了加速,把cache存到离本机最近的物理储存位置),所以更改的目标位置可以就设为
/tmp
。具体代码如下(Python):
1
2import tempfile
tempfile.tempdir = '/tmp'注意需要将这两行代码放到程序入口文件的最上方。如果你的暂存文件夹本来就是
/tmp
,换成任意一个你喜欢的路径即可。