Come risolvere "Errore di runtime: errore CUDA: asserzione lato dispositivo attivata"

Pubblicato: 2025-10-14

Se stai lavorando con modelli di deep learning in PyTorch, è probabile che ti sia imbattuto in un messaggio di errore sconcertante come:

 RuntimeError: CUDA error: device-side assert triggered

Questo errore può essere incredibilmente frustrante, soprattutto quando non sei esattamente sicuro di cosa lo stia causando. A differenza di molti errori di programmazione che forniscono un'utile traccia dello stack che indica il problema, questo può sembrare più come se la tua GPU stesse alzando le sopracciglia e se ne andasse silenziosamente. Ma non preoccuparti: alla fine di questa guida capirai non solo perché ciò accade, ma anche come risolverlo metodicamente.

Cosa significa realmente questo errore?

Questo errore si verifica quando un kernel CUDA in esecuzione sulla GPU riscontra un errore di asserzione. Ciò è solitamente dovuto a input non validi o a comportamenti imprevisti che potresti non rilevare in modalità CPU. Poiché si tratta di un problema a livello di GPU, tende a bloccarsi senza i messaggi di debug dettagliati che siamo abituati a vedere dalle eccezioni Python.

Le cause comuni includono:

  • Errori di indicizzazione (ad esempio, tentativo di utilizzare un indice di classe che non esiste)
  • Forme tensoriali non valide
  • Utilizzo errato della funzione di perdita
  • Dati che infrangono le aspettative (come tensori vuoti)

Fortunatamente, con l'approccio giusto, puoi rintracciare e risolvere questo problema: vediamo come.

Processo passo dopo passo per diagnosticare e risolvere

1.Esegui il tuo modello sulla CPU

Il primo passaggio diagnostico è disabilitare CUDA ed eseguire tutto sulla CPU. Spesso, quando viene eseguito sulla CPU, PyTorch fornisce messaggi di errore più chiari perché le asserzioni lato dispositivo vengono ora lanciate come eccezioni Python con contesto completo.

Per passare alla modalità CPU, modifica il codice come segue:

 device = torch.device("cpu") model.to(device)

Se un'asserzione fallisce, ora dovresti ottenere un'analisi dello stack molto più informativa.

2. Controlla le etichette di destinazione

Una delle cause più frequenti di questo errore sono le etichette di classe errate, soprattutto quando si utilizza nn.CrossEntropyLoss . Questa funzione di perdita prevede che il tensore target includa indici di classe compresi tra 0 e num_classes - 1 . Pertanto, se il tuo modello restituisce 10 classi, gli obiettivi devono essere numeri interi compresi tra 0 e 9.

Errore comune:

 # Target contains 10 instead of 0–9 range target = torch.tensor([10])

Se questi indici sono fuori limite, ti imbatterai in un'asserzione sulla GPU. Per convalidarlo, utilizzare:

 assert target.max().item() < num_classes

Se stai classificando le immagini, assicurati anche che la forma del tuo target sia appropriata. Per CrossEntropyLoss dovrebbe essere di forma [batch_size] , non codificato one-hot!

 # Incorrect (for CrossEntropyLoss) target = torch.tensor([[0, 0, 1], [1, 0, 0]]) # Correct target = torch.tensor([2, 0])

3. Ispezionare il DataLoader per eventuali errori

A volte l'errore proviene dal set di dati o da DataLoader, soprattutto se utilizzato nell'addestramento batch. Se alcune etichette sono danneggiate o incoerenti, potrebbero danneggiare il modello sulla GPU.

Ricontrolla il tuo set di dati in questo modo:

 for i, (x, y) in enumerate(loader): assert y.dtype == torch.long assert y.max().item() < num_classes assert x.shape[0] == y.shape[0]

Ciò è particolarmente utile se il set di dati è costruito da un file CSV o da una logica di elaborazione personalizzata che potrebbe introdurre silenziosamente etichette non valide.

