记一个不常见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
    14
    OSError: [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
    2
    import tempfile
    tempfile.tempdir = '/tmp'

    注意需要将这两行代码放到程序入口文件的最上方。如果你的暂存文件夹本来就是/tmp,换成任意一个你喜欢的路径即可。