Określić jednostkę pracy, którą można rozdzielić
Opisz, co stanowi zaakceptowany wynik: obraz, przetworzony dokument, zestaw symulacji albo końcowy stan trenowania. Następnie zapytaj, czy jednostkę można obliczyć bez czekania na pozostałe. Dwa dokumenty mogą być niezależne podczas przetwarzania, a potem zależeć od wspólnego etapu budowania indeksu. Podział musi opisywać ten drugi etap, zamiast pomijać go w obietnicy równoległości.
Odróżnij niezależność informatyczną od niezależności biznesowej. Wynik może powstać bez technicznej wymiany danych, a mimo to pozostawać bezużyteczny przed zatwierdzeniem całej partii. Nazwij więc jednostkę obliczeń, jednostkę dostarczenia i regułę składania. Ten wspólny słownik zapobiega sytuacji, w której zakupy liczą karty, a zespół aplikacyjny liczy instancje lub fragmenty tego samego modelu.
Wybrać między niezależnymi zadaniami a ścisłą współpracą
W przypadku niezależnych zadań każdy proces otrzymuje własne dane wejściowe i tworzy identyfikowalny wynik. Inna karta może wykonywać inne zadanie bez synchronizacji na każdym etapie. Ten tryb jest interesujący, gdy cel dotyczy ilości ukończonej w danym oknie czasowym. Nie przyspiesza automatycznie pojedynczego zadania, a dodatkowo trzeba zweryfikować rywalizację o dane, pamięć masową lub licencje.
W przypadku pracy kooperacyjnej urządzenia wymieniają dane lub czekają na wynik pośredni. Program musi obsługiwać ten podział. Przewodnik CUDA wyjaśnia, że wykorzystanie wielu GPU wiąże się z kontekstami, dystrybucją danych, uruchomieniami i komunikacją. To właściwości ścieżki programowej i obserwowanego systemu; nazwa karty z katalogu nie dowodzi, że ta ścieżka już istnieje.
| Pytanie | Niezależne zadania | Praca kooperacyjna |
|---|---|---|
| Co otrzymuje karta? | Odreślne, kompletne zadanie | Część lub replikę pracy |
| Co trzeba koordynować? | Przydział danych wejściowych i zbieranie wyników | Wymianę danych, kolejność i synchronizacje |
| Jaką korzyść zweryfikować? | Liczbę zaakceptowanych wyników na okno | Identyczny wynik z dostosowanym czasem lub wydajnością |
| Jaką awarię przewidzieć? | Pojedyncze zadanie lub publikację | Wpływ niedostępnego uczestnika na grupę |
Nie mylić replikacji z podziałem pamięci
Wiele kopii modelu nie oznacza, że jego parametry są rozdzielone między karty. PyTorch DistributedDataParallel synchronizuje gradienty między procesami, które trenują swoje lokalne modele. Tego podejścia nie można więc na podstawie samej nazwy uznać za dowód, że model zbyt duży dla jednej karty zmieści się na kilku. Mechanizm partycjonowania wymaga własnej dokumentacji i własnej walidacji.
Pamięć każdej karty musi pokrywać to, co oprogramowanie rzeczywiście w niej umieszcza: dane, stan modelu, przestrzenie tymczasowe i ewentualne wymiany. Szczyt może się zmieniać wraz z ustawieniami i fazą przetwarzania. Zmierz go dla każdego urządzenia. Suma nominalnych pojemności maskuje nierównowagę, w której jednej karcie brakuje pamięci, podczas gdy inne mają jej nadmiar. Łączna pojemność partii nie wystarcza, by zaakceptować scenariusz.
Przykład fikcyjny: rozdzielić osiem niezależnych konwersji
Fikcyjny zespół „Indeks dzieł” przygotowuje osiem konwersji dokumentów. W swoich założeniach roboczych każda konwersja zajmuje jedną kartę przez dwanaście minut, wraz z ładowaniem i zapisem wyniku. Zadanie mieści się samodzielnie na karcie i żadna wymiana nie jest potrzebna przed końcowym złożeniem. Te czasy służą wyłącznie zbudowaniu rozumowania: nie opisują żadnego wykonania ani wydajności GPU oferowanej przez Capordia.
Z jedną kartą osiem kolejnych zadań to 8 × 12 = 96 minut. Z dwiema kartami i równomiernym podziałem po cztery zadania na każdą część równoległa teoretycznie zajmuje 48 minut. Jeśli końcowy montaż wymaga dziesięciu minut na osobnym stanowisku, pełna ścieżka wynosi odpowiednio 106 lub 58 minut, nie licząc oczekiwania przed startem. Obliczenie to zakłada, że obie karty nie spowalniają wzajemnie swoich zadań ładowania.
| Organizacja | Część równoległa | Montaż | Obliczony czas |
|---|---|---|---|
| Jedna karta, osiem zadań | 96 min | 10 min | 106 min |
| Dwie karty, po cztery zadania każda | 48 min | 10 min | 58 min |
Ujawnienie tego, co może zniweczyć ten teoretyczny zysk
W tym samym przykładzie dokumenty mogą nie być równej wielkości. Przydzielenie czterech najdłuższych jednej karcie sprawia, że druga czeka na końcu. Rozdział w miarę dostępności może poprawić równowagę, ale wymaga niezawodnego mechanizmu przydziału i polityki przyjmowania. Organizację tę omawia przewodnik po kolejce; niniejsze obliczenie nie potwierdza, że jest już wdrożona.
Pamięć masowa również może stać się dominującym wspólnym zasobem. Dwa procesy, które czytają te same dane lub jednocześnie zapisują duże wyniki, niekoniecznie dysponują podwójną przepustowością. Sprawdź także limity równoległości narzędzi i licencji. Jeśli część niepodlegająca paralelizacji rośnie, przelicz cały harmonogram. Czasu zaoszczędzonego na jednym etapie nie można ukrywać kosztem opóźnienia dodanego gdzie indziej.
W przypadku pracy rozproszonej otrzymać rzeczywistą topologię
Zapytaj, które karty są widoczne, jak się komunikują i jakie zasoby hosta dzielą ich procesy. Sprawdź urządzenia dostępne ze używanego środowiska, a nie tylko z konsoli administratora. CUDA precyzuje, że dostęp do pamięci innego GPU zależy między innymi od topologii i możliwości systemu. Obsługa danej funkcji przez model nie dowodzi istnienia oczekiwanego łącza na maszynie.
Zachowaj prosty schemat przepływu danych: wejście, odnośna karta lub proces, wymiany, końcowe zebranie i wyjście. Dla każdej strzałki ustal, czy przechodzi przez pamięć hosta, łącze między GPU czy sieć. Ten obraz służy do wyboru kontroli odbioru. Nie narzuca konkretnej technologii i nie zamienia żądania wielu GPU w obietnicę określonej topologii.
Porównać dwie organizacje bez zmiany oczekiwanego wyniku
Przygotuj mały reprezentatywny korpus i uruchom na swoim autoryzowanym celu organizację referencyjną, a następnie organizację kandydującą. Zachowaj wersje, ustawienia, oczekiwaną jakość i zasady montażu. Porównaj czas do zaakceptowanego wyniku, szczytowe zużycie pamięci każdej karty, błędy i zużycie wspólnych zasobów. Oddziel obserwacje od szacunków; zaproponowane polecenie nie jest tym samym co już uzyskany wynik.
Sprawdź w szczególności, czy liczba zaakceptowanych wyników pozostaje taka sama i czy żadne wejście nie zostało pominięte. W przypadku obliczeń wrażliwych na kolejność operacji wybierz uzasadnioną tolerancję zamiast arbitralnej równości. Organizacja, która kończy szybciej przy innej jakości, odpowiada na inny problem. Zachowaj także przypadek, w którym podział nie jest korzystny: ta granica lepiej wyjaśnia wybór niż ranking kart bez wspólnego obciążenia.
Przełożyć wybór na wymaganą pojemność
Na koniec zapisz liczbę jednoczesnych zadań, potrzebne do każdego karty i warunki niezbędne. Zadanie rozłożone na dwie karty i dwa zadania na jednej karcie to dwie różne organizacje, nawet jeśli całkowita liczba kart jest taka sama. Wybrana konfiguracja musi umożliwiać wymaganą organizację; nie wychodź od nominalnej sumy, by następnie wymyślać dla niej zastosowanie.
Katalog wskazuje partie kart. Partia B200 zawiera dwa GPU po 180 GB każdy; ten skład nie gwarantuje, że oprogramowanie wykorzysta je jako jedną pamięć. Następnym krokiem jest dopasowanie potrzeby do partii, a następnie odbiór faktycznie niezbędnych właściwości. Harmonogram, koszt i decyzja pozostają wstępne, dopóki decydujące warunki nie zostaną zweryfikowane.
Pytania przed decyzją
Czy dwa GPU są zawsze szybsze niż jedno?
Nie. Zysk zależy od części podlegającej zrównolegleniu, wymiany danych i zasobów wspólnych. Dla pojedynczego zadania, którego nie można rozdzielić, druga karta może pozostać niewykorzystana. Porównuj czas do tego samego akceptowanego wyniku, na podstawie jawnie zdefiniowanego protokołu.
Czy partia dwóch kart podwaja pamięć dostępną dla mojego programu?
Nie automatycznie. Każde urządzenie ma własną pamięć, a program musi rozdzielić swój stan lub dane. Replikacja modelu może wręcz powielić dużą część tego stanu. Sprawdź mechanizm programowy i szczytowe zużycie na kartę.
Kiedy zacząć od niezależnych zadań?
Gdy każdą jednostkę można obliczyć osobno, a celem jest ukończenie większej liczby jednostek. Trzeba jednak zweryfikować przypisanie, równoważenie obciążenia i końcowe scalenie, nie zakładając, że pamięć masowa i licencje podążą za tym automatycznie.