Pelatihan terdistribusi dengan TorchDistributor
Artikel ini menjelaskan cara melakukan pelatihan terdistribusi pada model ML PyTorch menggunakan TorchDistributor.
TorchDistributor adalah modul sumber terbuka di PySpark yang membantu pengguna melakukan pelatihan terdistribusi dengan PyTorch pada kluster Spark mereka, sehingga memungkinkan Anda meluncurkan pekerjaan pelatihan PyTorch sebagai pekerjaan Spark. Di bawah tenda, ini menginisialisasi lingkungan dan saluran komunikasi antara pekerja dan menggunakan perintah torch.distributed.run
CLI untuk menjalankan pelatihan terdistribusi di seluruh simpul pekerja.
API TorchDistributor mendukung metode yang ditunjukkan dalam tabel berikut.
Metode dan tanda tangan | Deskripsi |
---|---|
init(self, num_processes, local_mode, use_gpu) |
Buat instans TorchDistributor. |
run(self, main, *args) |
Menjalankan pelatihan terdistribusi dengan memanggil main(**kwargs) jika utama adalah fungsi dan menjalankan perintah torchrun main *args CLI jika utama adalah jalur file. |
Persyaratan
- Spark 3.4
- Databricks Runtime 13.0 ML atau lebih tinggi
Alur kerja pengembangan untuk buku catatan
Jika proses pembuatan dan pelatihan model terjadi sepenuhnya dari buku catatan di komputer lokal Anda atau Buku Catatan Databricks, Anda hanya perlu membuat perubahan kecil untuk menyiapkan kode Anda untuk pelatihan terdistribusi.
Siapkan kode node tunggal: Siapkan dan uji kode node tunggal dengan PyTorch, PyTorch Lightning, atau kerangka kerja lain yang didasarkan pada PyTorch/PyTorch Lightning seperti, HUGGINGFace Trainer API.
Siapkan kode untuk pelatihan terdistribusi standar: Anda perlu mengonversi pelatihan proses tunggal Anda ke pelatihan terdistribusi. Memiliki kode terdistribusi ini semua mencakup dalam satu fungsi pelatihan yang dapat Anda gunakan dengan
TorchDistributor
.Memindahkan impor dalam fungsi pelatihan: Tambahkan impor yang diperlukan, seperti
import torch
, dalam fungsi pelatihan. Melakukannya memungkinkan Anda untuk menghindari kesalahan acar umum. Selain itudevice_id
, model dan data yang terkait ditentukan oleh:device_id = int(os.environ["LOCAL_RANK"])
Luncurkan pelatihan terdistribusi
TorchDistributor
: Buat instans dengan parameter yang diinginkan dan panggil.run(*args)
untuk meluncurkan pelatihan.
Berikut ini adalah contoh kode pelatihan:
from pyspark.ml.torch.distributor import TorchDistributor
def train(learning_rate, use_gpu):
import torch
import torch.distributed as dist
import torch.nn.parallel.DistributedDataParallel as DDP
from torch.utils.data import DistributedSampler, DataLoader
backend = "nccl" if use_gpu else "gloo"
dist.init_process_group(backend)
device = int(os.environ["LOCAL_RANK"]) if use_gpu else "cpu"
model = DDP(createModel(), **kwargs)
sampler = DistributedSampler(dataset)
loader = DataLoader(dataset, sampler=sampler)
output = train(model, loader, learning_rate)
dist.cleanup()
return output
distributor = TorchDistributor(num_processes=2, local_mode=False, use_gpu=True)
distributor.run(train, 1e-3, True)
Memigrasikan pelatihan dari repositori eksternal
Jika Anda memiliki prosedur pelatihan terdistribusi yang sudah ada yang disimpan di repositori eksternal, Anda dapat dengan mudah bermigrasi ke Azure Databricks dengan melakukan hal berikut:
- Impor repositori: Impor repositori eksternal sebagai folder Git Databricks.
- Buat buku catatan baru Menginisialisasi Notebook Azure Databricks baru dalam repositori.
- Luncurkan pelatihan terdistribusi Dalam sel buku catatan, panggil
TorchDistributor
seperti berikut ini:
from pyspark.ml.torch.distributor import TorchDistributor
train_file = "/path/to/train.py"
args = ["--learning_rate=0.001", "--batch_size=16"]
distributor = TorchDistributor(num_processes=2, local_mode=False, use_gpu=True)
distributor.run(train_file, *args)
Pemecahan Masalah
Kesalahan umum untuk alur kerja buku catatan adalah bahwa objek tidak dapat ditemukan atau dipilih saat menjalankan pelatihan terdistribusi. Ini dapat terjadi ketika pernyataan impor pustaka tidak didistribusikan ke pelaksana lain.
Untuk menghindari masalah ini, sertakan semua pernyataan impor (misalnya, import torch
) baik di bagian atas fungsi pelatihan yang dipanggil dengan TorchDistributor(...).run(<func>)
dan di dalam fungsi lain yang ditentukan pengguna yang disebut dalam metode pelatihan.
Kegagalan NCCL: ncclInternalError: Internal check failed.
Ketika Anda mengalami kesalahan ini selama pelatihan multi-simpul, biasanya menunjukkan masalah dengan komunikasi jaringan di antara GPU. Masalah ini muncul ketika NCCL (Pustaka Komunikasi Kolektif NVIDIA) tidak dapat menggunakan antarmuka jaringan tertentu untuk komunikasi GPU.
Untuk mengatasi kesalahan ini, tambahkan cuplikan berikut dalam kode pelatihan Anda untuk menggunakan antarmuka jaringan utama.
import os
os.environ["NCCL_SOCKET_IFNAME"] = "eth0"
Contoh buku catatan
Contoh notebook berikut menunjukkan cara melakukan pelatihan terdistribusi dengan PyTorch.