0Pricing
Learn AI with Python · Lekcja

Trenowanie na wielu GPU za pomocą DataParallel

nn.DataParallel, równoważenie pamięci GPU, wąskie gardła przepustowości, kiedy DDP jest lepszym rozwiązaniem.

Trenowanie na wielu GPU za pomocą DataParallel to bezpłatna lekcja Learn AI with Python na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Learn AI with Python, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Learn AI with Python zawiera 4 lekcji w sumie.

Dlaczego wiele GPU

Współczesne modele i batch’e przekraczają możliwości pamięci oraz obliczeń pojedynczego GPU. Użycie wielu GPU pozwala trenować większe modele lub przetwarzać większe batch’e w krótszym czasie rzeczywistym. PyTorch oferuje kilka sposobów osiągnięcia tego celu; najprostszym z nich jest DataParallel.

Równoległość danych

Równoległość danych replikuje model na każdym GPU i dzieli każdy batch wejściowy między te urządzenia. Każdy GPU wykonuje obliczenia na swoim fragmencie, a następnie gradienty są łączone, aby wszystkie repliki pozostały zsynchronizowane.

nn.DataParallel

nn.DataParallel opakowuje model w jednej linii kodu. Przekazują Państwo identyfikatory używanych GPU, a PyTorch automatycznie rozdziela dane wejściowe i zbiera wyniki.

import torch
import torch.nn as nn

model = MyModel().cuda()
model = nn.DataParallel(model, device_ids=[0, 1])

Automatyczny podział batcha

Podczas przebiegu w przód DataParallel dzieli batch wzdłuż wymiaru 0 między wymienione GPU. Batch o rozmiarze 64 na dwóch GPU staje się dwoma podbatchami po 32 elementy. Każdy GPU równolegle uruchamia ten sam model na swoim podbatchu.

# batch of 64 with device_ids=[0, 1]
# GPU 0 processes samples 0..31
# GPU 1 processes samples 32..63

Uśrednianie gradientów

Podczas przebiegu wstecznego gradienty z poszczególnych GPU są zbierane na urządzeniu głównym i uśredniane (w praktyce sumowane i skalowane), tak aby aktualizacja modelu uwzględniała cały batch. Następnie repliki są ponownie synchronizowane przed kolejnym krokiem.

Zwykła pętla trenowania

Najlepsze jest to, że pętla trenowania prawie się nie zmienia. Przenoszą Państwo dane na główny GPU i wywołują opakowany model jak zwykle; DataParallel zajmuje się rozdzielaniem danych w tle.

for x, y in loader:
    x, y = x.cuda(), y.cuda()
    optimizer.zero_grad()
    out = model(x)            # auto-split across GPUs
    loss = criterion(out, y)
    loss.backward()           # gradients averaged
    optimizer.step()

Nierównomierne obciążenie GPU 0

DataParallel ma dobrze znaną wadę: główny GPU (zwykle GPU 0) zbiera wszystkie wyniki i oblicza funkcję straty, więc jest dodatkowo obciążony pamięciowo i obliczeniowo. Przy wielu GPU GPU 0 staje się wąskim gardłem i może zabraknąć na nim pamięci, zanim zabraknie jej na pozostałych urządzeniach.

Jeden proces, wiele wątków

DataParallel działa w jednym procesie Pythona i używa wątków do sterowania GPU. Globalna blokada interpretera Pythona oraz narzut związany z rozdzielaniem i zbieraniem danych ograniczają efektywność skalowania, szczególnie powyżej 2–4 GPU.

Dlaczego preferowany jest DDP

Z tych powodów do poważnych zastosowań z wieloma GPU zalecany jest DistributedDataParallel (DDP). DDP uruchamia jeden proces na każdy GPU, synchronizuje gradienty za pomocą wydajnej operacji all-reduce i eliminuje wąskie gardło GPU 0, zapewniając niemal liniowe skalowanie.

Kiedy DataParallel nadal wystarcza

DataParallel jest odpowiedni do szybkich eksperymentów na jednej maszynie z 2 GPU, gdzie prostota konfiguracji w jednej linii przewyższa wynikającą z niej nieefektywność. W przypadku trenowania na wielu węzłach lub z użyciem wielu GPU proszę zamiast tego sięgnąć po DDP.

Typowa pułapka: zapisywanie

State dict opakowanego modelu ma prefiks module.. Aby zapisać czysty checkpoint, należy zapisać model.module.state_dict(), dzięki czemu później zostanie on poprawnie wczytany do nieopakowanego modelu.

torch.save(model.module.state_dict(), "model.pt")

Szybkie sprawdzenie

Proszę sprawdzić swoją wiedzę o DataParallel.

Podsumowanie

Poznali Państwo trenowanie na wielu GPU z użyciem DataParallel:

  • nn.DataParallel(model, device_ids=[0, 1]) replikuje model i dzieli batche
  • Gradienty są co krok uśredniane między GPU
  • Nierównomierne obciążenie GPU 0 oraz architektura jednego procesu ograniczają skalowanie
  • W przypadku wielu GPU lub trenowania na wielu węzłach należy preferować DDP

Często zadawane pytania

Czy lekcja „Trenowanie na wielu GPU za pomocą DataParallel” jest bezpłatna?

Tak — pełny tekst „Trenowanie na wielu GPU za pomocą DataParallel” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Learn AI with Python, przejdź na CoddyKit PRO. Kurs Learn AI with Python zawiera 4 lekcji w sumie.

Co nauczysz się w „Trenowanie na wielu GPU za pomocą DataParallel”?

nn.DataParallel, równoważenie pamięci GPU, wąskie gardła przepustowości, kiedy DDP jest lepszym rozwiązaniem. Ćwiczysz Learn AI with Python z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Learn AI with Python?

Nie wymagamy żadnego doświadczenia. Learn AI with Python w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Trenowanie na wielu GPU za pomocą DataParallel”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Learn AI with Python?

Tak. Każda lekcja Learn AI with Python zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Trenowanie na wielu GPU za pomocą DataParallel
  2. DistributedDataParallel (DDP)
  3. Trenowanie z mieszaną precyzją za pomocą AMP
  4. Wydajne trenowanie za pomocą Hugging Face Accelerate
← Powrót do Learn AI with Python