深入浅出:如何在超算平台上高效使用深度学习环境

举报
染念 发表于 2023/11/27 18:37:36 2023/11/27
【摘要】 之前已经介绍过 Slurm 基本指令的学习,于是我准备来一个综合应用即在超算平台搭建深度学习环境。在很多教程都是教大家加载 conda 环境变量,重新安装一个。minicoda安装:wget https://repo.anaconda.com/miniconda/Miniconda.....sh -i https://pypi.tuna.tsinghua.edu.cn/simple/或者使用...

之前已经介绍过 Slurm 基本指令的学习,于是我准备来一个综合应用即在超算平台搭建深度学习环境。

在很多教程都是教大家加载 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来代替。

这个方法我最后会介绍,当然介绍的这种加载方法,本着物尽其用的原则,当然即将开始讲述的办法也是如此,首先先用 module avail 看看有没有可以使用的环境
刚好我在太原超算看到 apps/Pytorch/1.8.0-dtk21.04-cp6,已经有预安装的Module了。

手动挡

  1. 查看队列:whichpartition
  2. 申请节点:salloc -p 队列名 -N 1 --gres=dcu:1,ps:看看自己账号单节点能申请几个dcu;salloc 具体参数根据情况配置,我这里只是假设。(等待出现:salloc: Nodes b09r3n18 are ready for job,后面可能附带冲突关系不用理会!,目测是因为开辟的新节点与当前环境变量冲突,开辟的新节点由于需要 DCU,会自动加载 compiler/devtoolset/7.3.1mpi/hpcx/2.11.0/gcc-7.3.1compiler/dtk/22.10.1(这里随着时间变化可能不同)),什么是冲突?欢迎看我的上一篇介绍
  3. 登录节点:ssh b09r3n18,注意登录之后,原来的环境变量已经被切换了
  4. 这一步可能省略,由于我要加载的 pytorch 需要 21.04 版本的 dtk,因此需要使用:module switch compiler/dtk/21.04
  5. 加载 pytorch 预设环境变量:module load apps/Pytorch/1.8.0-dtk21.04-cp6
  6. 启动 python 环境测试, python3注意:有些超算平台可能存在 python2,如果输入 python,会进入 python2,而我们可以通过 module show apps/Pytorch/1.8.0-dtk21.04-cp6 看到这是安装 python3.6.8 下的。
  7. 输入 import torchtorch.cuda.is_available()torch.__version__,如果输出无误,就可以 ctrl+D 退出 python 环境,在登录的节点运行 python xxx.py --batch_size=8 ->当然这是单卡运行

自动挡-sbatch 式

自己建立. sh 作业提交脚本,
首先也需要查看队列:whichpartition 以及查看面板的可用资源,再编写。

不能在登录的计算节点里使用作业提交脚本,当提交 sh 文件,相当于使用 salloc 分配,系统会自动进入开辟的空间。

  • test. sh:
#!/bin/bash
# 作业名称
#SBATCH -J weather_classification
# 指定队列,通过`whichpartition`看
#SBATCH -p ty_normal
# 节点数,可以看首页的可访问队列有多少空闲节点
#SBATCH -N 1
# 单节点核数
#SBATCH --ntasks-per-node=32  
# 需要1个dcu,后面的数字根据首页的加速卡数量,如果是英伟达GPU,改成gpu:1即可
#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

python3 test.py

注意:默认的moudle下是python3!

  • test. py:
import torch
print(torch.cuda.is_available())
print(torch.__version__)

最后执行 sbatch test.sh

有时候输出 sbatch: error: Batch job submission failed: Requested node configuration is not available,说明申请的资源不可取,太大了。
注意,在AC平台,并不是例如可用资源:CPU320核,加速卡10卡,在一个节点申请中就能全部用上,你还要看可访问的队列支持什么情况。例如你的AC首页写着队列情况是7285-32C-128G-4卡,说明单节点最高配置为32核4卡,任务最多可以提交2个节点,如果你设置单节点是32核1卡,就可以提交10个节点了,当然你可以例举很多种情况,设置单节点1核1卡,cpu和dcu不要超过最高配置!
下面的代码说明你提交了2个节点,共使用64核10卡的资源。(默认c=1)

#!/bin/bash
#SBATCH -N 2  ##节点数为2
#SBATCH --ntasks-per-node=32  ##单节点核数
#SBATCH --gres=dcu:4  ##单节点使用的加速卡数

这里不懂,没关系,见我的上一篇

提交作业之后,因为我们的sh包含了输出日志,因此可以通过tail -f 日志名查看。

我们还可以ssh登录计算节点,使用watch rocm-smi,默认1秒看dcu显存情况,如果要更改时间,使用watch -n x rocm-smi,x秒刷新一次。
嗯?计算节点id忘了怎么办?squeue查看到的nodelist下面对应的内容😜

扩展-从零开始制作自己的环境教程

当然,官方安装的有些包是不存在的,这时候我们就不能依赖官方的,需要激活 conda 环境以安装。

  1. 首先通过 module avail 看看有什么版本的 anaconda,正好看到 apps/anaconda3/5.2.0,于是通过 module load apps/anaconda3/5.2.0 激活。如果你觉得版本老,就可以自己安装一个conda环境了。
  2. 然后 conda create -n torch python=3.6.8 创建环境,source activate torch 在这个环境安装一些不在系统预存的包需要附带 -i https://pypi.tuna.tsinghua.edu.cn/simple 加速安装。(注销是:source deactivate)
  3. 适用 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
    • 注意 whl 和python版本关系
  4. 之后安装自己需要的包即可。注意:在老版本 python 安装 opencv,需要指定版本,例如版本 4.3.0.38,不然会报错。
  5. 添加环境变量 (如果没有报错就不需要!) 。当引用 torch 可能会出现如下错误, ImportError: libglog.so.0: cannot open shared object file: No such file or directory,这时需要
    1. vi ~/pytorch_env.sh
    2. 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
    3. 保存并退出,然后执行 source ~/pytorch_env.sh。以后每次登录新的节点时,都要执行一次
  6. 编写脚本
#!/bin/bash
# 作业名称
#SBATCH -J weather_classification
# 指定队列,通过`whichpartition`看
#SBATCH -p ty_normal
# 节点数,可以看首页的可访问队列有多少空闲节点
#SBATCH -N 1
# 单节点核数
#SBATCH --ntasks-per-node=32  
# 需要1个dcu,后面的数字根据首页的加速卡数量,如果是英伟达GPU,改成gpu: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

如果你是自己安装的conda,

#!/bin/bash
#SBATCH -J weather_classification
#SBATCH -p ty_normal
#SBATCH -N 1
#SBATCH --ntasks-per-node=32  
#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模块

介绍有意思的加载环境

在前面我们要么是通过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版本~

最后,提醒大家:

丹规千万条,核时第一条。关炉不规范,钞票两行泪!

手动挡,一定记得要释放啊!
自动挡,注意飙车时间。

以上内容可能不是最新的,最新的可以看博客

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。