使用RaySGD更快,更便宜的PyTorch

2020-05-12 18:10:16 浏览数 (1)

作者 | Richard Liaw

来源 | Medium

编辑 | 代码医生团队

分发深度学习模型训练已经成为何时进行训练的问题,而不是如果这样做。最先进的ML模型(例如BERT)具有数亿个参数,而在一台机器上训练这些大型网络将花费数天甚至数周的时间。

语言模型正变得越来越大。

从根本上讲,在训练深度学习模型时,有两种选择:

选项1:容许20小时的训练时间,或专注于足够小的模型以在单个节点(或单个GPU)上训练的模型,以使事情简单并能够使用Jupyter Notebook之类的标准工具。

选项2:经历一连串的痛苦,然后尝试分发训练。

那么,今天分发训练需要什么?

要使训练超出单个节点,将需要处理:

  1. 凌乱的分布式系统部署(包括设置网络,容器化,凭据)。
  2. 针对昂贵节点的大量AWS账单(当前解决方案不允许使用廉价的可抢占实例)。
  3. 无法访问喜欢的工具,例如Jupyter笔记本。

可以使用集成工具之一来进行分布式训练,例如Torch Distributed Data Parallel或tf.Distributed。尽管这些是“集成的”,但它们肯定不是在公园中散步时使用的。

Torch的AWS教程演示了要简单地使集群运行就必须遵循的许多设置步骤,并且Tensorflow 2.0存在很多问题。

也许可能会看到类似Horovod的东西,但是Horovod将要求与过时的框架(如MPI)作斗争,并在启动时等待很长时间进行编译。

随着这种复杂的设置,将需要放弃使用的典型工具,例如Jupyter笔记本电脑。最重要的是,将不得不使用昂贵的按需实例,因为这些框架都不是容错的。

在自己的工作中,将这些问题确定为简化分布式深度学习训练的障碍。着手创建自己的解决方案来解决这些关键问题。

那么,有什么更好的方法呢?

RaySGD —简单的分布式训练解决方案

为了解决上述问题,构建了RaySGD。

https://ray.readthedocs.io/en/latest/raysgd/raysgd_pytorch.html

它是建立在分布式PyTorch之上的轻量级Python库,不仅使部署变得容易,而且还提供了进行前沿研发所需的灵活性。

这比已有的更好吗?

RaySGD着重于几个主要优点:

  • 无缝并行化:只需一个参数即可从1个GPU扩展到100个GPU。
  • 加速训练:内置对NVIDIA Apex混合精度训练的支持。
  • 简单,本机的界面:将界面保持简单,以使其易于迁移现有的训练代码并降低精神负担-只需学习几行新代码即可。
  • 容错:支持抢占云上的计算机时自动恢复。现在可以使用竞价型实例将成本降低多达90%。
  • 无缝的超参数调整:RaySGD与RayTune集成,后者是一种尖端的分布式超参数调整框架。

除了上述成就之外,RaySGD还可以与Horovod等专业SOTA深度学习框架相媲美。

在p3dn.24xlarge实例上比较Horovod vs Ray(在后台使用Pytorch分布式DataParallel)。Horovod和Ray在不同规模上的表现相似。

torch.nn.DataParallel在8个GPU上,RaySGD的性能也比默认设置高出20%。

在p3dn.24xlarge实例上比较PyTorch DataParallel与Ray(在引擎盖下使用Pytorch Distributed DataParallel)。无论有没有混合精度,Ray都能更好地扩展,在8个GPU上的性能提高了20%。

RaySGD建立在Ray之上,Ray是用于快速,简单的分布式计算的框架。在现场或抢占式实例上进行训练以节省大量成本,就像更改一行代码一样简单:trainer.train(max_retries=100)

该如何开始?

RaySGD提供了一个最小的API,可为用户提供已经从TensorFlow或PyTorch熟悉的典型可定制性。这是运行多GPU训练工作所需的最低要求。

  1. pip install -U ray torch
  2. 运行以下脚本。
代码语言:javascript复制
import torch
from torch.utils.data import DataLoader
from torchvision.datasets import CIFAR10
import torchvision.transforms as transforms
 
