GPU do Twoich projektów · płatność krypto bez KYC Jak wynająć
Polski
Otwórz konsolę
Przewodnik praktyczny / KERNODECK

Pojawia się błąd CUDA: którą operację należy sprawdzić?

Zachowaj pierwszy błąd, zidentyfikuj dotyczący go batch i zredukuj aplikację do operacji, która go wywołuje. W CUDA asynchroniczne wykonywanie może zgłosić błąd później niż jego przyczyna. Następnie sprawdź indeksy, kształty, typy i urządzenia, zanim zmodyfikujesz środowisko. Ta metoda dotyczy już uruchomionej aplikacji; nie zastępuje wstępnego sprawdzenia dostępności GPU.

6 min czytania · Przewodnik dla programistów

Zachowaj pierwszy błąd i jego kontekst

Ten przewodnik zaczyna się po udanym uruchomieniu: PyTorch widzi urządzenie, a następnie Twoja aplikacja zgłasza błąd na batchu lub operatorze. Jeśli żadne małe obliczenie nie działa, zacznij od wstępnej diagnostyki. W przeciwnym razie zachowaj pierwszy błąd, numer iteracji i ostatni zakończony krok. Sekwencja komunikatów po pierwszym błędzie może opisywać jego skutki, a nie kilka niezależnych przyczyn.

Zanotuj rewizję kodu, wersje Python i PyTorch, backend, typ numeryczny i kształty wejść. W przypadku danych preferuj wewnętrzny identyfikator i wymiary zamiast pełnej kopii zawartości. Poszukaj tego, co wyróżnia wadliwy batch: długość, brakujący cel, niekompletny ostatni batch, augmentacja lub rzadko używana gałąź. Ten zapis pozwala odtworzyć przypadek bez ponownego uruchamiania całej kampanii.

Zlokalizuj wadliwe uruchomienie mimo asynchroniczności

W CUDA operacje są kolejkowane i mogą zakończyć się po powrocie funkcji Pythona. Błąd zgłoszony podczas kopiowania do CPU lub odczytu skalara może więc pochodzić z wcześniejszego obliczenia. Dokumentacja PyTorch wyjaśnia to asynchroniczne wykonywanie. Linia wskazana przez trace to punkt obserwacyjny do zbadania, nie zawsze przyczyna.

Aby uzyskać krótkie odtworzenie na NVIDIA/CUDA, zaproponuj osobne uruchomienie z CUDA_LAUNCH_BLOCKING=1. Ta opcja czyni wywołania synchronicznymi i może przybliżyć błąd do jego źródła. Służy do diagnostyki, nie do pomiaru czasu. Możesz też tymczasowo umieścić synchronizacje między głównymi etapami, aby zmniejszyć podejrzany przedział. Następnie usuń tę instrumentację: zmienia ona zwykłe szeregowanie.

Poniższe polecenie ma charakter dydaktyczny i nie zostało wykonane. Zakłada terminal POSIX i istniejący skrypt train.py. Przypisanie stosuje się tylko do tego uruchomienia; dostosuj składnię do swojego shella. Nie uogólniaj tej zmiennej NVIDIA na stos ROCm.

Proponowane uruchomienie diagnostyczne, niewykonane
CUDA_LAUNCH_BLOCKING=1 python train.py

Czytanie rodziny błędów bez zbyt pochopnych wniosków

Komunikat zawęża pole poszukiwań; nie zastępuje jednak przypadku odtwarzalnego. Wskaźnik poza zakresem, tensor na niewłaściwym urządzeniu i niemożliwa do wykonania alokacja wymagają różnych sprawdzeń. Zachowaj rozróżnienie między nieprawidłowymi danymi, kontraktem operatora i środowiskiem binarnym. Jednoczesna zmiana batcha, precyzji i bibliotek usuwa to rozróżnienie.

Po asercji wykonanej na urządzeniu nie próbuj kontynuować tego samego treningu w tym samym procesie. NVIDIA wskazuje, że cudaErrorAssert unieważnia istniejące alokacje i wymaga zakończenia, a następnie ponownego uruchomienia procesu. W notebooku oznacza to konieczność zrestartowania jądra przed poprawionym odtworzeniem. Restart nie naprawia jednak ani błędnego celu, ani nieprawidłowego indeksu.

Przewiń tabelę, aby zobaczyć wszystkie kolumny.
Tropy diagnostyczne, bez automatycznego powiązania komunikatu z przyczyną
Zaobserwowany wskaźnikPierwsze sprawdzenieWnioski, których należy unikać
device-side assertWskaźniki, cele i warunki operatoraGPU jest z pewnością uszkodzony
Out of memoryKształty, czas życia tensorów, pamięć procesuKażdy błąd CUDA to brak VRAM
Operator lub kernel niedostępnyWersje, rozszerzenie, backend i dtypeZainstaluj wszystko od nowa na chybił trafił
Różne urządzeniaUmiejscowienie modelu i każdego wejściaDodaj kopię bez zrozumienia jej pochodzenia

Przeanalizowany przykład: klasa 4 w problemie z czterema klasami

Weźmy dydaktyczny klasyfikator, którego wyjście ma cztery kolumny. Jego klasy są indeksowane od 0 do 3. Plik adnotacji zawierający wartość 4 może wskazywać na kodowanie od 1 do 4 lub na nieoczekiwaną piątą klasę. Proste zwiększenie rozmiaru wyjścia usunęłoby ograniczenie, nie rozwiązując znaczenia adnotacji.

