出典:公式ブログ
翻訳:PyTorch開発者コミュニティ(WeChat公式アカウント)
今日の機械学習には分散コンピューティングが必要です。ネットワークのトレーニング、ハイパーパラメータの調整、モデルの提供、データの処理など、機械学習は計算量が多くなります。クラスタにアクセスしないと、速度が非常に遅くなります。
Rayは人気のある分散Pythonフレームワークであり、PyTorchと組み合わせて、機械学習アプリケーションをすばやく拡張できます。
この記事では、Rayエコシステムのさまざまな要素と、PyTorchでの使用方法を紹介します。
レイとは何ですか?
Rayは、並列分散型Python用のオープンソースライブラリです。
高レベルの観点から、Rayエコシステムは、コアRayシステム、機械学習用の拡張ライブラリ(ネイティブライブラリとサードパーティライブラリを含む)、および任意のクラスターまたはクラウドプロバイダーツールでクラスターを開始するためのシステムの3つの部分で構成されます。
レイのコアシステム
Rayを使用して、複数のコアまたはマシンでPythonアプリケーションを拡張できます。これには、次のようないくつかの主な利点があります。
シンプルさ:Pythonアプリケーションを書き直すことなく拡張でき、同じコードを1台のマシンまたは複数のマシンで実行できます。
堅牢性:アプリケーションは、マシンの障害を処理し、プリエンプションを適切に処理できます。
パフォーマンス:タスクはミリ秒の遅延で実行され、数万のコアに拡張でき、最小限のシリアル化オーバーヘッドで数値データを処理します。
レイの図書館生態学
Rayは一般的なフレームワークであるため、コミュニティはそれに基づいてさまざまなタスクを実行するために多くのライブラリとフレームワークを確立しています。
これらのライブラリとフレームワークのほとんどはPyTorchをサポートしており、コードの変更は最小限で、相互にシームレスに統合されています。以下は、エコシステム内の多くのライブラリの一部です。
RaySGD
凡例:p3dn.24xlargeインスタンスでのPyTorchのDataParallelとRayの比較(Rayは
以下のPyTorchの分散DataParallelを使用します)。
RaySGDは、データ並列トレーニング用の分散トレーニングパッケージを提供するライブラリです。たとえば、RaySGD TorchTrainer(https://docs.ray.io/en/master/raysgd/raysgd_pytorch.html)は、torch.distributed.launchのラッパーです。トレーニングコードをbashスクリプトでラップする代わりに、分散トレーニングをより大きなPythonアプリケーションに簡単に組み込むことができるPythonAPIを提供します。
ライブラリの他のいくつかの利点は次のとおりです。
使いやすさ:個々のノードを監視せずに、PyTorchのネイティブDistributedDataParallelを拡張できます。
スケーラビリティ:単一ノードを監視せずに、PyTorchのネイティブ分散データを並行して拡張できます。上下に拡張できます。単一のCPUから始めます。マルチノード、マルチCPU、またはマルチGPUクラスターに拡張するには、2行のコードを変更するだけで済みます。
加速トレーニング:NVIDIA Apexには、混合精度トレーニングのサポートが組み込まれています。
フォールトトレラント機能:クラウドマシンがプリエンプションされた場合の自動回復をサポートします。
互換性:NVIDIAApexなどの他のライブラリとのシームレスな統合をサポートします。RayTuneやRayServeなどの他のライブラリとシームレスに統合できます。
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モデルを使用します。複数のGPUを利用するには、1つのパラメーター(num_workers = N)を変更するだけで済みます。
レイチューン
凡例:グループベースのトレーニング(上の図に示す)など、Ray Tuneによって実装された最適化アルゴリズムを、PyTorchで使用して、より高性能なモデルを取得できます。
Ray Tuneは、実験の実行と任意のスケールのハイパーパラメータ調整のためのPythonライブラリです。このライブラリの利点のいくつかは次のとおりです。
- 10行未満のコードでマルチノード分散ハイパーパラメータスキャンを開始できます。
- PyTorchを含むすべての主流の機械学習フレームワークをサポートします。
- GPUのファーストクラスのサポート。
- チェックポイントを自動的に管理し、TensorBoardにログを記録します。
- グループベースのトレーニング(PBT)、BayesOptSearch、HyperBand / ASHAなどの最先端のアルゴリズムにアクセスします。
Rayをインストールし(pip install ray torch torchvision)、次のコードを実行してRayTuneの使用を開始できます。
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ビジネスロジックまで、あらゆるものを提供できます。
データセンター内であろうとクラウド内であろうと、多くのマシンに拡張可能です。
RayTuneやFastAPIなどの他の多くのライブラリと互換性があります。
RayServeとRayTuneをPyTorchワークフローに統合する方法を知りたい場合は、完全なコード例についてドキュメントを確認する必要があります。
RLlib
凡例:RLlibは、ニューラルネットワークモデル、アクション配布、戦略定義、環境、サンプル収集プロセスなど、ほぼすべてのトレーニングの側面にカスタマイズ方法を提供します。
RLlibは、ニューラルネットワークモデル、アクション配布、戦略定義、環境、サンプル収集プロセスなど、ほぼすべてのトレーニングの側面に合わせてカスタマイズされたメソッドを提供します。
RLlibは強化学習用のライブラリであり、高いスケーラビリティを提供するだけでなく、さまざまなアプリケーションに統合されたAPIを提供します。利点は次のとおりです。
- PyTorch、TensorFlow Eager、TensorFlow(1.xおよび2.x)をネイティブにサポートします。
- モデルフリー、モデルベース、進化、計画、およびマルチエージェントアルゴリズムをサポートします。
- 単純な構成フラグと自動ラッパーを介して、アテンションネットやLSTMスタックなどの複雑なモデルタイプをサポートします。
- RayTuneなどの他のライブラリとの互換性。
クラスターランチャー
凡例:Ray Cluster Launcherは、クラスターまたはクラウドプロバイダーでの起動とスケーリングのプロセスを簡素化します。
ラップトップでアプリケーションを開発し、それをクラウドに拡張したい場合(おそらく、より多くのデータまたはより多くのGPUを使用して)、次のステップは必ずしも明確ではありません。このプロセスは、インフラストラクチャチームによって設定されるか、次の手順を実行します。
- クラウドプロバイダー(AWS、GCP、またはAzure)を選択します。
- 管理コンソールをナビゲートして、インスタンスタイプ、セキュリティポリシー、ノード、インスタンス制限などを設定します。
- Pythonスクリプトをクラスターに配布する方法を理解してください。
より簡単な方法は、Ray Cluster Launcherを使用して、任意のクラスターまたはクラウドプロバイダーでマシンを起動および拡張することです。Cluster Launcherを使用すると、ファイルの自動スケーリング、同期、スクリプトの送信、ポート転送などを行うことができます。つまり、クラスター管理の低レベルの詳細を理解していなくても、Kubernetes、AWS、GCP、Azure、またはプライベートクラスターでRayクラスターを実行できます。
総括する
凡例:Rayは、Ant FinancialGroupのFusionEngineに分散コンピューティングの基盤を提供します。
この記事には、PyTorchエコシステムにおけるRayの利点のいくつかが含まれています。Rayは、金融ビジネスをサポートするためにRayを使用するAnt Financial Group、Ray on Yarnを実行するLinkedIn、強化学習とシミュレーションソフトウェアを接続するためにRayを使用するPathmindなど、さまざまなアプリケーションで広く使用されています。
Rayについて質問やアイデアがある場合、または並列分散型Pythonについて詳しく知りたい場合は、Discourse、Slack、またはGitHubを介してプロジェクトのコミュニティに参加してください。