集群配置torch踩雷记录

随着期末考试结束,本人重启了被四大原理stall了很久很久的复现工程,首先便是我们最喜欢的配环境啦

第一次尝试

环境环境,conda create,往里塞能看得见的requirements.txt,大胜,于是乎开始下载学长写的代码pip install -e .,再次大胜,遂骄傲,开始复现,大败

定睛一看,TypeError:unsupported operand type(s) for |: ...

?什么玩意,或运算符用错了吗?进调用栈一看,椅子电脑虾,怎么把类型标注里面的|当成或运算符了啊

上网一查,发现是python版本过低导致的,直接升版本,干到3.10,再次复现,依旧大败

定睛一看,哎哟老熟人deepspeed找不到卡,开始翻找之前的博客,找到啦!

解决之后开始井喷ModuleNotFound,于是疯狂pip,直到……

被apex打败

遇到了报错No module named 'apex.multi_tensor_apply',我一条pip install apex,毫无作用

上网查询,告诉我apex需要从源码手动编译下载,而不能直接下载,于是clone下来一切顺利,跟着readme走呀走呀走呀,还剩最后一步之时,报错啦Torch did not find available GPUs on this system

?怎么又找不到卡,你****

研究torch

研究一顿之后发现,我的torch是在某一个requirements.txt里面被偷偷安装的,然后下成了cpu的版本,这一项可以通过以下几种方式来确定:

  1. pip list查看torch的版本,如果后面没有+cuxxx则是CPU,反之其中的xxx则为CUDA版本(这个不是说加粗!)
  2. python -c "import torch; print(torch.cuda.is_available())",如果是False则代表是CPU版本的
  3. python -c "import torch; print(torch.version.cuda)",如果是None则代表是CPU版本的

既然如此,由于我现在的这个环境断断续续往里拉了好几天(中间经历了美妙的信号处理原理考试和编译原理考试),我决定直接开一个新环境来装

在脚本中首先通过module load加载cuda/12.1,再按照官网指示运行命令

1
conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia

之后确实开始下载了,恰逢我腹中绞痛,头晕脑胀,只能休息等待(没想到这窜窜病持续了两天半呜呜呜)

一天之后,待到身体略微恢复了些力气的时候,上服务器看了一下节点状态,懵了

?不是你一个conda install跑了28小时?源在火星吗?

遂鲨掉这个进程,开始询问学长,在学长的悉心指导下,终于弄明白了torch的安装流程

战胜torch

首先需要知道的是,这个服务器是由slurm集群管理的,同时是linux_aarch64架构,因此很多情况下,直接pip install并不能够安装带有cuda版本的包,或者根本不能安装到包,可能因为:

  • 登录节点上没有GPU资源
  • pip install没法指定包兼容的处理器版本

因此这种情况下,我们需要下载whl文件之后手动编译,whl文件可以理解为一个python安装包的压缩包,直接利用pip install xxx.whl就可以编译安装对应的包,通常whl文件的文件名有以下规范:

1
torch-2.3.0+cu121-cp310-cp310-linux_aarch64.whl

按照-来进行划分,从前到后分别为:包名、包版本、python版本(cpxxx表示包含了C语言扩展的Python)、ABI标签(代表二进制兼容性)、支持的平台架构

仔细查看集群使用手册之后发现,这个集群已经帮助我们下好了很多很多版本的轮子,于是直接跑到对应文件夹下开始下载,下载完成后测试,大败

报错为

1
libcudart.so.12: cannot open shared object file: No such file or directory

上网查询,发现是没有cuda或者版本不对,于是通过module load加载对应版本的cuda,解决了这个问题,结果出现:

1
ImportError: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by xxx/lib/python3.10/site-packages/torch/lib/libtorch_python.so)

和学长一起奋力思考之后决定,重装一遍!

这次留了个心眼,在pip install和测试之前,分别跑了module load对应版本的cuda cudnn gcc,大胜利!

终于成功装上了带cuda的torch了呜呜呜

注意每次import torch之前都需要module load