Pelatihan multi-GPU
Pelatihan multi-GPU di LibreYOLO menggunakan PyTorch DistributedDataParallel: satu proses per GPU, masing-masing memuat replika model lengkap dan shard setiap batch, dengan gradien dirata-ratakan pada semua rank di setiap langkah.
Jalankan pada dua GPU
Berikan daftar perangkat. Tidak ada hal lain yang berubah.
from libreyolo import LibreYOLO # Guard ini tetap didukung; skrip biasa juga berjalan tanpanya.# Pertahankan untuk objek callback/logger yang memerlukan fallback pickle standar.if __name__ == "__main__": model = LibreYOLO("LibreYOLO9s.pt") model.train( data="my-dataset.yaml", epochs=100, batch=32, # batch global: 16 gambar per GPU pada dua GPU device="0,1", )libreyolo train model=LibreYOLO9s.pt data=my-dataset.yaml \ epochs=100 batch=32 device=0,1Jika diberi lebih dari satu perangkat tanpa lingkungan torchrun, train() model menyimpan bobot ke berkas sementara, menentukan autobatch jika diminta, dan memulai proses worker yang dikelola koordinator, satu per GPU. Setiap worker mengimpor ulang kelas model, membangunnya kembali dari bobot tersimpan, lalu menjalankan jalur satu perangkat biasa, karena variabel lingkungan torchrun diatur di dalam worker yang dibuat. Checkpoint terbaik rank 0 dimuat kembali ke instance model pemanggil setelah proses selesai.
device menerima "0,1", [0, 1], 0, "cuda:0", "cpu", "mps", dan
"auto". Hanya daftar lebih dari satu indeks CUDA yang memicu spawn.
libreyolo train device=0,1, atau device=[0,1], membangun model di GPU pertama
dalam daftar dan meneruskan daftar itu ke train(), yang memulai worker dengan cara
yang sama.
Peluncuran otomatis dan main guard
model.train(device=[0, 1]) dan device="0,1" memakai rank yang dikelola koordinator tanpa menjalankan ulang kode tingkat atas skrip biasa tanpa guard. Skrip dengan guard dan torchrun eksplisit tetap didukung. Pekerjaan koordinator memakai cloudpickle; objek callback atau logger yang memerlukan fallback pickle standar tetap membutuhkan guard if __name__ == "__main__":.
batch adalah batch global
batch adalah jumlah gambar per langkah optimizer pada seluruh GPU. Dataloader
setiap rank dibangun dengan batch // world_size dan DistributedSampler,
sehingga batch=32 pada dua GPU berarti 16 gambar per GPU, bukan 32.
Batch yang tidak habis dibagi world size memunculkan error:
batch=6 is the global batch and must be divisible by world_size=4: each ranktrains at batch // world_size, so this value would silently train at adifferent global batch than requested. Use batch=4 or batch=8.Gradien dirata-ratakan oleh DDP, sehingga loss diteruskan tanpa penskalaan. Mengalikannya lagi dengan world size akan menaikkan learning rate efektif kira-kira sejumlah GPU.
Autobatch di bawah DDP
batch=-1 berfungsi dan mengembalikan batch global yang habis dibagi world size.
from libreyolo import LibreYOLO if __name__ == "__main__": model = LibreYOLO("LibreYOLO9s.pt") # Diperiksa sekali pada GPU 0, lalu diskalakan ke kelipatan world-size. model.train(data="my-dataset.yaml", batch=-1, device="0,1")Pada jalur spawn, pemeriksaan berjalan di proses parent pada perangkat pertama sebelum worker dibuat, sehingga setiap worker menerima integer konkret. Di bawah torchrun, rank 0 memeriksa dan menyiarkan hasil sebagai satu tensor long.
Pemeriksaan mengukur kapasitas satu GPU dan mengalikannya dengan world size. Jika
nbs ditetapkan, batch global dibatasi ke nbs dan dibulatkan turun ke kelipatan
world size, sehingga penambahan GPU mengurangi langkah akumulasi, bukan mengecilkan
batch per GPU. Mekanisme pemeriksaan tersedia di
Hyperparameter.
SyncBatchNorm
Di bawah DDP, lapisan BatchNorm setiap rank hanya melihat shard-nya. Jika
batch // world_size kecil, running statistics dapat menurunkan hasil model
dibanding proses satu GPU.
sync_bn=True mengubah setiap BatchNorm menjadi SyncBatchNorm agar statistik
dihitung pada batch global. Konversi hanya terjadi saat distributed aktif.
Pengaturan ini sudah aktif secara default untuk family konvolusional yang banyak
menggunakan BatchNorm: YOLOX, YOLOv7, YOLOv9 dan variannya, YOLO-NAS, PicoDet,
RTMDet, serta FOMO. Family lain default nonaktif. Jika model memiliki BatchNorm,
sync_bn nonaktif, dan batch per rank di bawah 16, trainer memberi warning.
from libreyolo import LibreYOLO if __name__ == "__main__": model = LibreYOLO("LibreRTDETRr18.pt") model.train( data="my-dataset.yaml", batch=32, device="0,1", sync_bn=True, )Tidak ada flag CLI untuk sync_bn; ini argumen Python.
Menjalankan dengan torchrun
torchrun juga dapat digunakan dan tepat ketika scheduler cluster mengelola peluncuran proses. Tulis skrip untuk satu perangkat dan biarkan torchrun menetapkan environment rank.
from libreyolo import LibreYOLO if __name__ == "__main__": model = LibreYOLO("LibreYOLO9s.pt") model.train(data="my-dataset.yaml", epochs=100, batch=32)torchrun --nproc_per_node=2 train.pyJangan gabungkan keduanya. Jika environment torchrun tersedia, device="0,1"
tidak melakukan spawn; trainer memakai cuda:LOCAL_RANK dan torchrun mengelola
jumlah proses.
Perilaku rank
Rank 0 menangani semua efek samping. Rank ini menyelesaikan direktori proses dan menyiarkan namanya, menulis checkpoint serta artefak, dan menjalankan callback serta logger pengguna. Rank lain berlatih dan menyumbangkan gradien.
Setiap rank memberi seed berbeda pada dataloader dan RNG augmentasi, yang
diturunkan dari seed, sehingga rank tidak mengambil augmentasi identik.
Platform dan backend
Backend dipilih otomatis: NCCL jika CUDA dan NCCL tersedia, Gloo jika tidak. NCCL tidak dibangun di Windows, sehingga Windows memakai Gloo tanpa konfigurasi. Process group diinisialisasi dengan timeout tiga jam.
Yang tidak berjalan di bawah DDP
- CUDA graph capture.
cuda_graph=Truemencatat satu baris dan berlatih secara eager. Lihat Performa pelatihan. - Profiler pelatihan.
profile=Truediabaikan dengan warning.
Tidak semua family mendukung spawn otomatis. Dua puluh empat family mendukungnya, mencakup family deteksi, classification, semantic, dan restoration yang dapat dilatih. Family tanpa dukungan yang menerima multi-GPU memunculkan error berisi API model dan perintah torchrun, bukan diam-diam berlatih pada satu GPU.
Terkait
- Hyperparameter untuk
batch,nbs, dan resume. - Logger eksperimen untuk batasan picklability callback.
- GPU cloud untuk menyewa mesin multi-GPU.