Proponowana poniżej kontrola jest stosowana przed przeniesieniem celów na CPU. Nie została uruchomiona. Ilustruje kontrakt CrossEntropyLoss dla indeksów klas typu long, z jawnie wybranym ignore_index=-100. Nie obejmuje celów będących rozkładami prawdopodobieństwa. W tym scenariuszu [0, 2, 4] powinno zostać odrzucone; ten oczekiwany wynik wynika z reguły, a nie jest przedstawiany jako pomiar.

Następnie popraw mapowanie w przygotowaniu danych i sprawdź jego bijekcję z nazwami klas. Nie odejmuj 1 wszędzie, dopóki nie wiesz, czy wszystkie źródła używają tej samej konwencji. Dodaj błędny przypadek do małego zbioru weryfikacyjnego przechowywanego razem z projektem.

Edukacyjna asekuracja CPU dla indeksów klas
import torch

classes = 4
ignore_index = -100
target = torch.tensor([0, 2, 4], dtype=torch.long)
if target.ndim != 1 or target.dtype != torch.long:
    raise ValueError("Cibles : vecteur d’indices attendu")
valid = target[target != ignore_index]
if valid.numel() == 0:
    raise ValueError("Aucune cible exploitable dans ce batch")
if bool(((valid < 0) | (valid >= classes)).any()):
    raise ValueError("Indice de classe hors domaine")

Zredukuj program bez usuwania wyzwalacza

Najpierw odtwórz pojedyncze wejście lub pojedynczy batch z tymi samymi transformacjami. Usuń zdalne śledzenie, zapisywanie wyników i gałęzie niezwiązane z awarią. Zachowaj dtype, kształty i podejrzany operator. Jeśli błąd zależy od konkretnej długości lub układu pamięci, dowolny mały tensor może go już nie odtworzyć.

Porównuj jedną zmianę naraz: wyłączone rozszerzenie opcjonalne, operator referencyjny, zwykła precyzja lub ta sama operacja na CPU, jeśli tam istnieje. Sukces na CPU to wskazówka, nie walidacja CUDA. W przypadku funkcji niestandardowej zapisz także założenia dotyczące strides, ciągłości i rozmiarów. Szukaj przykładu, który zawodzi przed poprawką i działa po niej, z weryfikacją wyniku, a nie tylko brakiem wyjątku.

Sprawdź poprawność w początkowym zakresie

Akceptowalna poprawka musi przejść przypadek minimalny, przypadki sąsiednie i reprezentatywną część pierwotnego przebiegu. Uwzględnij zwłaszcza ostatni batch, krótkie wejście, długie wejście oraz wartości graniczne mapowania. Sprawdź, czy odrzucone elementy są identyfikowalne i czy liczba przetworzonych wejść pozostaje zgodna z oczekiwaną. Ciche ignorowanie wyjątków może zamienić widoczny crash w niekompletny wynik.

Wyłącz tryb diagnostyczny, uruchom nowy proces i potwierdź zachowanie przy normalnej konfiguracji. Zachowaj przyczynę, zastosowaną zmianę i kontrolę braku regresji. Jeśli przerwałeś trening, wznów z spójnego checkpointu zwalidowanego przed błędem; obecność pliku zapisanego podczas awarii nie gwarantuje możliwości jego wznowienia.

Wiedz, kiedy poprosić o bardziej ukierunkowaną analizę

Jeśli ten sam przypadek minimalny zawodzi przy prawidłowych danych wejściowych, przygotuj precyzyjne zgłoszenie: operacja, kształty, typy, backend, wersje i pierwszy istotny komunikat. Usuń dane osobowe i zbędne ścieżki. Rozszerzenie binarne może wymagać własnej macierzy zgodności; ogólne wsparcie PyTorch nie waliduje automatycznie tego rozszerzenia.

Na ROCm PyTorch zachowuje interfejs torch.cuda i nazwy urządzeń cuda. Sprawdź torch.version.hip, aby zidentyfikować ten stos przed zastosowaniem procedury NVIDIA. Komunikaty, narzędzia i opcje diagnostyczne mogą się różnić. Żadna z opisanych tu kontroli nie dowodzi zgodności przygotowanych środowisk z ofertą Kernodeck; użyj tych kryteriów, aby doprecyzować swoje potrzeby przed wyborem GPU.

Twoje pytania

Czy CUDA_LAUNCH_BLOCKING=1 naprawia błąd CUDA?

Nie. Powoduje synchroniczne wywołania CUDA, co pomaga zlokalizować błędną operację. Użyj go na krótkim odtworzeniu, następnie napraw przyczynę i usuń go przed pomiarem normalnej wydajności.

Czy mogę kontynuować notebook po device-side assert?

Zrestartuj jądro przed ponownym uruchomieniem poprawionego przypadku. Asercja po stronie urządzenia może pozostawić kontekst bezużyteczny i alokacje nieważne. Restart przywraca kontekst, ale nie naprawia błędnych indeksów ani danych.

Jeśli to samo obliczenie działa na CPU, czy GPU jest uszkodzone?

Nie. Ten wynik rozróżnia dwie ścieżki wykonania. Różnicę może wyjaśniać dtype, rozszerzenie, jądro lub ograniczenie danych. Odtwórz minimalną operację na danym stosie GPU, zanim wyciągniesz wnioski.

Czy procedura NVIDIA jest identyczna na ROCm?

Nie do końca. PyTorch dla ROCm również używa torch.cuda, ale narzędzia i niektóre zmienne diagnostyczne się różnią. Zidentyfikuj HIP za pomocą torch.version.hip i zapoznaj się z dokumentacją odpowiadającą rzeczywistemu backendowi.