在超级计算机中挂载大型数据集压缩包

背景

我最近在搞 AffectNet 数据集,里面一百多万个文件。我用的是 Setonix 超级计算机,使用了 Lustre 文件系统,并且提供了一个 /scratch 分区给我们放临时文件。但是这个分区限制了文件数量为100万个,所以我在解压数据集的时候就遇到了报错。正常的解决办法是给他们提交工单,请求提高文件数量限制。澳洲的办事效率你们懂的,周一提交的工单,来回还问了几个问题,最后周五才给我扩容。求人不如求己,对于这种问题其实有替代的解决方案。

原理

我的数据集是用 tar 格式打包的,对于大多数的压缩包(.tar 文件本质上只是一个归档文件而不是压缩文件,不过这里也用"压缩包"统一称呼),其实有办法可以直接挂载到一个目录。我们用到的技术叫 FUSE —— Filesystem in Userspace (用户空间文件系统)。也就是说我们不需要 root 权限就能把压缩包挂载到某个目录上实现对里面内容的读取。经过一番搜索,python 下有 ratarmount 这个库可以实现这个功能。

操作步骤

因为这是超算,需要用 module load 加载对应的模块后才能用 python,所以我这里要先加载模块,然后激活我之前用的虚拟环境:

module load pytorch/2.2.0-rocm5.7.3
source /home/liyumin/software/venv/bin/activate

如果本来就能用 python,那上面的步骤可以跳过。

然后通过 pip 安装 ratarmount

pip install ratarmount

装完之后就可以执行命令挂载了:

ratarmount train_set.tar train_set

这个命令的意思是将 train_set.tar 挂载到 train_set 目录。

有可能会遇到下面的报错:

Created mount point at: /scratch/pawsey1001/liyumin/datasets/AffectNet8/train_set
fusermount: mounting over filesystem type 0x0bd00bd0 is forbidden

这是因为这个文件系统下面不让挂载。这个问题可以通过更换路径解决,例如我挂载到 tmp 目录:

ratarmount train_set.tar /tmp/train_set

没有报错就说明成功了。 现在我们访问 /tmp/train_set 目录,就等于访问 train_set.tar 里面的内容了。 这样子我们就实现了不解压来访问压缩包内的文件。

用完记得卸载目录:

fusermount -u /tmp/train_set