PyTorch & 分佈式框架 Ray :保姆級入門教程

來源:官方博客
翻譯:PyTorch 開發者社區(微信公衆號)html

今天的機器學習須要分佈式計算。不管是訓練網絡、調整超參數、服務模型仍是處理數據,機器學習都是計算密集型的,若是沒有訪問集羣,速度會很是慢。git

Ray 是一個流行的分佈式 Python 框架,它能夠與 PyTorch 配對,以快速擴展機器學習應用。github

本篇文章介紹 Ray 生態系統的各類元素,以及如何與 PyTorch 搭配使用!redis

Ray 是什麼?

在這裏插入圖片描述

Ray 是一個並行和分佈式 Python 的開源庫。算法

從高層次上看,Ray 生態系統由三部分組成:核心 Ray 系統、用於機器學習的可擴展庫(包括原生庫和第三方庫),以及用於在任何集羣或雲提供商上啓動集羣的工具。安全

Ray 的核心繫統

Ray 能夠用來在多個核心或機器上擴展 Python 應用。它有幾個主要的優勢,包括:bash

簡單性:你能夠擴展你的 Python 應用,而不須要重寫,一樣的代碼能夠在一臺機器或多臺機器上運行。微信

穩健性:應用程序能夠優雅地處理機器故障和進程搶佔。網絡

性能:任務以毫秒級的延遲運行,可擴展到數萬個內核,並以最小的序列化開銷處理數值數據。框架

Ray 的 library 生態

因爲Ray是一個通用框架,社區在它的基礎上創建了許多庫和框架來完成不一樣的任務。

這些庫和框架絕大多數都支持 PyTorch,只需對代碼進行最小程度的修改,並能相互無縫集成。如下是生態系統中衆多庫中的一部分。

RaySGD

在這裏插入圖片描述

圖注:在 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

在這裏插入圖片描述

圖注:Ray Tune 實現的優化算法,如基於羣體的訓練(如上圖所示),能夠與 PyTorch 一塊兒使用,以得到更高性能的模型。

Ray Tune 是一個 Python 庫,用於任何規模的實驗執行和超參數調整,該庫的一些優勢是:

  • 可以在不到 10 行代碼中啓動多節點分佈式超參數掃描。
  • 支持包括 PyTorch 在內的全部主流機器學習框架。
  • 對 GPU 的一流支持。
  • 自動管理檢查點並將日誌記錄到 TensorBoard。
  • 訪問最早進的算法,如基於羣體的訓練(PBT)、BayesOptSearch、HyperBand/ASHA。

你能夠經過安裝 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

在這裏插入圖片描述

圖注:Ray Serve 不只能夠用來單獨爲模型服務,還能夠用來擴展其餘服務工具,好比 FastAPI。

Ray Serve 是一個易於使用的可擴展模型服務的庫。該庫的一些優勢是:

可以使用一個工具包來服務從深度學習模型(PyTorch,TensorFlow等)到 scikit-learn 模型,再到任意的 Python 業務邏輯。
可擴展到許多機器,不管是在你的數據中心仍是在雲端。
與許多其餘庫兼容,如 Ray Tune 和 FastAPI。

若是您想了解如何將 Ray Serve 和 Ray Tune 一塊兒整合到您的 PyTorch 工做流中,您應該查看文檔以獲取完整的代碼示例。

RLlib

在這裏插入圖片描述

圖注:RLlib 提供了幾乎全部訓練方面的定製方法,包括神經網絡模型、動做分佈、策略定義、環境和樣本收集過程。

RLlib 提供了幾乎全部訓練方面的定製方法,包括神經網絡模型、動做分佈、策略定義、環境和樣本收集過程。

RLlib 是一個用於強化學習的庫,它既提供了高擴展性,又爲各類應用提供了統一的 API,優點包括:

  • 原生支持 PyTorch、TensorFlow Eager 和 TensorFlow(1.x和2.x)。
  • 支持無模型、基於模型、進化、規劃和多代理算法。
  • 經過簡單的配置標誌和自動封裝器支持複雜的模型類型,如注意力網和LSTM 堆棧。
  • 與 Ray Tune 等其餘庫的兼容性。

Cluster Launcher

在這裏插入圖片描述

圖注:Ray Cluster Launcher簡化了在任何集羣或雲提供商上啓動和擴展的過程。

一旦您在筆記本電腦上開發了一個應用程序,並但願將其擴展到雲端(也許有更多的數據或更多的 GPU),接下來的步驟並不老是很清楚。這個過程要麼讓基礎設施團隊爲你設置,要麼經過如下步驟:

  1. 選擇一個雲提供商(AWS、GCP 或 Azure)。
  2. 導航管理控制檯,設置實例類型、安全策略、節點、實例限制等。
  3. 弄清楚如何在集羣上分發你的 Python 腳本。

一個更簡單的方法是使用 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 加入項目的社區。

在這裏插入圖片描述

相關文章
相關標籤/搜索