客服

GPU 分布式使用教程

GPU 分布式使用教程

GPU 分布式使用教程之 Pytorch

Pytorch 官方推荐使用 DistributedDataParallel(DDP) 模块来实现单机多卡和多机多卡分布式计算。DDP 模块涉及了一些新概念,如网络(World Size/Local Rank),代码修改(数据分配加载),多种启动方式(torchrun/launch),使用前请参考官方文档以及更多学习资料

选择机器

  • 单机多卡分布式:租用同个计算节点的多张卡即可。
  • 多机多卡分布式:需要先申请开通 分布式集群 功能,点击这里申请开通,在租用时,请选择带有如图所示图标的机器。没有这个图标的机器不支持加入分布式网络。

单机多卡

1)租用机器: 为实现Pytorch的单机多卡分布式,首先,您需要按正常流程租用GPU,如单节点 4 卡 A2000,选择Pytorch镜像,如Pytorch 1.12镜像。
租用的时候 GPU 数设置成 4,即表示 4 卡,对应显存、内存等配置也会翻倍。
2)适配代码: 分布式需对脚本进行相应修改,可参考官方文档。此处使用开源项目作为测试demo,点击下载测试代码mnmc_ddp_launch.py
3)运行代码: 进入运行脚本所在目录,输入命令行,如:
bash
# 项目地址 https://github.com/BIGBALLON/distribuuuu/blob/master/tutorial/mnmc_ddp_launch.py
# 进入项目目录
cd /mnt/test/multi-card/torch
# 复制数据集到当前目录
cp -r /public/torchvision_datasets/cifar-10-batches-py ./
# 运行程序
python -m torch.distributed.launch --nproc_per_node=4  mnmc_ddp_launch.py 
这里使用的是 launch 启动方式,也可使用torchrun以及其他启动方式。--nproc_per_node 指定每个节点的GPU数量,mnmc_ddp_launch.py 为执行脚本文件(如需下载 cifar10 数据集,修改download=True)。
4)查看GPU使用情况: 租用界面点击详情按钮即可查看 GPU、CPU使用情况。从截图中可以看到 4 个显卡都有使用到。

多机多卡

多机多卡使用需要先申请开通 分布式集群 功能,点击这里申请开通
1)租用机器: 首先,您需要按正常流程租用 GPU,主机市场筛选栏选择 支持分布式集群 筛选,然后选择自己需要的机器租用即可。
如两个计算节点,租用两台 A4000 4 卡,共计 8 卡。选择相同的Pytorch镜像,如Pytorch 1.12。
注意: 多机多卡中每个节点的 GPU 卡数应该一样,才能都使用上,机器类型也最好一样。
2)创建集群: 进入 【个人中心】 — 【我的租用】 — 【分布式集群】
分布式集群需要先进行申请,申请通过后,点击【添加集群】- 【添加机器】—【确定】。
3)添加机器: 点击集群页面添加机器按钮,勾选要加入集群的机器,点击确定,即可将租用机器添加到集群。
添加机器成功后,系统会给每个节点分配集群 IP,当状态为已连接时,代表机器间可相互通信。
4)添加以下环境变量: 在每一个节点,使用 ifconfig 命令查询节点网卡名称,如 meth01,meth02。登陆各个节点添加相同环境变量(可用 ssh 登录)
bash
export NCCL_SOCKET_IFNAME=meth919,meth920
export GLOO_IFACE=meth919,meth920
export NCCL_DEBUG=INFO #可选,如需获得额外的nccl信息
可以将以上内容添加到~/.bashrc文件中(meth919 meth920记得改成自己的网卡名称)。
5)适配代码: 分布式需对脚本进行相应修改,可参考官方文档。此处使用开源项目作为测试demo,点击下载测试代码mnmc_ddp_launch.py
6)运行程序: 登录主节点,进入运行脚本所在目录,输入命令行,如:
bash
# 项目地址 https://github.com/BIGBALLON/distribuuuu/blob/master/tutorial/mnmc_ddp_launch.py
# 进入项目目录
cd /mnt/test/multi-card/torch
# 复制数据集到当前目录
cp -r /public/torchvision_datasets/cifar-10-batches-py ./
# 运行程序
python -m torch.distributed.launch --nproc_per_node=4 --nnodes=2 --node_rank=0 --master_addr="192.168.1.9" --master_port=12345 mnmc_ddp_launch.py
--nproc_per_node 指定每个节点的GPU数量,每个节点GPU数量应该一样,不然无法运行成功,--nnodes 指定节点数(总共2个节点),--node_rank 指定节点顺序(主节点故为0号),--master_addr和master_port 设定主节点ip和端口号。mnmc_ddp_launch.py 为执行脚本。
登录剩余节点,运行:
bash
# 进入项目目录
cd /mnt/test/multi-card/torch
# 运行程序
python -m torch.distributed.launch --nproc_per_node=4 --nnodes=2 --node_rank=1 --master_addr="192.168.1.9" --master_port=12345 mnmc_ddp_launch.py
其中,--node_rank 指定节点顺序(第二个节点故为1号),如有更多节点,需做相应修改,其他参数不用修改。运行后,系统会自动连接并运行训练任务。
7)查看GPU使用情况: 租用界面点击详情按钮即可查看 GPU、CPU使用情况。