sviluppatore introspettivo, ispezione del codice, laptop, debug

Altre insidie ​​​​comuni

4. Dimensioni dei lotti non corrispondenti

A volte il modello o la funzione di perdita si aspetta che gli input abbiano determinate forme. Le discrepanze possono portare a problemi sottili. Assicurati che le dimensioni del batch negli input e negli obiettivi siano allineate:

 # torchvision models usually expect [N, 3, 224, 224] assert inputs.shape[1:] == (3, 224, 224)

Ciò è particolarmente importante quando si utilizza DataLoader con drop_last=False : l'ultimo batch potrebbe essere più piccolo a seconda delle dimensioni del set di dati. Il tuo modello o operazioni come BatchNorm devono gestirlo correttamente o verificare esplicitamente la presenza di batch più piccoli.

5. Tensori accidentali su diversi dispositivi

Assicurati che sia le funzionalità di input che il modello siano sullo stesso dispositivo. Se invii il tuo modello a CUDA ma lasci i tuoi input sulla CPU, le cose falliranno inaspettatamente, spesso senza errori utili.

Ricontrolla sempre con:

 assert inputs.device == model.device

Suggerimento avanzato: attiva la segnalazione errori completa

Se l'esecuzione su CPU non aiuta, o stai lavorando con una configurazione mista CPU/GPU e continui a non ricevere errori utili, prova a impostare:

 CUDA_LAUNCH_BLOCKING=1 python my_script.py

Questo dice a PyTorch di eseguire il codice GPU in modo sincrono, quindi si bloccherà nel punto esatto in cui si verifica l'errore. Potrebbe rallentare un po' l'esecuzione, ma fornisce un traceback molto più chiaro.

Solo in Python, senza modificare la shell:

 import os os.environ["CUDA_LAUNCH_BLOCKING"] = "1"

Ora il runtime dovrebbe offrire informazioni più specifiche su dove si è verificata l'asserzione CUDA.

Correggi con l'esempio

Diamo un'occhiata a un esempio pratico. Supponiamo che tu stia costruendo un modello per la classificazione delle cifre su MNIST e definisci il livello del modello finale come segue:

 self.fc = nn.Linear(128, 10)

Nel ciclo di formazione, hai:

 criterion = nn.CrossEntropyLoss() output = model(images) # Output shape: [batch_size, 10] loss = criterion(output, labels)

Ma le tue etichette sono come:

 labels = torch.tensor([[0], [1], [2]])

Questa forma non è corretta. CrossEntropyLoss prevede che le etichette siano un vettore 1D di indici di classe:

 labels = torch.tensor([0, 1, 2])

La sola correzione di questa forma potrebbe risolvere il problema.

modello Pytorch, funzione di perdita, errore GPU, correzione

Riepilogo: elenco di controllo per correggere l'errore

Prima di iniziare a strapparti i capelli, segui questa lista di controllo:

  1. Passa alla modalità CPUe riprova: il messaggio di errore potrebbe essere più descrittivo.
  2. Verifica le etichette delle classi:assicurati che rientrino nell'intervallo valido e nel formato corretto.
  3. Ispeziona i dati provenienti da DataLoader: esegui l'iterazione dei batch e verifica la presenza di anomalie.
  4. Garantire forme e dimensioni adeguate del tensore, in particolare per output e target.
  5. Utilizzare CUDA_LAUNCH_BLOCKING=1per ottenere un traceback dettagliato e sincrono da CUDA.

Conclusione

Anche se all'inizio l'errore attivato dall'asserzione lato dispositivopuò sembrare vago e opaco, in definitiva è il modo in cui il tuo modello o i tuoi dati ti sventolano una bandiera rossa. Controllando sistematicamente le etichette, le forme dei dati e utilizzando la modalità CPU e il blocco dell'avvio, puoi quasi sempre isolare il problema.

La prossima volta, invece di reagire con confusione, sarai armato di conoscenze e di un kit di strumenti diagnostici. Buon debugging!