之前的文章已经介绍过 Slurm 基本指令的学习,于是我准备结合前面的知识来记录如何在超算平台搭建深度学习环境~
我的教程首先是本着物尽其用的原则,先看看超算预装了什么~
手动挡
- 查看队列:
whichpartition
- 申请节点:
salloc -p 队列名 -N 1 --gres=dcu:1
,ps:看看自己账号单节点能申请几个dcu;salloc 具体参数根据情况配置,我这里只是假设。(等待出现:salloc: Nodes b09r3n18 are ready for job
,后面可能附带冲突关系不用理会!,目测是因为开辟的新节点与当前环境变量冲突,开辟的新节点由于需要 DCU,会自动加载compiler/devtoolset/7.3.1
、mpi/hpcx/2.11.0/gcc-7.3.1
、compiler/dtk/22.10.1
(这里随着时间变化可能不同)),什么是冲突?欢迎看我的上一篇介绍。 - 登录节点:
ssh b09r3n18
,注意登录之后,原来的环境变量已经被切换了 - 这一步可能省略,由于我要加载的 pytorch 需要 21.04 版本的 dtk,因此需要使用:
module switch compiler/dtk/21.04
- 加载 pytorch 预设环境变量:
module load apps/Pytorch/1.8.0-dtk21.04-cp6
- 启动 python 环境测试,
python3
,注意:有些超算平台可能存在 python2,如果输入 python,会进入 python2,而我们可以通过module show apps/Pytorch/1.8.0-dtk21.04-cp6
看到这是安装 python3.6.8 下的。 输入
import torch
、torch.cuda.is_available()
、torch.__version__
,如果输出无误,就可以 ctrl+D 退出 python 环境,在登录的节点运行python xxx.py --batch_size=8
->当然这是单卡运行自动挡-sbatch 式
自己建立.slurm 作业提交脚本,
首先也需要查看队列:whichpartition
以及查看面板的可用资源,再编写。不能在登录的计算节点里使用作业提交脚本,当提交 slurm文件,相当于使用 salloc 分配,系统会自动进入开辟的空间。
test.slurm:
#!/bin/bash # 作业名称 #SBATCH -J weather_classification # 指定队列,通过`whichpartition`看 #SBATCH -p ty_normal # 节点数,可以看首页的可访问队列有多少空闲节点 #SBATCH -N 1 # 单节点任务数 #SBATCH --ntasks-per-node=1 # 单节点1个dcu #SBATCH --gres=dcu:1 #SBATCH -o %j.out #SBATCH -e %j.err module swtich compiler/dtk/21.04 module load apps/Pytorch/1.8.0-dtk21.04-cp6 python test.py
test. py:
import torch print(torch.cuda.is_available()) print(torch.__version__)
最后执行 sbatch test.slurm
从零开始制作自己的环境教程
当然,官方安装的有些包是不存在的,这时候我们就不能依赖官方的,需要激活 conda 环境以安装。
- 首先通过
module avail
看看有什么版本的 anaconda,正好看到 apps/anaconda3/5.2.0,于是通过module load apps/anaconda3/5.2.0
激活。如果你觉得版本老,就可以自己安装一个conda环境了。 minicoda安装:
wget https://repo.anaconda.com/miniconda/Miniconda.....sh -i https://pypi.tuna.tsinghua.edu.cn/simple/
或者使用本地安装包/public/software/apps/DeepLearning/whl/Miniconda/
,怎么安装就不说了,教程太多了,注意: 执行~/miniconda3/bin/conda init
后,slurm脚本里不要执行source ~/.bashrc
启动conda,而是执行source ~/miniconda3/etc/profile.d/conda.sh
来代替。- 然后
conda create -n torch python=3.6.8
创建环境,source activate torch
在这个环境安装一些不在系统预存的包需要附带-i https://pypi.tuna.tsinghua.edu.cn/simple
加速安装。(注销是:source deactivate
) 使用
pip3 install /public/software/apps/DeepLearning/whl/dtk21.04.1/torch-1.7.0a0-cp36-cp36m-linux_x86_64.whl
安装适配 DCU 的 pytorch 教程- 其它东西都在这
/public/software/apps/DeepLearning/whl/
目录找找,能安装 paddlepaddle、tensorflow 等等 - dtk 能新则新,新版修了前面的bug,python版本也是,比如最新的23.10就能支持python3.11了。
- 注意 whl 和python版本关系
- 其它东西都在这
之后安装自己需要的包即可。注意:在老版本 python 安装 opencv,需要指定版本,例如版本 4.3.0.38,不然会报错。这也是老版问题 (如果没有报错就不需要!) :当引用 torch 可能会出现如下错误,
ImportError: libglog.so.0: cannot open shared object file: No such file or directory
,这时需要vi ~/pytorch_env.sh
- `export LD_LIBRARY_PATH=/public/software/apps/DeepLearning/PyTorch_Lib/lib:/public/software/apps/DeepLearning/PyTorch_Lib/lmdb-0.9.24-build/lib:/public/software/apps/DeepLearning/PyTorch_Lib/opencv-2.4.13.6-build/lib:/public/software/apps/DeepLearning/PyTorch_Lib/openblas-0.3.7-build/lib:$LD_LIBRARY_PATH
`
- 保存并退出,然后执行
source ~/pytorch_env.sh
。以后每次登录新的节点时,都要执行一次。
编写脚本
#!/bin/bash #SBATCH -J weather_classification #SBATCH -p ty_normal #SBATCH -N 1 #SBATCH --ntasks-per-node=1 #SBATCH --gres=dcu:1 #SBATCH -o %j.out #SBATCH -e %j.err module load apps/anaconda3/5.2.0 source activate torch module switch compiler/dtk/21.04 python test.py
如果是训练想加快数据集加载,看问题6
如果你是自己安装的conda,#!/bin/bash #SBATCH -J weather_classification #SBATCH -p ty_normal #SBATCH -N 1 #SBATCH --ntasks-per-node=1 #SBATCH --gres=dcu:1 #SBATCH -o %j.out #SBATCH -e %j.err source ~/miniconda3/etc/profile.d/conda.sh #激活conda命令 source activate torch #激活自定义的虚拟环境 module switch compiler/dtk/21.04 python test.py
这里使用swtich,你还可以直接
module purge #清除默认环境 module load compiler/devtoolset/7.3.1 mpi/hpcx/2.11.0/gcc-7.3.1 #加载基础的环境 module load compiler/dtk/23.10 #加载对应安装torch的dtk模块
可能的问题
可能会遇到如下问题:
- 有时候输出
sbatch: error: Batch job submission failed: Requested node configuration is not available
,说明申请的资源不可取,太大了。 - 在AC平台,并不是例如可用资源:CPU64核,加速卡8卡,在一个节点申请中就能全部用上,你还要看可访问的队列支持什么情况。例如你的AC首页写着队列情况是
7285-32C-128G-4卡
,说明单节点最高配置为32核4卡。在单节点的时候,你可以跑1卡,2卡,3卡,4卡,但在多节点,例如2节点的时候,最好跑8卡。如果是5卡,那么就要设置5个节点,每节点1卡,非常浪费资源,说了这么多,一般我们只要测试1卡,2卡,4卡,8卡...2的几次方。这样可以充分使用资源。 - 如果你跑奇数卡,很容易报错:
RuntimeError: HIP/CUDA error: invalid device ordinal
识别不了GPU设备个数的错误 - 如果报错:
More processors requested than permitted
或者你提交的任务一直在排队,是因为申请的CPU核对不上你的任务要求。 - 有时候你觉得按上面的日志产生太多了,你可以把
#SBATCH -o %j.out
改成#SBATCH -o ./logs/%j.out
,把#SBATCH -e %j.err
改成#SBATCH -e ./logs/%j.err
,这样会在指定目录生成,但是AC平台还很坑的是,有时候你的任务一直在排队,还可能是因为你这个指定目录他没法创建,所以自己创建更保险,有时候他又会自动创建,真的很玄学。
6.如何加快数据集读取,在torch.utils.data.DataLoader
里面一般是有num_workers
,这里参数要小于等于-c
。
小技巧
提交作业之后,因为我们的sh包含了输出日志,因此可以通过tail -f 日志名
查看。
我们还可以ssh登录计算节点,使用watch rocm-smi
,默认1秒看dcu显存情况,如果要更改时间,使用watch -n x rocm-smi
,x秒刷新一次。
嗯?计算节点id忘了怎么办?squeue查看到的nodelist下面对应的内容😜
介绍有意思的加载环境
在前面我们要么是通过module加载conda环境,要么是自己安装的,但是你看,你要么load一下,要么还要激活conda环境,实际上我们把conda安装在home目录之后,python环境也就在这里,我们可以在目录下,写个脚本,后面直接通过source env.sh
就可以来选择对应的conda环境了,无需再加载了。
#!/bin/bash
read -t 30 -p "conda env name:" conda_env_name
py_version="python3.8"
user=<你的名字>
export PATH=/xddata/home/$user/.conda/envs/$conda_env_name/bin:$PATH
export PATH=/xddata/home/$user/.conda/envs/$conda_env_name/lib:$PATH
export PATH=/xddata/home/$user/.conda/envs/$conda_env_name/include:$PATH
export PATH=/xddata/home/$user/.conda/envs/$conda_env_name/share:$PATH
export PYTHONPATH=/xddata/home/$user/.conda/envs/$conda_env_name/lib/$py_version/site-packages:$PYTHONPATH
echo 'now python=' $(which python)
注意py_version版本~
最后,提醒大家:
丹规千万条,核时第一条。关炉不规范,钞票两行泪!
手动挡,一定记得要释放啊!
自动挡,注意飙车时间。