Pourquoi est-ce que la mémoire de CUDA est insuffisante lors de l'exécution du modèle PyTorch [avec suffisamment de mémoire GPU]?

Aug 17 2020

Je pose cette question parce que j'entraîne avec succès un réseau de segmentation sur ma GTX 2070 sur un ordinateur portable avec 8 Go de VRAM et j'utilise exactement le même code et exactement les mêmes bibliothèques logicielles installées sur mon PC de bureau avec une GTX 1080TI et cela jette toujours hors de Mémoire.

Pourquoi cela se produit-il, considérant que:

  1. Les mêmes Windows 10 + CUDA 10.1 + CUDNN 7.6.5.32 + Nvidia Driver 418.96 (livré avec CUDA 10.1) sont à la fois sur ordinateur portable et sur PC.

  2. Le fait que l'entraînement avec TensorFlow 2.3 fonctionne correctement sur le GPU de mon PC, mais il échoue à allouer de la mémoire pour l'entraînement uniquement avec PyTorch.

  3. PyTorch reconnaît le GPU (imprime GTX 1080 TI) via la commande: print(torch.cuda.get_device_name(0))

  4. PyTorch alloue de la mémoire lors de l'exécution de cette commande: torch.rand(20000, 20000).cuda() #allocated 1.5GB of VRAM.

Quelle est la solution pour ceci?

Réponses

5 TimbusCalin Aug 17 2020 at 17:27

La plupart des gens (même dans le fil ci-dessous) sautent pour suggérer que la diminution de batch_size résoudra ce problème. En fait, ce n'est pas le cas dans ce cas. Par exemple, il aurait été illogique pour un réseau de s'entraîner sur 8 Go de VRAM et de ne pas réussir à s'entraîner sur 11 Go de VRAM, étant donné qu'il n'y avait pas d'autres applications consommant de la mémoire vidéo sur le système avec 11 Go de VRAM et que la même configuration est installée et utilisé.

La raison pour laquelle cela s'est produit dans mon cas est que, lors de l'utilisation de l' DataLoaderobjet, j'ai défini une valeur très élevée (12) pour le workersparamètre. Diminuer cette valeur à 4 dans mon cas a résolu le problème.

En fait, bien qu'au bas du fil, la réponse fournie par Yurasyk à https://github.com/pytorch/pytorch/issues/16417#issuecomment-599137646 m'a pointé dans la bonne direction.

Solution: Diminuez le nombre de workersdans le PyTorch DataLoader. Bien que je ne comprenne pas exactement pourquoi cette solution fonctionne, je suppose qu'elle est liée aux threads générés dans les coulisses pour la récupération de données; il se peut qu'une telle erreur apparaisse sur certains processeurs.