Den ersten Fehler und seinen Kontext bewahren
Dieser Leitfaden beginnt nach einem erfolgreichen Start: PyTorch erkennt das Gerät, dann scheitert Ihre Anwendung an einem Batch oder einem Operator. Wenn keine kleine Berechnung funktioniert, beginnen Sie erneut mit der anfänglichen Diagnose. Andernfalls bewahren Sie den ersten Fehler, die Iterationsnummer und den letzten abgeschlossenen Schritt auf. Eine Folge von Meldungen nach dem ersten Fehler kann dessen Folgen beschreiben und nicht mehrere unabhängige Ursachen.
Notieren Sie die Code-Revision, die Python- und PyTorch-Versionen, das Backend, den numerischen Typ und die Eingabeformen. Bevorzugen Sie für die Daten eine interne Kennung und die Dimensionen statt einer vollständigen Kopie des Inhalts. Suchen Sie, was den fehlerhaften Batch auszeichnet: Länge, fehlende Zielvariable, letzter unvollständiger Batch, Augmentierung oder selten genutzter Zweig. Diese Akte ermöglicht es, den Fall erneut nachzustellen, ohne eine ganze Kampagne neu zu starten.
Den fehlerhaften Start trotz Asynchronität lokalisieren
Unter CUDA werden Operationen in eine Warteschlange gestellt und können nach der Rückkehr der Python-Funktion abgeschlossen werden. Ein Fehler, der während einer Kopie zur CPU oder beim Auslesen eines Skalars gemeldet wird, kann daher von einer vorherigen Berechnung stammen. Die PyTorch-Dokumentation erläutert diese asynchrone Ausführung. Die im Stacktrace angegebene Zeile ist ein zu prüfender Beobachtungspunkt, nicht immer die Ursache.
Für eine kurze Reproduktion auf NVIDIA/CUDA schlagen Sie einen separaten Start mit CUDA_LAUNCH_BLOCKING=1 vor. Diese Option macht die Aufrufe synchron und kann den Fehler näher an seinen Ursprung rücken. Sie dient der Diagnose, nicht der Zeitmessung. Sie können auch vorübergehend Synchronisierungen zwischen großen Schritten einfügen, um das verdächtige Intervall zu verkleinern. Entfernen Sie diese Instrumentierung anschließend wieder: Sie verändert die übliche Ablaufplanung.
Der folgende Befehl ist didaktisch und wurde nicht ausgeführt. Er setzt ein POSIX-Terminal und ein vorhandenes Skript train.py voraus. Die Zuweisung gilt nur für diesen Start; passen Sie die Syntax an Ihre Shell an. Verallgemeinern Sie diese NVIDIA-Variable nicht auf einen ROCm-Stack.
CUDA_LAUNCH_BLOCKING=1 python train.pyEine Fehlerfamilie lesen, ohne zu schnell zu schlussfolgern
Die Meldung grenzt das Suchfeld ein; sie ersetzt keinen reproduzierbaren Fall. Ein Index außerhalb des gültigen Bereichs, ein Tensor auf dem falschen Gerät und eine unmögliche Speicherzuweisung erfordern unterschiedliche Prüfungen. Behalten Sie die Unterscheidung zwischen ungültigen Daten, Operator-Vertrag und binärer Umgebung bei. Wenn Sie gleichzeitig Batch, Genauigkeit und Bibliotheken ändern, geht diese Unterscheidung verloren.
Nach einer auf dem Gerät ausgeführten Assertion versuchen Sie nicht, dasselbe Training im selben Prozess fortzusetzen. NVIDIA gibt an, dass cudaErrorAssert bestehende Speicherzuweisungen ungültig macht und das Beenden und Neustarten des Prozesses erfordert. In einem Notebook bedeutet dies, den Kernel vor der korrigierten Reproduktion neu zu starten. Ein Neustart behebt jedoch weder eine fehlerhafte Zielvariable noch einen ungültigen Index.
Scrollen Sie durch die Tabelle, um alle Spalten zu lesen.| Beobachteter Hinweis | Erste Überprüfung | Zu vermeidende Schlussfolgerung |
|---|---|---|
| device-side assert | Hinweise, Zielvariablen und Bedingungen des Operators | Die GPU ist zwangsläufig defekt |
| Out of memory | Formen, Lebensdauer der Tensoren, Speicher des Prozesses | Jeder CUDA-Fehler ist ein Mangel an VRAM |
| Operator oder Kernel nicht verfügbar | Versionen, Erweiterung, Backend und dtype | Alles auf gut Glück neu installieren |
| Unterschiedliche Geräte | Platzierung des Modells und jeder Eingabe | Eine Kopie hinzufügen, ohne ihren Ursprung zu verstehen |
Ausgearbeitetes Beispiel: eine Klasse 4 in einem Problem mit vier Klassen
Nehmen wir einen didaktischen Klassifikator, dessen Ausgabe vier Spalten hat. Seine Klassen sind von 0 bis 3 indiziert. Eine Annotationsdatei mit dem Wert 4 kann eine Kodierung von 1 bis 4 oder eine unerwartete fünfte Klasse offenbaren. Die Ausgabegröße einfach zu erhöhen, würde eine Einschränkung verschwinden lassen, ohne die Bedeutung der Annotationen zu klären.
Die unten vorgeschlagene Prüfung erfolgt vor der Übertragung der Zielvariablen auf die CPU. Sie wurde nicht ausgeführt. Sie veranschaulicht den Vertrag von CrossEntropyLoss für Klassenindizes vom Typ long, mit explizit gewähltem ignore_index=-100. Sie deckt keine Zielvariablen ab, die aus Wahrscheinlichkeitsverteilungen bestehen. In diesem Szenario muss [0, 2, 4] abgelehnt werden; dieses erwartete Ergebnis ist aus der Regel abgeleitet, nicht als Messung dargestellt.
Korrigieren Sie anschließend das Mapping in der Datenvorbereitung und prüfen Sie dessen Bijektion mit den Klassennamen. Subtrahieren Sie nicht überall 1, solange Sie nicht wissen, ob alle Quellen dieselbe Konvention verwenden. Fügen Sie den fehlerhaften Fall einem kleinen, mit dem Projekt aufbewahrten Prüfsatz hinzu.
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")Das Programm reduzieren, ohne den Auslöser zu entfernen
Spielen Sie zunächst einen einzelnen Eintrag oder einen einzelnen Batch mit denselben Transformationen erneut ab. Entfernen Sie die Remote-Überwachung, das Schreiben von Ergebnissen und alle Zweige, die nichts mit dem Fehler zu tun haben. Behalten Sie den dtype, die Formen und den verdächtigen Operator bei. Wenn der Fehler von einer bestimmten Länge oder Speicheranordnung abhängt, kann ein beliebiges kleines Tensor ihn möglicherweise nicht mehr reproduzieren.
Vergleichen Sie jeweils eine Änderung: optionale Erweiterung deaktiviert, Referenzoperator, übliche Genauigkeit oder dieselbe Operation auf der CPU, sofern sie dort existiert. Ein CPU-Erfolg ist ein Hinweis, keine CUDA-Validierung. Bei einer benutzerdefinierten Funktion halten Sie auch die Annahmen zu Strides, Contiguity und Größen fest. Suchen Sie ein Beispiel, das vor der Korrektur fehlschlägt und danach erfolgreich ist, mit einer Ausgabeprüfung statt nur dem Ausbleiben einer Ausnahme.
Die Korrektheit im ursprünglichen Umfang überprüfen
Eine akzeptable Korrektur muss den minimalen Fall, die benachbarten Fälle und einen repräsentativen Teil des ursprünglichen Ablaufs bestehen. Nehmen Sie insbesondere den letzten Batch, einen kurzen Eintrag, einen langen Eintrag und die Grenzwerte des Mappings erneut auf. Vergewissern Sie sich, dass abgelehnte Elemente identifizierbar sind und die Anzahl der verarbeiteten Einträge der erwarteten entspricht. Das stillschweigende Ignorieren von Ausnahmen kann einen sichtbaren Absturz in ein unvollständiges Ergebnis verwandeln.
Entfernen Sie den Diagnosemodus, starten Sie einen neuen Prozess und bestätigen Sie das Verhalten mit der normalen Konfiguration. Halten Sie die Ursache, die vorgenommene Änderung und die Nicht-Regressions-Prüfung fest. Wenn Sie ein Training unterbrochen hatten, starten Sie von einem konsistenten, vor dem Fehler validierten Checkpoint neu; die bloße Existenz einer während eines Ausfalls geschriebenen Datei garantiert nicht deren Wiederaufnahme.
Wissen, wann eine gezieltere Analyse angefordert werden sollte
Wenn derselbe minimale Fall mit gültigen Eingaben fehlschlägt, bereiten Sie eine präzise Anfrage vor: Operation, Formen, Typen, Backend, Versionen und erste relevante Meldung. Entfernen Sie personenbezogene Identifikatoren und unnötige Pfade. Eine binäre Erweiterung kann ihre eigene Kompatibilitätsmatrix erfordern; der allgemeine PyTorch-Support validiert diese Erweiterung nicht automatisch.
Unter ROCm behält PyTorch die Schnittstelle torch.cuda und die Gerätenamen cuda bei. Prüfen Sie torch.version.hip, um diesen Stack zu identifizieren, bevor Sie ein NVIDIA-Verfahren anwenden. Meldungen, Werkzeuge und Diagnoseoptionen können abweichen. Keine der hier beschriebenen Prüfungen belegt die Kompatibilität vorbereiteter Umgebungen mit einem Kernodeck-Angebot; nutzen Sie diese Kriterien, um Ihren Bedarf zu präzisieren, bevor Sie die GPU auswählen.