集群开发过程中遇到的一些问题的记录
由于科研需求,我需要在一个集群上完成一些实验,这也是本人第一次接触集群与HPC,所以遇到了很多问题,在此作简要记录,以便后期需要
注:集群是aarch64架构
复现WebRL
WebRL是一个基于现有模型,为其添加一个RL来实现更好效果的WebAgent,我的工作是复现这篇文章,由于这个仓库并没有在github上开源,因此缺少了很多community的帮助,并且其README写的非常高屋建瓴,如果直接跟随的话会报大错,经过了大概7h的研究,现在能够在这个集群上初始化了
在写这些文字的时候,llama模型的权限还没申请到,因此还不能确保开始train之后没问题
Update:数据集没开源🤡
服务器登录
用ssh即可,登录没什么要说的,不过服务器是有权限ban掉免密登录操作的,建议在遇到一直无法免密的时候先询问一下负责人
SLURM指令
由于我们一开始登录到集群的时候是到了登录节点,这个节点下是没有卡的,因此查看会显示没卡,我们需要先进入一个计算节点
1 | srun --pty --gres=gpu:1 bash # 进入交互模式,拿到一张卡 |
注:--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
旧版本的代码复制过来(异术)