【Hello AI】使用AIACC-Training PyTorch版

本文涉及的产品
云服务器 ECS,每月免费额度200元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 自PyTorch 1.x发布迭代后,使用PyTorch原生自带的DDP进行分布式训练逐渐形成了主流。本文为您介绍如何使用AIACC-Training,对基于PyTorch框架搭建的模型进行分布式训练加速的方法,以及可能遇到的问题和解决办法。

自PyTorch 1.x发布迭代后,使用PyTorch原生自带的DDP进行分布式训练逐渐形成了主流。本文为您介绍如何使用AIACC-Training,对基于PyTorch框架搭建的模型进行分布式训练加速的方法,以及可能遇到的问题和解决办法。

适配PyTorch DDP API(推荐)

背景信息

关于PyTorch DDP的更多信息,请参见PyTorch官网

代码适配与运行

  1. 适配代码。

您仅需在训练代码main函数对应的文件上增加一行导入aiacc代码即可,但请务必确保导入Perseus的位置在导入torch之前。命令行示例如下所示:

import perseus    # aiacc的导入一定要放在torch的导入之前
import torch
import torch.nn as nn
import torch.distributed as dist
......
  1. 启动脚本。

使用标准的torch.distributed.launch方式运行DDP的分布式训练,以下示例展示使用双机进行PyTorch DDP方式启动脚本,每台机器挂8张卡,命令行示例如下所示:

### 机器一上的命令
python -m torch.distributed.launch --nproc_per_node=8 --nnodes=2 --node_rank=0 --master_addr=${machine1_ip} --master_port=6007 --use_env ${TRAIN_SCRIPT}
### 机器二上的命令
python -m torch.distributed.launch --nproc_per_node=8 --nnodes=2 --node_rank=1 --master_addr=${machine1_ip} --master_port=6007 --use_env ${TRAIN_SCRIPT}

部分参数说明如下:

  • ${machine1_ip}为机器一的内网ip,如192.168.2.211。您可以通过执行ifconfig命令进行查看。
  • ${TRAIN_SCRIPT}为实际训练的脚本。

示范用例

AIACC-Training软件包路径中为您提供了已适配DDP的示例代码。您可以通过以下操作体验训练过程。

  1. 进入示例代码目录。 
cd `echo $(python -c "import perseus; print(perseus)") | cut -d\' -f 4 | sed "s/\_\_init\_\_\.py//"`examples/
  1. 启动训练。

采用原生DDP的启动方式运行pytorch_ddp_benchmark.py脚本,以下示例为单机8卡训练的启动命令。

NP=8
ADDR=localhost
PORT=6006
python -m torch.distributed.launch --nproc_per_node=$NP --nnodes=1 --node_rank=0 --master_addr=$ADDR --master_port=$PORT \
  pytorch_ddp_benchmark.py

适配Horovod API

前提条件

已将Perseus更新至1.3.2或以上版本,否则会影响您使用PyTorch的相关加速功能。

操作步骤

AIACC-Training for PyTorch支持Horovod API。如果您之前是使用Horovod进行分布式训练,只需替换import模块即可。替换内容如下:

import perseus.torch.horovod as hvd

如果您的训练代码是非分布式代码,可以参考以下操作步骤将训练代码升级为Horovod接口的分布式训练代码。

  1. 在main函数的开头部分,执行如下命令,初始化Perseus Horovod模块。

说明请务必在使用其他Perseus API之前调用hvd.init()。

hvd.init()
  1. 将当前process绑定对应的GPU卡。
torch.cuda.set_device(hvd.local_rank())
  1. 通常情况下,对于训练的step数和warmup step参数,需要除以总的进程数hvd.size(),学习率需要对应增大hvd.size()倍。

说明部分模型不需要增大学习率,如BERT模型,具体请根据训练收敛情况作判断。

step = step // hvd.size()
learning_rate = learning_rate * hvd.size()
  1. 重载Optimizer。
optimizer = hvd.DistributedOptimizer(
 optimizer,named_parameters=model.named_parameters())

如果是多个模型,有多个named_parameters,则需要进行合并处理,例如:

all_named_parameters = []
for name, value in model1.named_parameters():
    all_named_parameters.append((name, value))
