Perché la memoria di CUDA è esaurita durante l'esecuzione del modello PyTorch [con memoria GPU sufficiente]?

Aug 17 2020

Sto facendo questa domanda perché sto addestrando con successo una rete di segmentazione sulla mia GTX 2070 su laptop con 8 GB di VRAM e utilizzo esattamente lo stesso codice e esattamente le stesse librerie software installate sul mio PC desktop con una GTX 1080TI e continua a buttare fuori memoria.

Perché succede, considerando che:

  1. Gli stessi Windows 10 + CUDA 10.1 + CUDNN 7.6.5.32 + Nvidia Driver 418.96 (fornito con CUDA 10.1) sono sia su laptop che su PC.

  2. Il fatto che l'allenamento con TensorFlow 2.3 funzioni senza problemi sulla GPU del mio PC, tuttavia non riesce ad allocare memoria per l'allenamento solo con PyTorch.

  3. PyTorch riconosce la GPU (stampa GTX 1080 TI) tramite il comando: print(torch.cuda.get_device_name(0))

  4. PyTorch alloca la memoria durante l'esecuzione di questo comando: torch.rand(20000, 20000).cuda() #allocated 1.5GB of VRAM.

Qual è la soluzione a questo?

Risposte

5 TimbusCalin Aug 17 2020 at 17:27

La maggior parte delle persone (anche nel thread seguente) salta a suggerire che la riduzione di batch_size risolverà questo problema. In effetti, in questo caso non è così. Ad esempio, sarebbe stato illogico per una rete addestrarsi su VRAM da 8 GB e tuttavia non riuscire ad addestrare su VRAM da 11 GB, considerando che non c'erano altre applicazioni che consumavano memoria video sul sistema con VRAM da 11 GB e la stessa configurazione è installata e Usato.

Il motivo per cui questo è accaduto nel mio caso è che, quando si utilizza l' DataLoaderoggetto, ho impostato un valore molto alto (12) per il workersparametro. Diminuire questo valore a 4 nel mio caso ha risolto il problema.

In effetti, sebbene in fondo al thread, la risposta fornita da Yurasyk all'indirizzo https://github.com/pytorch/pytorch/issues/16417#issuecomment-599137646 mi ha indirizzato nella giusta direzione.

Soluzione: diminuire il numero di workersin PyTorch DataLoader. Sebbene non capisca esattamente perché questa soluzione funzioni, presumo che sia correlata ai thread generati dietro le quinte per il recupero dei dati; può accadere che, su alcuni processori, venga visualizzato un tale errore.