PyTorch是一个开源的Python深度学习框架,基于Torch。PyTorch提供两个主要功能:
1、具有强大的GPU加速的张量计算(如NumPy)。
2、包含自动求导系统的的深度神经网络。
PyTorch容器版最多提供单机8卡使用模式,PyTorch集群版可以提供多机多卡使用模式。
GPU集群已安装Anaconda,需要在自己的home目录下通过编辑.bashrc文件来配置Anaconda的路径。
.bashrc用于存储并加载个人的终端配置和环境变量。bash在每次启动时都会加载.bashrc文件的内容。
在~/.bashrc文件中添加:export PATH=/opt/app/anaconda3/bin:$PATH
[user1@workstation ~]$ echo 'export PATH=/opt/app/anaconda3/bin:$PATH' >> ~/.bashrc
然后运行source命令使配置的环境变量生效:
[user1@workstation ~]$ source ~/.bashrc
然后运行conda init命令初始化conda环境,之后重启终端进入base环境:
[user1@workstation ~]$ conda init
···
(base) [user1@workstation ~]$
(base) [user1@workstation ~]$ conda env list|grep pytorch
公共集群在/opt/app/anaconda3/envs安装了 pytorch_1.8.2 ~ 2.6.0 的24个版本
平台使用Slurm作业管理系统进行作业调度,需要先用slurm申请资源,再用计算节点执行pytorch任务。
在单个节点执行pytorch任务的demo代码文件:
~/share/demo/pytorch-demo.py
这段代码是基于pytorch的简单深度学习示例,主要功能是在单个节点使用多层感知机(MLP)拟合非线性数据(正弦曲线加噪声),展示了从数据生成、模型定义、训练组件配置到训练循环的全流程。
(base) [user1@gpu5 ~]$ conda activate pytorch_2.5.1
(pytorch_2.5.1) [user1@gpu5 ~]$
(pytorch_2.5.1) [user1@gpu5 ~]$ python ~/share/demo/pytorch-demo.py
PyTorch 版本: 2.5.1
PyTorch 编译时CUDA版本: 12.4
Epoch [100/1000], Loss: 0.1476
Epoch [200/1000], Loss: 0.1263
如果提示缺少module,可以用pip install安装,PyPI设置参考超算平台专用镜像站。
以下是使用sbatch脚本方式提交的样例test.sh。
#!/bin/bash
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --gres=gpu:1
#SBATCH --partition=g078t
#SBATCH --time=01:00:00
#SBATCH --comment=prj_name
source /opt/app/anaconda3/etc/profile.d/conda.sh
conda activate pytorch_2.5.1
echo "Conda环境: $CONDA_DEFAULT_ENV"
python ~/share/demo/pytorch-demo.py
sbatch用于配置作业参数,--nodes为使用的节点数,--ntasks-per-node为每个节点所运行的任务数。其他详细的参数配置参考该文档。
然后在终端执行sbatch test.sh,slurm提交作业后,会将日志输出到用户根目录下,文件名为slurm-作业编号.out。
(base) [user1@workstation ~]$ sbatch test.sh
Submitted batch job 89055
(base) [user1@workstation ~]$ more slurm-89055.out
Conda环境: pytorch_2.5.1
PyTorch 版本: 2.5.1
PyTorch 编译时CUDA版本: 12.1
Epoch [100/1000], Loss: 0.0768
Epoch [200/1000], Loss: 0.0152
Epoch [300/1000], Loss: 0.0091
...
如果需要多个节点提供计算,需要在代码中加入多机多卡的API
在多个节点执行pytorch任务的demo代码文件:
~/share/demo/pytorch-multinode-demo.py
这段代码展示如何利用PyTorch的分布式训练框架(torch.distributed 和 DistributedDataParallel)进行模型训练,包含了分布式环境初始化、模型定义、训练流程以及跨进程通信演示。
(base) [user1@workstation ~]$ ssh gpu2
(base) [user1@gpu2 ~]$ conda activate pytorch_2.5.1
(pytorch_2.5.1) [user1@gpu2 ~]$
(pytorch_2.5.1) [user1@gpu2 ~]$ srun torchrun --nnodes=2 --nproc_per_node=8 --rdzv_id=89064 --rdzv_backend=c10d --rdzv_endpoint=gpu1:12345 ~/share/demo/pytorch-multinode-demo.py
Epoch 0, Loss: 1.492457389831543
Epoch 1, Loss: 1.4740962982177734
Epoch 2, Loss: 1.456373929977417
Epoch 3, Loss: 1.439265489578247
Epoch 4, Loss: 1.4227473735809326
Rank 5: Before all_reduce: 5.0
Rank 6: Before all_reduce: 6.0
Rank 12: Before all_reduce: 12.0
Rank 11: Before all_reduce: 11.0
Rank 9: Before all_reduce: 9.0
Rank 13: Before all_reduce: 13.0
Rank 10: Before all_reduce: 10.0
Rank 8: Before all_reduce: 8.0
Rank 15: Before all_reduce: 15.0
Rank 14: Before all_reduce: 14.0
...
以下是使用sbatch脚本方式提交的样例submit.sh。
#!/bin/bash
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=1
#SBATCH --gres=gpu:8
#SBATCH --time=01:00:00
#SBATCH --partition=g078t
#SBATCH --comment prj_name
# Set environment variables for InfiniBand
export NCCL_IB_DISABLE=0
export NCCL_IB_HCA=mlx5
export NCCL_SOCKET_IFNAME=ib0
# Set master address and port
MASTER_ADDR=$(scontrol show hostnames "$SLURM_JOB_NODELIST" | head -n 1)
export MASTER_ADDR
export MASTER_PORT=12345
# Calculate world size
export WORLD_SIZE=$((SLURM_NNODES * 8))
source /opt/app/anaconda3/etc/profile.d/conda.sh
conda activate pytorch_2.5.1
echo "Conda 环境: $CONDA_DEFAULT_ENV"
# Run the training script with torchrun
srun torchrun \
--nnodes="$SLURM_NNODES" \
--nproc_per_node=8 \
--rdzv_id="$SLURM_JOB_ID" \
--rdzv_backend=c10d \
--rdzv_endpoint="$MASTER_ADDR":$MASTER_PORT \
~/share/demo/pytorch-multinode-demo.py
在终端执行sbatch submit.sh,slurm提交作业后,会将日志输出到用户home目录下,文件名为slurm-作业编号.out。
(base) [user1@workstation ~]$ sbatch submit.sh
Submitted batch job 89061
(base) [user1@workstation ~]$ more slurm-89061.out
Conda环境: pytorch_2.5.1
Epoch 0, Loss: 1.0056527853012085
Epoch 1, Loss: 0.9948636293411255
Epoch 2, Loss: 0.9844313859939575
Epoch 3, Loss: 0.974343478679657
Epoch 4, Loss: 0.9645873308181763
Rank 3: Before all_reduce: 3.0
Rank 4: Before all_reduce: 4.0
Rank 5: Before all_reduce: 5.0
Rank 7: Before all_reduce: 7.0
Rank 1: Before all_reduce: 1.0
Rank 10: Before all_reduce: 10.0
Rank 9: Before all_reduce: 9.0
Rank 8: Before all_reduce: 8.0
Rank 13: Before all_reduce: 13.0
Rank 11: Before all_reduce: 11.0
Rank 14: Before all_reduce: 14.0
...