近期需要在超算平台上跑模型,总结了一下基本流程。

一、实验环境

服务提供商:并行科技
训练框架:pytorch
分布式训练框架:DeepSpeed

二、环境搭建

1 安装conda及虚拟环境

由于服务器上的账号没有root权限,需要自己下载anaconda并安装。安装时根据提示一步一步执行即可,在 Anaconda3 will now be installed into this location: 时将路径改为自己的路径。

# 下载anaconda并安装
wget https://repo.anaconda.com/archive/Anaconda3-2018.12-Linux-x86_64.sh
bash Anaconda3-.-Linux-x86_64.sh

# 添加到环境变量中
vi ~/.bashrc
# 加入:
export PATH=/home/YourPath/anaconda3/bin:$PATH

# 退出,然后更新环境变量
source ~/.bashrc

此时执行 conda --version 输出conda版本号说明安装成功。然后给conda配置镜像源:

conda config --set show_channel_urls yes

# 添加官方源
conda config --add channels conda-forge 
conda config --add channels r

# 添加国内镜像源
# 北方地区推荐清华源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/

# 南方地区推荐使用中科大源:
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/

根据GPU型号查看需要的python版本并创建虚拟环境:

conda create -n env_name python=3.10

此时执行 conda info 可以查看conda的镜像和虚拟环境信息

2 安装需要的库

准备需要的第三方python库添加到requirements.txt:
(注意安装mpi4py和transformers时需要先 module load mpich 将mpich加载到环境中)

torch
transformers
deepspeed
datasets
tensorboard
fire==0.4.0
pytz==2021.1
loguru==0.5.3
sh==1.14.2
pytest==6.2.5
tqdm==4.62.3
mpi4py

安装:

# 查看conda虚拟环境
conda env list
# 进入虚拟环境
conda activate env_name
# pip安装
pip install -r requirements.txt

此时 pip list 可以查看已安装的库及版本

3 下载数据集并本地调用

由于服务器无法科学上网,需要先下载数据集放到服务器上,然后本地调用。这次实验用到的数据集在Huggingface上,通过两种方法下载:
方法一:进入主页点击下载按钮一个一个文件下载,其中.arrow是原始数据文件。
方法二git lfs clone xxx 但是需要先对git进行一些配置:

# 配置socks5
git config --global http.proxy socks5 127.0.0.1:7890
git config --global https.proxy socks5 127.0.0.1:7890
# 配置http
git config --global http.proxy 127.0.0.1:7890
git config --global https.proxy 127.0.0.1:7890

方法三:通过python的datasets库下载

import datasets 

dataset = datasets.load_dataset("dataset_name")
dataset.save_to_disk('your_path')

然后本地加载数据集:

import datasets

dataset = load_from_disk("your_path")

此外,tokenizer也需要下载然后换成本地的调用:

# tokenizer = AutoTokenizer.from_pretrained(tokenizer)
tokenizer = AutoTokenizer.from_pretrained("./tokenizer/roberta-base")

4 修改device使用GPU

在代码中修改,使用GPU进行训练

torch.cuda.is_available()

device = torch.device("cuda:0")

if torch.cuda.is_available():
    device = torch.device("cuda:0")  # you can continue going on here, like cuda:1 cuda:2....etc. 
    print("Running on the GPU")
else:
    device = torch.device("cpu")
    print("Running on the CPU")

net = Net().to(device)

batch_X, batch_y = batch_X.to(device), batch_y.to(device)

torch.cuda.device_count():返回当前可见可用的 GPU 数量
torch.cuda.get_device_name():获取 GPU 名称

torch.nn.DataParallel(module, device_ids=None, output_device=None, dim=0)

5 使用MPI进行分布式训练

使用框架进行分布式训练

三、Slurm作业管理系统常用命令

1 sinfo 查看资源使用情况

举例:

sinfo

2 sbatch 提交作业(批处理)

举例:

sbatch -p gpu -N 2 -n 2 --gres=gpu:2 run.sh

3 srun 提交作业(交互式)

举例:

srun -p gpu -N 2 -n 2 --gres=gpu:2 run.sh

squeue 查看作业状态

举例:

squeue

scancel 取消作业任务

scancel JOBID

网站:
北京大学超算提供的集群作业命令教程
常见的资源错误
分配GPU资源

四、module的使用

1 介绍

由于不同用户在超算上可能需要使用不同的软件环境,配置不同的环境变量,软件之间可能会相互影响,因而在超算上安装了module 工具来对应用软件统一管理。module 工具主要用来帮助用户在使用软件前设置必要的环境变量。用户使用module 加载相应版本的软件后,即可直接调用超算上已安装的软件。

2 命令

module avail 查看可用的软件列表
module load [modulesfile] 加载需要使用的软件
module show [modulesfile] 查看对应软件的环境(安装路径、库路径等)
module list 查看当前已加载的所有软件
module unload [modulesfile] 移除使用module加载的软件环境
module purge 清理已加载的module环境

3 超算中常有的软件

例1:
在这里插入图片描述
例2:
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