Bagikan melalui


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.

  1. 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.

  2. 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.

  3. Memindahkan impor dalam fungsi pelatihan: Tambahkan impor yang diperlukan, seperti import torch, dalam fungsi pelatihan. Melakukannya memungkinkan Anda untuk menghindari kesalahan acar umum. Selain itu device_id , model dan data yang terkait ditentukan oleh:

    device_id = int(os.environ["LOCAL_RANK"])
    
  4. Luncurkan pelatihan terdistribusiTorchDistributor: 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:

  1. Impor repositori: Impor repositori eksternal sebagai folder Git Databricks.
  2. Buat buku catatan baru Menginisialisasi Notebook Azure Databricks baru dalam repositori.
  3. 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.

Pelatihan terdistribusi end-to-end di buku catatan Databricks

Dapatkan buku catatan

Mendistribusikan penyempurnaan buku catatan model Wajah Memeluk

Dapatkan buku catatan

Pelatihan terdistribusi pada buku catatan File PyTorch

Dapatkan buku catatan

Pelatihan terdistribusi menggunakan notebook PyTorch Lightning

Dapatkan buku catatan

Pemuatan data terdistribusi menggunakan notebook Petastorm

Dapatkan buku catatan