import ray
from ray.util.sgd.torch import TorchTrainer
# https://github.com/kuangliu/pytorch-cifar/blob/master/models/resnet.py
from ray.util.sgd.torch.resnet import ResNet18
 
 
def cifar_creator(config):
    """Returns dataloaders to be used in `train` and `validate`."""
    tfms = transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize((0.4914, 0.4822, 0.4465),
                             (0.2023, 0.1994, 0.2010)),
    ])  # meanstd transformation
    train_loader = DataLoader(
        CIFAR10(root="~/data", download=True, transform=tfms), batch_size=config["batch"])
    validation_loader = DataLoader(
        CIFAR10(root="~/data", download=True, transform=tfms), batch_size=config["batch"])
    return train_loader, validation_loader
 
 
def optimizer_creator(model, config):
    """Returns an optimizer (or multiple)"""
    return torch.optim.SGD(model.parameters(), lr=config["lr"])
 
ray.init()
 
trainer = TorchTrainer(
    model_creator=ResNet18,  # A function that returns a nn.Module
    data_creator=cifar_creator,  # A function that returns dataloaders
    optimizer_creator=optimizer_creator,  # A function that returns an optimizer
    loss_creator=torch.nn.CrossEntropyLoss,  # A loss function
    config={"lr": 0.01, "batch": 64},  # parameters
    num_workers=2,  # amount of parallelism
    use_gpu=torch.cuda.is_available(),
    use_tqdm=True)
 
stats = trainer.train()
print(trainer.validate())
 
torch.save(trainer.state_dict(), "checkpoint.pt")
trainer.shutdown()
print("success!")

这个简单的脚本将下载CIFAR10并使用ResNet18模型进行图像分类。只需更改一个参数(num_workers=N)就可以在多个GPU上运行。

如何在整个集群中扩展PyTorch训练?

别担心,这只是4个额外的步骤。将演示如何在AWS 上运行RaySGD,但是在SLURM,Azure,GCP或本地群集上运行同样容易。

  1. 下载以下YAML文件和以前的python脚本(另存为pytorch.py)。
  2. ray.init()将脚本更改为ray.init(address="auto")
  3. 更改num_workers=16的TorchTrainer构造函数。
  4. 运行ray submit ray-cluster.yaml pytorch.py --start --stop。这将自动启动可抢占式群集(总共16个V100 GPU),并在训练结束后立即关闭群集。30分钟后,这将花费…$ 7.44。
代码语言:javascript复制
cluster_name: sgd-pytorch
provider: {type: aws, region: us-east-1} # Also supports GCP and Azure
auth: {ssh_user: ubuntu}
 
min_workers: 3
initial_workers: 3
max_workers: 3
 
head_node:
    InstanceType: p3.8xlarge  # 4 V100 GPUs
    ImageId: ami-0757fc5a639fe7666
    InstanceMarketOptions: {MarketType: spot}
 
worker_nodes:
    InstanceType: p3.8xlarge  # 4 V100 GPUs
    ImageId: ami-0757fc5a639fe7666 # Deep Learning AMI
    InstanceMarketOptions: {MarketType: spot}
 
setup_commands: # Install on each node
    - pip install -U ray[rllib] torch torchvision
    # Optionally, install apex.
    # - git clone https://github.com/NVIDIA/apex && cd apex && pip install -v --no-cache-dir  ./

将其另存为“ ray-cluster.yaml”。Apex安装是可选的,为简单起见已注释掉。

要在GCP或Azure上运行,只需在上述YAML中更改几行- 此处提供了更多说明。

https://ray.readthedocs.io/en/latest/autoscaling.html

使用RaySGD进行安装和运行很简单-在此文章中,已经学到了几乎所有需要的知识。

  • 文献资料

https://ray.readthedocs.io/en/latest/raysgd/raysgd_pytorch.html

  • 代码

https://github.com/ray-project/ray/tree/master/python/ray/util/sgd/torch

  • 定制训练的示例

https://ray.readthedocs.io/en/latest/raysgd/raysgd_pytorch.html#torchtrainer-examples

  • 分布式超参数调整的示例

https://ray.readthedocs.io/en/latest/raysgd/raysgd_pytorch.html#advanced-hyperparameter-tuning

0 人点赞