个人学习过程记录----------
官网链接:
Horovod with PyTorch — Horovod documentation
实验背景:
数据集的大小、模型的复杂度(存储和计算量),以及当下计算设备的硬件资源的利用,都影响着模型训练时间。同时为追求模型的最佳效果,模型复杂度也相当高。
实验目的:
利用Horovod实现Pytorch算法分布式训练。
当前分布式深度学习方式:
(1) 模型并行VS 数据并行
(2)通信机制:
网络拓扑(ParameterServer 和Allreduce)
通信步调(同步更新和异步更新)
实验步骤:
step1: 下载源代码,可运行示例
git clone https://github.com/horovod/horovod.git
进入/examples/pytorch,打开pytorch_mnist.py
运行命令:
horovodrun -np 2 python pytorch_mnist.py
查看机器用卡情况:
nvidia-smi
发现当前程序使用了两张卡在运行。
更多horovodrun运行命令解释:
(1) 单机多卡实现分布式训练,可
horovodrun -np 2 -H localhost:2 python pytorch_mnist.py
若是单机,-H localhost:2也可以不写
(2)多机多卡, 运行在4台机器的4个GPUs上
horovodrun -np 16 -H server1:4,server2:4,server3:4,server4:4 python pytorch_mnist.py
参数解释:
-np GPU总数
-H localhost 本地服务器使用的GPU数
-H server_n:N N表示server_n使用的GPU数量
利用Horovod with PyTorch训练自己的脚本 步骤:
(同时也是pytorch_mnist.py中的示例的实现步骤)
Install:
To run on CPU:
pip install horovod
Run on GPUs with NCCL:
HOROVOD_GPU_OPERATIONs=NCCL pip install horovod
step1: Initialize Horovod:
import horovod.torch as hvd
hvd.init()
step2: Pin each GPU to a single process.
每个进程设置一个GPU,设为local rank, 服务器上的第一个进程会被分配到第一个GPU,第二个进程分配到第二个GPU, and so forth.
if torch.cuda.is_available():
torch.cuda.set_device(hvd.local_rank())
step3: Scale the learning rate by the number of workers.
根据workers的数量调整学习率,同步分布式训练中batch_size根据workers数量而变化,,学习率的增加可以弥补batch size的增加。
step4: Wrap the optimizer in hvd.DistributedOptimizer.
优化器的实现通过hvd.DistributedOptimizer实现
step5: Broadcast the initial variable states from rank 0 to all other process:
初始变量从rank 0 广播到其他进程
hvd.broadcast_parameters(model.state_dict(), root_rank=0)
hvd.broadcast_optimizer_state(optimizer, root_rank=0)
这一步骤用来确保所有workers在以随机权值或已有的checkpoint进行训练的时候初始化是一致的。
step6: 修改你的代码以只在worker 0上保存checkpoints,而不会被其他workers影响打断。
通过命令
hvd.rank()!=0
来保护模型的checkpoint代码。
至此,简单的Horovod with Pytorch就结束了,下一篇开启Horovod in Docker.