for name, value in model2.named_parameters():
    all_named_parameters.append((name, value))
optimizer = hvd.DistributedOptimizer(
                           optimizer, named_parameters=all_named_parameters)
  1. 广播全局变量参数到所有机器。
hvd.broadcast_parameters(model.state_dict(), root_rank=0)
hvd.broadcast_optimizer_state(optimizer, root_rank=0)

如果是多个模型,有多个state_dict,则需要进行合并处理,例如:

all_state_dict={}
all_state_dict.update(model1.state_dict())
all_state_dict.update(model2.state_dict())
hvd.broadcast_parameters(all_state_dict, root_rank=0)
  1. 将数据集划分为子数据集。
train_sampler = torch.utils.data.distributed.DistributedSampler(
    train_dataset, num_replicas=hvd.size(), rank=hvd.rank())
loader = torch.utils.DataLoader(
    train_dataset, batch_size=batch_size, sampler=train_sampler, **kwargs)
  1. 模型单机单卡化。

由于Perseus运行的是单机单卡程序,然后下发给各个GPU进行单机多卡或分布式训练,因此程序的运行方式需要为单机单卡。

原程序为:

model = nn.DataParallel(model.cuda())

使用以下任一种方法修改:

  • 方式1
model = nn.DataParallel(model.cuda(), device_ids=[hvd.local_rank()])
  • 方式2
model = model.cuda()

此方式中,cuda()默认会调用步骤2中设置的当前process绑定的GPU卡。

  1. 保存checkpoint。
save_checkpoint = True if hvd.rank() == 0 else False
verbose = 1 if hvd.rank() == 0 else 0
log_writer = tensorboardX.SummaryWritter(log_dir) if hvd.rank() == 0 else None
  1. 加载checkpoint。
if hvd.rank() == 0:
    checkpoint = torch.load(filepath)
    model.load_state_dict(checkpoint['model'])
    optimizer.load_state_dict(checkpoint['optimizer'])
  1. 启动分布式训练。
  • 单机8卡运行训练
mpirun -allow-run-as-root -np 8 -npernode 8 -x NCCL_DEBUG=INFO ./train.sh
  • 4机8卡运行训练
mpirun -allow-run-as-root -bind-to none -np 32 -npernode 8 \
                   -x NCCL_DEBUG=INFO -x PATH -x LD_LIBRARY \
                   -x PERSEUS_ALLREDUCE_STREAMS=8 \
                   -hostfile mpi_host.txt ./train.sh

常见问题

模型数据存放位置冲突,导致报错Input type (CUDAFloatTensor) and weight type (CPUFloatTensor) should be the same

通常情况下,是因为存在模型的参数不在GPU中,而输入数据在GPU中,遗漏了model的cuda操作导致。您可以通过增加model.cuda()将模型转移到GPU上来解决该问题。

出现报错RuntimeError: all tensors must be on devices[0]

请排查:

  • 是否在程序初始化时候指定了gpu_ids,如torch.cuda.set_device(hvd.local_rank())
  • 是否采用DataParallel的时候没有统一设置。请设置一致的device_ids,如nn.DataParallel(model.cuda(), device_ids=str(hvd.local_rank()))

加载模型显存OOM

一般是由于模型数据太大导致,可以通过将模型导入为CPU内存来解决此问题,如torch.load(pretrain, map_location='cpu')

系统提示退出异常

首先请确保您已经正确完成了代码的适配操作。具体操作,请参见代码适配与运行

发生该异常可能出自多个模型的组合问题。您需要将多个模型的named_parameters进行合并,然后再传递给Perseus进行Optimizer的封装。另外,多个模型组合时的广播参数需要设置为广播所有参数,因此,也需要进行state_dict的参数合并。

系统提示端口被占用

请先确认已有的端口是否被其他进程占用,如果有,可以使用pkill python命令进行进程杀除。

在Torch 1.9版本,默认使用的启动方式为torch.distributed.run,该方式使用默认的rdzv_backend作为训练的launcher,但是在启动训练之前就已经创建了服务,而代码里如果有dist.init_process_group()则会继续创建该服务,因此导致冲突,单机多卡情况下可以增加配置选项--standalone解决该问题。


