Ray Train & Ray Tune: Pelatihan Terdistribusi dan Penyetelan Hiperparameter
Sebagian besar proyek machine learning dimulai pada satu mesin, dan pada titik tertentu loop pelatihan kehabisan memori, terlalu lama pada satu GPU, atau membutuhkan ratusan percobaan hiperparameter yang tidak mungkin diselesaikan satu proses dalam waktu wajar. Ray Train dan Ray Tune menjawab kedua masalah itu secara langsung: yang pertama menskalakan loop pelatihan yang sudah ada ke beberapa worker dan GPU, dan yang kedua menjalankan banyak proses pelatihan secara paralel untuk menelusuri ruang hiperparameter. Tutorial ini membahas kedua pustaka tersebut dengan satu contoh PyTorch yang konsisten, lalu menunjukkan cara menggabungkannya sehingga Anda dapat menyetel hiperparameter sebuah job pelatihan terdistribusi tanpa menulis ulang kode.
Pengantar Singkat Ray dan Pustaka AI-nya
Ray adalah framework untuk Python terdistribusi. Pada intinya, Ray menyediakan task dan actor yang berjalan di seluruh cluster, ditambah scheduler yang menempatkan pekerjaan pada CPU dan GPU yang tersedia. Di atas inti itu, Ray AI Libraries menyediakan blok bangunan tingkat lebih tinggi untuk kebutuhan machine learning yang umum:
- Ray Data untuk pemuatan dan prapemrosesan data terdistribusi.
- Ray Train untuk pelatihan model terdistribusi.
- Ray Tune untuk pencarian hiperparameter dan orkestrasi eksperimen.
- Ray Serve untuk penyajian model online (dibahas di tutorial terpisah, jadi di sini hanya disebut sebagai konteks).
Sifat penting di sini adalah kode yang sama berjalan di laptop Anda maupun di cluster multi-node. Anda mengembangkan secara lokal, lalu mengarahkan skrip yang sama ke cluster ketika membutuhkan komputasi lebih besar. Tutorial ini berfokus pada Ray Train dan Ray Tune, yang bersama-sama mencakup tahap pelatihan dan penyetelan dalam alur kerja umum.
Instalasi
Instal Ray dengan ekstra Train dan Tune, ditambah PyTorch:
pip install "ray[train,tune]" torch torchvision
Verifikasi instalasi:
python -c "import ray; from ray import train, tune; print(ray.version)"
Contoh di bawah ditulis untuk Ray 2.x. API Ray Train ditata ulang pada seri 2.x, jadi pastikan Anda tidak memakai rilis di bawah 2.7 yang impornya berbeda.
Ray Train: Dari Satu Node ke Terdistribusi
Titik awal: loop PyTorch biasa
Perhatikan loop pelatihan satu proses yang umum untuk klasifikasi gambar pada FashionMNIST. Belum ada apa pun yang terdistribusi di dalamnya.
import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
def buildmodel():
return nn.Sequential(
nn.Flatten(),
nn.Linear(28 28, 256),
nn.ReLU(),
nn.Linear(256, 128),
nn.ReLU(),
nn.Linear(128, 10),
)
def trainsinglenode(epochs=5, lr=1e-3, batchsize=64):
transform = transforms.ToTensor()
traindata = datasets.FashionMNIST(
root="./data", train=True, download=True, transform=transform
)
loader = DataLoader(traindata, batchsize=batchsize, shuffle=True)
device = "cuda" if torch.cuda.isavailable() else "cpu"
model = buildmodel().to(device)
optimizer = torch.optim.Adam(model.parameters(), lr=lr)
lossfn = nn.CrossEntropyLoss()
for epoch in range(epochs):
model.train()
for images, labels in loader:
images, labels = images.to(device), labels.to(device)
optimizer.zerograd()
loss = lossfn(model(images), labels)
loss.backward()
optimizer.step()
print(f"epoch {epoch}: last batch loss {loss.item():.4f}")
Kode ini bekerja, tetapi memakai satu proses dan satu device. Untuk melatih lintas beberapa GPU atau beberapa node dengan data-parallelism, kita menyesuaikan loop ini untuk Ray Train.
Mengonversi loop dengan TorchTrainer
Ray Train membungkus fungsi pelatihan Anda dan menjalankan satu salinannya per worker. Setiap worker menangani satu shard data dan menyinkronkan gradien secara otomatis. Perubahannya kecil dan terlokalisasi: