作者 | Richard Liaw
来源 | Medium
编辑 | 代码医生团队
分发深度学习模型训练已经成为何时进行训练的问题,而不是如果这样做。最先进的ML模型(例如BERT)具有数亿个参数,而在一台机器上训练这些大型网络将花费数天甚至数周的时间。
语言模型正变得越来越大。
从根本上讲,在训练深度学习模型时,有两种选择:
选项1:容许20小时的训练时间,或专注于足够小的模型以在单个节点(或单个GPU)上训练的模型,以使事情简单并能够使用Jupyter Notebook之类的标准工具。
选项2:经历一连串的痛苦,然后尝试分发训练。
那么,今天分发训练需要什么?
要使训练超出单个节点,将需要处理:
- 凌乱的分布式系统部署(包括设置网络,容器化,凭据)。
- 针对昂贵节点的大量AWS账单(当前解决方案不允许使用廉价的可抢占实例)。
- 无法访问喜欢的工具,例如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训练工作所需的最低要求。
- pip install -U ray torch
- 运行以下脚本。
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或本地群集上运行同样容易。
- 下载以下YAML文件和以前的python脚本(另存为pytorch.py)。
- ray.init()将脚本更改为ray.init(address="auto")
- 更改num_workers=16的TorchTrainer构造函数。
- 运行ray submit ray-cluster.yaml pytorch.py --start --stop。这将自动启动可抢占式群集(总共16个V100 GPU),并在训练结束后立即关闭群集。30分钟后,这将花费…$ 7.44。
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