GPU分布式训练试验手册

1 GPU分布式训练实验介绍

GPU分布式训练是指同时利用一台或者多台机器上的 GPU 进行并行计算,使神经网络训练达到更大的batchsize和更快的训练速度,其在大规模网络训练中是十分重要的。本范例基于pytorch的nn.DataParallel和nn.distributedataparallel在多个GPU上切分模型和数据,在训练过程中,每个节点起进程从磁盘加载batch数据,并将它们传递到其节点GPU,每一个节点GPU都有自己的前向过程,然后梯度在各个GPUs间进行All-Reduce。在此过程中,每一层的梯度不依赖于前一层,所以梯度的All-Reduce和后向过程同时计算,能够缓解网络瓶颈。在后向过程的最后,每个节点都得到了平均梯度,这样模型参数保持同步。最终多节点协同训练一个高精度的神经网络模型,本范例实现基于ImageNet图像识别的resnet18模型。

1.1 节点创建

  1. 使用账号登录“国家未来智能网络试验设施创新试验服务平台” :http://ceni.ustc.edu.cn。

  2. 登录后,点击“我的试验”→“创建新试验”,填写试验名称及试验说明。

  3. 点击下一步开始资源配置。将左侧“VM”拖动到右侧网格区域创建新的节点。首先创建GPU型节点N1:所在区域选择“云数据中心”-“GPU计算中心”镜像选择“公有镜像”—“Ubuntu”—“ubuntu18-server”选择资源选择为“RTX3080” —“4核CPU 8G内存 200G磁盘”,其余配置无需更改,配置完成后点击“保存并复制节点”以增加相同配置的其他节点,至少配置两个节点,这里配置3个节点。

  4. 将鼠标悬浮在网格中界点上方,点击节点周围红色小圆圈并拖动与其他节点相连,右侧弹出链路信息,带宽选择10Mbps,其余配置无需更改点击确认增加链路。

  5. 设置完成后点击“创建试验”,创建成功后点击右上角的“运行试验”即可开始试验。

  6. 点击“控制台”,进入虚拟机登录界面,使用“root”账户登陆,密码见上述界面,依次输入用户名“root”及密码即可进入虚拟机。

1.2 GPU环境配置

  1. 安装NVIDIA驱动:

    首先终端输入指令apt-get install gccapt-get install pkg-configapt-get install unzip安装必备的软件包;然后安装NVIDIA驱动,执行wget https://cn.download.nvidia.com/XFree86/Linux-x86_64/525.89.02/NVIDIA-Linux-x86_64-525.89.02.run下载安装包,下载完成后执行sudo sh NVIDIA-Linux-x86_64-525.89.02.run安装NVIDIA驱动,选择“ok”、“yes”完成安装,安装完成后执行指令nvidia-smi检查是否安装成功,若出现如下结果则成功安装。

  2. 安装conda并创建GPU分布式训练环境:

    终端执行指令wget https://mirrors.bfsu.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh下载miniconda安装包,下载完成后执行sudo sh Miniconda3-latest-Linux-x86_64.sh进行安装,一直输入回车键确认直到输入“yes or no”,输入yes默认安装在“root/miniconda”目录下,继续输入yes执行conda初始化,安装完成后输入reboot重启节点,重启后会自动进入conda base环境。重启后执行指令nvidia-smi检查NVIDIA驱动是否挂掉,若NVIDIA驱动没有成功运行,则执行指令apt-get install dkmsdkms install -m nvidia -v 525.89.02,再次nvidia-smi查看NVIDIA驱动可成功运行。接下来配置conda源,终端输入:

    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch
    

    然后执行vim /root/.condarc 删除-default

    创建GPU分布式训练环境,命名为resnet,执行命令conda create -n resnet python=3.7。最后下载pytorch、torchvision和cudatoolkit,切换conda环境为“resnet”,执行命令conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=11.3,在resnet conda环境下,输入python进入虚拟环境,输入import torchprint(torch.cuda.is_available())显示结果为true则GPU环境配置完成。

1.3 数据集及训练代码下载

  1. 数据集及代码下载

1.4 网络+GPU训练

首先进入conda环境——resnet,执行conda activate resnet

单机训练命令:

节点N:python main.py -a resnet18 -j 2 --gpu 0 --epoch 30

多机训练命令:

N1节点:python main.py -a resnet18 -j 2 --dist-url 'tcp://IP_OF_NODE0:FREEPORT' --dist-backend 'nccl' --epoch 30 --world-size 3 --rank 0

N2节点:python main.py -a resnet18 -j 2 --dist-url 'tcp://IP_OF_NODE0:FREEPORT' --dist-backend 'nccl' --epoch 30 --world-size 3 --rank 1

N3节点:python main.py -a resnet18 -j 2 --dist-url 'tcp://IP_OF_NODE0:FREEPORT' --dist-backend 'nccl' --epoch 30 --world-size 3 --rank 2

注意,三个GPU节点的dist-url都应设置为rank 0的IP和freeport比如8090,端口占用情况查看netstat -aeo | grep 8090,其中,main.py用法如下:

-a:神经网络模型结构,可选用的模型有alexnet、convnext_base、googlenet、shufflenet_v2_x0_5、vgg16等,详情python main.py -h

-j:torch数据加载的workers,默认为4,这里设置为2

--epochs:运行的总epoch数,这里设置为30

--gpu:使用的GPU id,仅在单机训练时使用

--dist-url:设置分布式训练url,多机训练时都应为rank0的IP和端口

--dist-backend:分布式训练通信后端

--multiprocessing-distributed:多进程分布式训练

--world-size:分布式训练的节点数

--rank:分布式训练节点索引

每一轮epoch训练结束后会对验证数据集val进行top1 accuracy和top5 accuracy模型评估,同时会生成checkpoint的模型参数checkpoint.pth.tar以便后续在断点开始继续训练,记录最优模型model_best.pth.tar。

2 常见问题说明

2.1 云盘使用注意事项

  1. 按照ceni首页帮助文档的《平台FAQ》,将云盘操作python脚本下载到新目录下

  2. 安装python2和Java运行环境jre:apt inatsll python2.7 apt install default-jre

  3. vim修改openapi_util,新增两行如下,后续所有python脚本操作皆以python2.7开头

results matching ""

    No results matching ""