集群开发过程中遇到的一些问题的记录

由于科研需求,我需要在一个集群上完成一些实验,这也是本人第一次接触集群与HPC,所以遇到了很多问题,在此作简要记录,以便后期需要

注:集群是aarch64架构

复现WebRL

WebRL是一个基于现有模型,为其添加一个RL来实现更好效果的WebAgent,我的工作是复现这篇文章,由于这个仓库并没有在github上开源,因此缺少了很多community的帮助,并且其README写的非常高屋建瓴,如果直接跟随的话会报大错,经过了大概7h的研究,现在能够在这个集群上初始化了

在写这些文字的时候,llama模型的权限还没申请到,因此还不能确保开始train之后没问题鸣鸣鸣别骂我

Update:数据集没开源🤡

服务器登录

用ssh即可,登录没什么要说的,不过服务器是有权限ban掉免密登录操作的,建议在遇到一直无法免密的时候先询问一下负责人

SLURM指令

由于我们一开始登录到集群的时候是到了登录节点,这个节点下是没有卡的,因此查看会显示没卡,我们需要先进入一个计算节点

1
2
srun --pty --gres=gpu:1 bash # 进入交互模式,拿到一张卡
nvidia-smi # 或gpustat等命令

注:--gres=gpu:1是旧版语法,表示申请1个gpu计算资源,新版语法写为--gpus=1

环境配置

如果需要使用NVIDIA的显卡,则需要使用对应的编程语言CUDA,CUDA对应的编译器为nvcc(NVIDIA CUDA Compiler),用于将CUDA程序编译成可以在NVIDIA GPU上运行的代码
可以类比C语言和gcc的关系

在conda环境下安装nvcc非常简单,例如:

1
conda install nvidia/label/cuda-12.1.0::cuda-nvcc

这代表会通过nvidia渠道,在当前环境下安装CUDA 12.1.0版本的nvcc编译器。

之后可以根据仓库中的README进行操作,上述步骤基本不会在任何README中出现

有的README中会让我们使用pip install -e .的命令,这条命令的本意就是往当前环境下安装一堆python包,其详细含义是:

  • .代表当前路径,也即会在当前路径下开始搜索,将所有的python包安装到环境中
  • -e代表采用editable模式,也即不会将路径下的所有包都下载到环境中,而是建立了一个软连接,我的理解是在环境中存了一个引用,这样我们可以直接修改路径下的代码,而不需要反复的pip install
  • 通常采用这个方式的原因是,我们希望将当前的包更够更方便的被使用,避免使用繁杂的路径或跨根目录导入

环境变量

这个任务中,我使用的是LLama-Factory这个库的某个版本来train一个baseline,根据README,我需要使用llamafactory-cli来train,遇到的第一个问题是环境变量问题,报错如下

1
ValueError: Please use `FORCE TORCHRUN=1` to launch Deepspeed training

因此按照其指示设置全局变量即可,在sbatch提交的脚本中添加

1
export FORCE_TORCHRUN=1

即可

随后遇见一个AssertError,排查(直接看源码)后发现同样是环境变量没设置好,添加:

1
export NPROC_PER_NODE=$SLURM_NTASKS_PER_NODE

后面的环境变量由Slurm提供

版本问题

最终我们遇到了版本问题,在解决后发现是torch版本与deepspeed版本不兼容导致的

首先,deepspeed版本过高会导致无法检测到集群中的CUDA,遂降版本0.15.3->0.13.5

检测不到CUDA会导致其去编译一些xx/deepspeed/ops/csrc/cpu/路径下的文件,但是由于本集群是aarch64架构,因此出现了C++编译失败的问题,可以参考下面这个issue

降版本之后,出现了ImportError,参考下面的issue,简略来说就是把torch旧版本的代码复制过来(异术)