GPU 分布式使用教程之 TensorFlow

TensorFlow 提供了6种策略实现分布式计算,各个策略详情请参考官方文档。本文档使用 MirroredStrategy 实现单机多卡分布式,MultiWorkerMirroredStrategy 实现多机多卡分布式计算。

选择机器

  • 单机多卡分布式:租用同个计算节点的多张卡即可。
  • 多机多卡分布式:需要先申请开通 分布式集群 功能,点击这里申请开通,在租用时,请选择带有如图所示图标的机器。没有这个图标的机器不支持加入分布式网络。

单机多卡

1)租用机器: 为实现TensorFlow的单机多卡分布式,首先,您需要按正常流程租用GPU,如单节点 4 卡 A2000,选择TensorFlow镜像,如TensorFlow2.8镜像。
租用的时候 GPU 数设置成 4,即表示 4 卡,对应显存、内存等配置也会翻倍。
2)适配代码: 单机多卡分布式使用 MirroredStrategy 需对脚本进行相应修改,点击下载测试代码(将代码写入机器中的一个 .py 文件即可,如:tf-demo.py )。
3)运行代码: 进入运行脚本所在目录,输入命令行,如:
bash
# 进入脚本目录
cd /mnt/test/multi-card/tf
# 解压数据集到当前目录
unzip /public/tensorflow_datasets/cats_vs_dogs/kagglecatsanddogs_3367a.zip -d ./cats_vs_dogs
# 安装缺的依赖包
pip install tensorflow_datasets
# 运行程序
python tf-demo.py 
4)查看GPU使用情况: 租用界面点击详情按钮即可查看 GPU、CPU使用情况。从截图中可以看到 4 个显卡都有使用到。

多机多卡

多机多卡使用需要先申请开通 分布式集群 功能,点击这里申请开通
1)租用机器: 首先,您需要按正常流程租用 GPU,主机市场筛选栏选择 支持分布式集群 筛选,然后选择自己需要的机器租用即可。
如两个计算节点,租用两台 A2000 4,共计 8 卡。选择相同的 TensorFlow 镜像,如 TensorFlow2.8 镜像。
注意: 多机多卡中每个节点的 GPU 卡数应该一样,才能都使用上,机器类型也最好一样。
2)创建集群: 进入 【个人中心】 — 【我的租用】 — 【分布式集群】
分布式集群需要先进行申请,申请通过后,点击【添加集群】- 【添加机器】—【确定】。
3)添加机器: 点击集群页面添加机器按钮,勾选要加入集群的机器,点击确定,即可将租用机器添加到集群。
添加机器成功后,系统会给每个节点分配集群 IP,当状态为已连接时,代表机器间可相互通信。
4)添加机器: 登录任一节点。因秘钥由您掌握,故需由您按以下步骤完成节点间的ssh连通:
bash
ssh-keygen -t rsa # 一路默认,生成公私钥
ssh-copy-id root@其他节点IP  #分发给其他节点,输入对应秘钥。IP可在我的集群页面查看,如192.168.1.1
5)适配代码: 注意和单机多卡不同,多机多卡使用了 MultiWorkerMirroredStrategy,并配置了'TF_CONFIG'网络设置:
python
os.environ['TF_CONFIG'] = json.dumps({
    'cluster': {
        'worker': ["192.168.1.7:20005", "192.168.1.8:20006"]
    },
    'task': {'type': 'worker', 'index':0}
})
其中 cluster 包含了全部节点的IP和端口信息,所有节点此部分相同;task包含当前节点的角色,例如节点一为worker 0,节点二为worker 1。
点击下载测试代码(将代码写入机器中的一个 .py 文件即可,如:tf-demo2.py ):
6)运行程序: 登录主节点,进入运行脚本所在目录,输入命令行,如:
bash
# 进入脚本目录
cd /mnt/test/multi-card/tf
# 解压数据集到当前目录
unzip /public/tensorflow_datasets/cats_vs_dogs/kagglecatsanddogs_3367a.zip -d ./cats_vs_dogs
# 安装缺的依赖包
pip install tensorflow_datasets
# 运行程序
python tf-demo2.py --num_workers 2 --worker_no 0
测试代码中,--num_workers 指定节点数(总共2个节点),用于设定batch_size, --worker_no 指定节点顺序(主节点故为0号)。
登录剩余节点,运行:
bash
cd /mnt/test/multi-card/tf
python tf-demo2.py --num_workers 2 --worker_no 1
其中,--worker_no 指定节点顺序(第二个节点故为1号),如有更多节点,需做相应修改,其他参数不用修改。运行后,系统会自动连接并运行训练任务。
7)查看GPU使用情况: 租用界面点击详情按钮即可查看 GPU、CPU使用情况。