好啦!小弹的分享到此为止。我们更欢迎您分享您对阿里云产品的设想、对功能的建议或者各种吐槽,请扫描提交问卷并获得社区积分或精美礼品一份。https://survey.aliyun.com/apps/zhiliao/P4y44bm_8

【扫码填写上方调研问卷】

欢迎每位来到弹性计算的开发者们来反馈问题哦~

相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
相关文章
|
4月前
|
TensorFlow 调度 算法框架/工具
【Hello AI】通过Docker安装并使用cGPU服务
cGPU服务可以隔离GPU资源,实现多个容器共用一张GPU卡。该服务作为阿里云容器服务Kubernetes版ACK(Container Service for Kubernetes)的组件对外提供服务,本文介绍如何通过Docker安装并使用cGPU服务。
|
4月前
|
人工智能 弹性计算 自然语言处理
【Hello AI】AIACC-ACSpeed性能数据
本文展示了AIACC-ACSpeed的部分性能数据,相比较通过原生DDP训练模型后的性能数据,使用AIACC-ACSpeed训练多个模型时,性能具有明显提升。
|
4月前
|
人工智能 弹性计算 PyTorch
【Hello AI】安装和使用Deepytorch-面向生成式AI和大模型场景
Deepytorch是阿里云自研的AI加速器,面向生成式AI和大模型场景,提供了显著的训练和推理加速能力。本文主要介绍安装并使用Deepytorch的操作方法。
|
4月前
|
人工智能 并行计算 PyTorch
【Hello AI】手动安装AIACC-Inference(AIACC推理加速)Torch版
AIACC-Inference(AIACC推理加速)支持优化基于Torch框架搭建的模型,能够显著提升推理性能。本文介绍如何手动安装AIACC-Inference(AIACC推理加速)Torch版并提供示例体验推理加速效果。
|
4月前
|
PyTorch 算法框架/工具 异构计算
【Hello AI】安装并使用DeepGPU-LLM-处理大语言模型任务
在处理大语言模型任务中,您可以根据实际业务部署情况,选择在不同环境(例如GPU云服务器环境或Docker环境)下安装推理引擎DeepGPU-LLM,然后通过使用DeepGPU-LLM工具实现大语言模型(例如Llama模型、ChatGLM模型、百川Baichuan模型或通义千问Qwen模型)在GPU上的高性能推理优化功能
|
4月前
|
并行计算 Linux 文件存储
【Hello AI】安装并使用FastGPU-命令行使用说明
用户可以通过FastGPU的命令行,快速地部署云上GPU集群,管理资源的生命周期。还可以便捷地为集群安装深度学习环境,在集群运行代码,查看运行日志以及释放资源。
|
4月前
|
人工智能 弹性计算 开发工具
【Hello AI】安装并使用FastGPU-Python SDK使用说明
用户可以通过FastGPU提供的Python接口,将FastGPU集成到您的人工智能训练或推理脚本中,从而实现快速的云上部署和资源管理。
|
4月前
|
人工智能 弹性计算 固态存储
【Hello AI】AIACC-AGSpeed性能数据
本文展示了AIACC-AGSpeed(简称AGSpeed)的部分性能数据,相比较通过PyTorch原生Eager模式训练模型后的性能数据,使用AGSpeed训练多个模型时,性能具有明显提升。
|
4月前
|
机器学习/深度学习 人工智能 PyTorch
【Hello AI】安装和使用AIACC-AGSpeed(优化PyTorch深度学习模型)
AIACC-AGSpeed(简称AGSpeed)专注于优化PyTorch深度学习模型在阿里云GPU异构计算实例上的计算性能,相比原始的神龙AI加速引擎AIACC,可以实现无感的计算优化性能。本文为您介绍安装和使用AGSpeed的方法。
|
4月前
|
人工智能 弹性计算 测试技术
【Hello AI】AIACC-ACSpeed体验示例
AIACC-ACSpeed(简称ACSpeed)作为阿里云自研的AI训练加速器,在提高训练效率的同时能够降低使用成本,可以实现无感的分布式通信性能优化。ACSpeed软件包中已为您提供了适配DDP的示例代码,您可以参考本文快速体验使用ACSpeed进行模型分布式训练的过程以及性能提升效果。
http://www.vxiaotou.com