來源:官方博客
翻譯:PyTorch 開發者社區(微信公衆號)html
今天的機器學習須要分佈式計算。不管是訓練網絡、調整超參數、服務模型仍是處理數據,機器學習都是計算密集型的,若是沒有訪問集羣,速度會很是慢。git
Ray 是一個流行的分佈式 Python 框架,它能夠與 PyTorch 配對,以快速擴展機器學習應用。github
本篇文章介紹 Ray 生態系統的各類元素,以及如何與 PyTorch 搭配使用!redis
Ray 是一個並行和分佈式 Python 的開源庫。算法
從高層次上看,Ray 生態系統由三部分組成:核心 Ray 系統、用於機器學習的可擴展庫(包括原生庫和第三方庫),以及用於在任何集羣或雲提供商上啓動集羣的工具。安全
Ray 能夠用來在多個核心或機器上擴展 Python 應用。它有幾個主要的優勢,包括:bash
簡單性:你能夠擴展你的 Python 應用,而不須要重寫,一樣的代碼能夠在一臺機器或多臺機器上運行。微信
穩健性:應用程序能夠優雅地處理機器故障和進程搶佔。網絡
性能:任務以毫秒級的延遲運行,可擴展到數萬個內核,並以最小的序列化開銷處理數值數據。框架
因爲Ray是一個通用框架,社區在它的基礎上創建了許多庫和框架來完成不一樣的任務。
這些庫和框架絕大多數都支持 PyTorch,只需對代碼進行最小程度的修改,並能相互無縫集成。如下是生態系統中衆多庫中的一部分。
圖注:在 p3dn.24xlarge 實例上,PyTorch 的 DataParallel 與 Ray 的比較(Ray 在下面使用
PyTorch 的分佈式 DataParallel)。
RaySGD 是一個爲數據並行訓練提供分佈式訓練包裝的庫。例如,RaySGD TorchTrainer(https://docs.ray.io/en/master...) 是一個圍繞 torch.distributed.launch 的包裝器。它提供了一個 Python API,能夠輕鬆地將分佈式訓練歸入到一個更大的 Python 應用程序中,而不是須要將你的訓練代碼包裝在 bash 腳本中。
該庫的其餘一些優勢是:
易用性:您能夠擴展 PyTorch 的原生 DistributedDataParallel,而無需監控單個節點。
可擴展性:您能夠對 PyTorch 的原生分佈式數據並行進行擴展,而無需監控單個節點。您能夠向上和向下擴展。從單個 CPU 開始。只需更改兩行代碼,便可擴展到多節點、多 CPU 或多 GPU 集羣。
加速訓練:NVIDIA Apex 內置了對混合精度訓練的支持。
容錯功能:支持在雲機被搶佔時自動恢復。
兼容性:支持與其餘庫無縫集成,如:NVIDIA Apex。可與其餘庫無縫集成,如Ray Tune 和 Ray Serve。
你能夠經過安裝 Ray(pip install -U ray torch)並運行下面的代碼,來開始使用 TorchTrainer:
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。
圖注:Ray Tune 實現的優化算法,如基於羣體的訓練(如上圖所示),能夠與 PyTorch 一塊兒使用,以得到更高性能的模型。
Ray Tune 是一個 Python 庫,用於任何規模的實驗執行和超參數調整,該庫的一些優勢是:
你能夠經過安裝 Ray(pip install ray torch torchvision)並運行下面的代碼,來開始使用 Ray Tune。
import numpy as np import torch import torch.optim as optim from ray import tune from ray.tune.examples.mnist_pytorch import get_data_loaders, train, test import ray import sys if len(sys.argv) > 1: ray.init(redis_address=sys.argv[1]) import torch.nn as nn import torch.nn.functional as F class ConvNet(nn.Module): def __init__(self): super(ConvNet, self).__init__() self.conv1 = nn.Conv2d(1, 3, kernel_size=3) self.fc = nn.Linear(192, 10) def forward(self, x): x = F.relu(F.max_pool2d(self.conv1(x), 3)) x = x.view(-1, 192) x = self.fc(x) return F.log_softmax(x, dim=1) def train_mnist(config): model = ConvNet() train_loader, test_loader = get_data_loaders() optimizer = optim.SGD( model.parameters(), lr=config["lr"], momentum=config["momentum"]) for i in range(10): train(model, optimizer, train_loader, torch.device("cpu")) acc = test(model, test_loader, torch.device("cpu")) tune.track.log(mean_accuracy=acc) if i % 5 == 0: # This saves the model to the trial directory torch.save(model.state_dict(), "./model.pth") from ray.tune.schedulers import ASHAScheduler search_space = { "lr": tune.choice([0.001, 0.01, 0.1]), "momentum": tune.uniform(0.1, 0.9) } analysis = tune.run( train_mnist, num_samples=30, scheduler=ASHAScheduler(metric="mean_accuracy", mode="max", grace_period=1), config=search_space)
註釋:該腳本向你展現瞭如何利用最早進的早期中止算法 AHSA,它能夠終止那些不太有前途的試驗,並將更多的時間和資源分配給更有前途的試驗。
圖注:Ray Serve 不只能夠用來單獨爲模型服務,還能夠用來擴展其餘服務工具,好比 FastAPI。
Ray Serve 是一個易於使用的可擴展模型服務的庫。該庫的一些優勢是:
可以使用一個工具包來服務從深度學習模型(PyTorch,TensorFlow等)到 scikit-learn 模型,再到任意的 Python 業務邏輯。
可擴展到許多機器,不管是在你的數據中心仍是在雲端。
與許多其餘庫兼容,如 Ray Tune 和 FastAPI。
若是您想了解如何將 Ray Serve 和 Ray Tune 一塊兒整合到您的 PyTorch 工做流中,您應該查看文檔以獲取完整的代碼示例。
圖注:RLlib 提供了幾乎全部訓練方面的定製方法,包括神經網絡模型、動做分佈、策略定義、環境和樣本收集過程。
RLlib 提供了幾乎全部訓練方面的定製方法,包括神經網絡模型、動做分佈、策略定義、環境和樣本收集過程。
RLlib 是一個用於強化學習的庫,它既提供了高擴展性,又爲各類應用提供了統一的 API,優點包括:
圖注:Ray Cluster Launcher簡化了在任何集羣或雲提供商上啓動和擴展的過程。
一旦您在筆記本電腦上開發了一個應用程序,並但願將其擴展到雲端(也許有更多的數據或更多的 GPU),接下來的步驟並不老是很清楚。這個過程要麼讓基礎設施團隊爲你設置,要麼經過如下步驟:
一個更簡單的方法是使用 Ray Cluster Launcher 在任何集羣或雲提供商上啓動和擴展機器。Cluster Launcher 容許你自動縮放、同步文件、提交腳本、端口轉發等。這意味着您能夠在 Kubernetes、AWS、GCP、Azure 或私有集羣上運行您的 Ray 集羣,而無需瞭解集羣管理的低級細節。
## 總結
圖注:Ray 爲螞蟻金服集團的 Fusion Engine 提供了一個分佈式計算基礎。
本文包含了 Ray 在 PyTorch 生態系統中的一些好處。Ray 被普遍用於各類應用,從螞蟻金服集團使用 Ray 支持其金融業務,到 LinkedIn 在 Yarn 上運行Ray,再到 Pathmind 使用 Ray 將強化學習與模擬軟件鏈接起來,等等。
若是你有任何關於 Ray 的問題或想法,或者想了解更多關於並行和分佈式Python 的信息,請經過 Discourse、Slack 或 GitHub 加入項目的社區。