GPU 分布式使用教程之 Horovod

Horovod 是实现分布式机器学习的较佳实践之一,支持 Pytorch,TensorFlow,Keras,MXNet,采用 Ring-AllReduce 算法,在 GPU 较多时,算力的发挥能提升近一倍,且代码改动较小。使用镜像即可快速开启单机多卡/多机多卡分布式学习。

选择机器

在租用时,请选择带有如图所示图标的机器。没有这个图标的机器不支持加入分布式网络。
分布式网络图标
分布式网络图标

单机多卡

1.单机多卡使用 Horovod 实现较简单。首先,您需要按正常流程租用GPU,如单节点 4 卡 K80,选择含有 Horovod 镜像,如Pytorch1.8.1-Horovod/TensorFlow 2.4-Horovod。
选择镜像
2.进入运行脚本所在目录,输入命令行,如
shell
horovodrun -np 4 python test.py
运行
即可实现单机多卡计算。-np 指定进程数,推荐设定为总GPU数。test.py 可使用官方范例。普通的脚本如果要使用 Hovorod,修改方法可参考第三部分:脚本修改

多机多卡

1.首先,您需要按正常流程租用 GPU,如两个计算节点,每节点各 8 卡 K80,共计 16 卡。选择相应的 Horovod 镜像,如Pytorch1.8.1-Horovod/TensorFlow 2.4-Horovod。
2.将节点组建集群。进入 【个人中心】 — 【我的租用】 — 【分布式集群】。
分布式集群需要先进行申请,申请通过后,点击 【添加集群】- 【添加机器】— 【确定】。
新建集群
添加机器
选择节点
添加机器成功后,系统会给每个节点分配集群 IP,当状态为已连接时,代表机器间可相互通信。
集群列表
3.登录任一节点。因秘钥由您掌握,故需由您按以下步骤完成节点间的ssh连通:
shell
ssh-keygen -t rsa # 一路默认yes,生成公私钥
ssh-copy-id root@其他节点IP  #分发给其他节点,输入对应秘钥。IP可在我的集群页面查看,如192.168.1.4
4.添加以下环境变量,使用 ifconfig 命令查询各节点网卡名称,如 meth01,meth02。登陆各个节点添加相同变量(可用 ssh 登录)
网卡
shell
export NCCL_SOCKET_IFNAME=meth01,meth02
export GLOO_IFACE=meth01,meth02
export NCCL_DEBUG=INFO #可选,如需获得额外的nccl信息
5.进入 /mnt/ 共享目录,上传运行脚本,如 test.py,运行范例命令:
shell
horovodrun -np 16 -H 192.168.6.01:8,192.168.6.02:8 --network-interface "192.168.6.01/24,192.168.6.02/24" /root/miniconda3/envs/myconda/bin/python test.py 
参数说明
  • np:指定总进程数,
  • H:指定各计算节点所运行卡数,格式为 IP:GPU数,多个节点之间逗号隔开,本机的信息也需要配置,所有节点都需要写入。例如 192.168.6.01:8 代表 IP 为 192.168.6.01,有 8 张GPU。
  • network-interface:指定各计算节点的 IP,需要与 H 的参数对应。
如需进行性能分析,可使用timeline命令,如
shell
horovodrun -np 4 --timeline-filename /path/to/timeline.json python test.py
但使用此命令可能损耗性能。

脚本修改

Horovod 对各模块进行了包裹,使用方便,但仍需对代码进行修改,逻辑和 Pytorch DDP 比较类似,官方流程如下:
python
import torch
import horovod.torch as hvd

# Initialize Horovod
hvd.init()

# Pin GPU to be used to process local rank (one GPU per process)
torch.cuda.set_device(hvd.local_rank())

# Define dataset...
train_dataset = ...

# Partition dataset among workers using DistributedSampler
train_sampler = torch.utils.data.distributed.DistributedSampler(
    train_dataset, num_replicas=hvd.size(), rank=hvd.rank())

train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=..., sampler=train_sampler)

# Build model...
model = ...
model.cuda()

optimizer = optim.SGD(model.parameters())

# Add Horovod Distributed Optimizer
optimizer = hvd.DistributedOptimizer(optimizer, named_parameters=model.named_parameters())

# Broadcast parameters from rank 0 to all other processes.
hvd.broadcast_parameters(model.state_dict(), root_rank=0)

for epoch in range(100):
   for batch_idx, (data, target) in enumerate(train_loader):
       optimizer.zero_grad()
       output = model(data)
       loss = F.nll_loss(output, target)
       loss.backward()
       optimizer.step()
       if batch_idx % args.log_interval == 0:
           print('Train Epoch: {} [{}/{}]\tLoss: {}'.format(
               epoch, batch_idx * len(data), len(train_sampler), loss.item()))
更详细资料请参考官网