Comment vérifier si pytorch utilise le GPU?

160

Je voudrais savoir si j'utilise pytorchmon GPU. Il est possible de détecter avec nvidia-smis'il y a une activité du GPU pendant le processus, mais je veux quelque chose d'écrit dans un pythonscript.

Y a-t-il un moyen de le faire?

vinzee
la source

Réponses:

259

Cela va fonctionner:

In [1]: import torch

In [2]: torch.cuda.current_device()
Out[2]: 0

In [3]: torch.cuda.device(0)
Out[3]: <torch.cuda.device at 0x7efce0b03be0>

In [4]: torch.cuda.device_count()
Out[4]: 1

In [5]: torch.cuda.get_device_name(0)
Out[5]: 'GeForce GTX 950M'

In [6]: torch.cuda.is_available()
Out[6]: True

Cela me dit que le GPU GeForce GTX 950Mest utilisé par PyTorch.

vinzee
la source
10
Je pense que cela montre simplement que ces périphériques sont disponibles sur la machine, mais je ne sais pas si vous pouvez obtenir la quantité de mémoire utilisée par chaque GPU ou plus ..
kmario23
4
courir a torch.cuda.current_device()été utile pour moi. Il a montré que mon GPU est malheureusement trop vieux: "On a trouvé le GPU0 GeForce GTX 760 qui est de capacité cuda 3.0. PyTorch ne prend plus en charge ce GPU car il est trop ancien."
JohnnyFun
3
torch.cuda.is_available()
mrgloom
@ kmario23 Merci de l'avoir signalé. Existe-t-il un appel de fonction qui nous donne cette information (combien de mémoire est utilisée par chaque GPU)? :)
Nathan
1
@frank Oui, simplement cette commande: $ watch -n 2 nvidia-smifait le travail. Pour plus de détails, veuillez consulter ma réponse ci-dessous .
kmario23
75

Comme cela n'a pas été proposé ici, j'ajoute une méthode utilisant torch.device, car c'est assez pratique, également lors de l'initialisation des tenseurs sur le bon device.

# setting device on GPU if available, else CPU
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print('Using device:', device)
print()

#Additional Info when using cuda
if device.type == 'cuda':
    print(torch.cuda.get_device_name(0))
    print('Memory Usage:')
    print('Allocated:', round(torch.cuda.memory_allocated(0)/1024**3,1), 'GB')
    print('Cached:   ', round(torch.cuda.memory_cached(0)/1024**3,1), 'GB')

Production:

Using device: cuda

Tesla K80
Memory Usage:
Allocated: 0.3 GB
Cached:    0.6 GB

Comme mentionné ci-dessus, en utilisant deviceil est possible de :

  • Pour déplacer les tenseurs vers les respectifs device:

    torch.rand(10).to(device)
  • Pour créer un tenseur directement sur le device:

    torch.rand(10, device=device)

Ce qui rend la commutation entre CPU et GPU confortable sans changer le code réel.


Éditer:

Comme il y a eu des questions et de la confusion sur la mémoire mise en cache et allouée, j'ajoute des informations supplémentaires à ce sujet:


Vous pouvez soit remettre directement un devicecomme spécifié ci-dessus dans le message, soit le laisser Aucun et il utilisera le current_device().

MBT
la source
J'ai essayé votre code, il reconnaît la carte graphique mais l'allocation et la mise en cache sont toutes les deux de 0 Go. Est-ce normal ou dois-je les configurer?
KubiK888
@ KubiK888 Si vous n'avez fait aucun calcul avant, c'est parfaitement normal. Il est également assez improbable que vous puissiez détecter le modèle GPU dans PyTorch sans y accéder. Essayez de faire des calculs sur GPU et vous devriez voir que les valeurs changent.
MBT
Je crée un script .py basé sur ce tutoriel - analyticsvidhya.com/blog/2018/02/pytorch-tutorial . Copiez / collez en particulier la section commençant par ## neural network in pytorch, puis j'ajoute votre code à la fin. Il montre toujours Utilisation de l'appareil: cuda; et 0 Go pour Allocated et Cached. for i in range(epoch):
J'ai
1
@ KubiK888 Vous devez être cohérent, vous ne pouvez pas effectuer d'opérations sur plusieurs appareils. Toute opération comme celle- my_tensor_on_gpu * my_tensor_on_cpuci échouera.
MBT
2
Votre réponse est excellente, mais pour la première ligne d'attribution de périphérique, je tiens à souligner que ce n'est pas parce qu'il existe un périphérique cuda disponible que nous pouvons l'utiliser. Par exemple, j'ai ceci dans mon vieil ordinateur fidèle: Found GPU0 GeForce GT 750M which is of cuda capability 3.0. PyTorch no longer supports this GPU because it is too old. The minimum cuda capability that we support is 3.5.
hekimgil
44

Une fois que vous avez commencé à exécuter la boucle d'entraînement, si vous souhaitez la regarder manuellement à partir du terminal, si votre programme utilise les ressources GPU et dans quelle mesure, vous pouvez simplement utiliser watchcomme dans:

$ watch -n 2 nvidia-smi

Cela mettra continuellement à jour les statistiques d'utilisation toutes les 2 secondes jusqu'à ce que vous appuyiez sur ctrl+c


Si vous avez besoin de plus de contrôle sur plus de statistiques GPU dont vous pourriez avoir besoin, vous pouvez utiliser une version plus sophistiquée de nvidia-smiavec--query-gpu=... . Voici une illustration simple de ceci:

$ watch -n 3 nvidia-smi --query-gpu=index,gpu_name,memory.total,memory.used,memory.free,temperature.gpu,pstate,utilization.gpu,utilization.memory --format=csv

qui produirait les statistiques quelque chose comme:

entrez la description de l'image ici

Remarque : il ne doit pas y avoir d'espace entre les noms de requête séparés par des virgules dans --query-gpu=.... Sinon, ces valeurs seront ignorées et aucune statistique n'est renvoyée.


En outre, vous pouvez vérifier si votre installation de PyTorch détecte correctement votre installation CUDA en faisant:

In [13]: import  torch

In [14]: torch.cuda.is_available()
Out[14]: True

Truedes moyens d'état qui PyTorch est correctement configuré et est en utilisant le GPU bien que vous devez déplacer / placer les tenseurs avec les déclarations nécessaires dans votre code.


Si vous voulez faire cela dans le code Python, regardez dans ce module:

https://github.com/jonsafari/nvidia-ml-py ou dans pypi ici: https://pypi.python.org/pypi/nvidia-ml-py/

kmario23
la source
2
N'oubliez pas que PyTorch utilise un allocateur de mémoire GPU mis en cache. Vous pourriez voir un GPU-Utill faible pour nividia-smi même s'il est entièrement utilisé.
Jakub Bielan
1
@JakubBielan merci! pourriez-vous s'il vous plaît fournir une référence pour plus de lecture à ce sujet?
kmario23
1
C'est watchutile
javadba
18

Sur le site du bureau et la page de démarrage, vérifiez le GPU pour PyTorch comme ci-dessous:

import torch
torch.cuda.is_available()

Référence: PyTorch | Commencer

TimeSeam
la source
15

D'un point de vue pratique, une petite digression:

import torch
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

Ce dev sait maintenant si cuda ou cpu.

Et il y a une différence dans la façon dont vous gérez le modèle et les tenseurs lorsque vous passez à cuda. C'est un peu étrange au début.

import torch
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
t1 = torch.randn(1,2)
t2 = torch.randn(1,2).to(dev)
print(t1)  # tensor([[-0.2678,  1.9252]])
print(t2)  # tensor([[ 0.5117, -3.6247]], device='cuda:0')
t1.to(dev) 
print(t1)  # tensor([[-0.2678,  1.9252]]) 
print(t1.is_cuda) # False
t1=t1.to(dev)
print(t1)  # tensor([[-0.2678,  1.9252]], device='cuda:0') 
print(t1.is_cuda) # True

class M(nn.Module):
def __init__(self):        
    super().__init__()        
    self.l1 = nn.Linear(1,2)

def forward(self, x):                      
    x = self.l1(x)
    return x
model = M()   # not on cuda
model.to(dev) # is on cuda (all parameters)
print(next(model.parameters()).is_cuda) #True

Tout cela est délicat et le comprendre une fois, vous aide à traiter rapidement avec moins de débogage.

prosti
la source
1
C'est quoi M()? Où est Mdéfini?
Sycorax
1
Mis à jour avec une classe M définie comme une sous-classe de nn.Module. Merci pour la capture.
prosti
9

Pour vérifier si un GPU est disponible:

torch.cuda.is_available()

Si la fonction ci-dessus renvoie False,

  1. soit vous n'avez pas de GPU,
  2. ou les pilotes Nvidia n'ont pas été installés donc le système d'exploitation ne voit pas le GPU,
  3. ou le GPU est masqué par la variable d'environnement CUDA_VISIBLE_DEVICES. Lorsque la valeur de CUDA_VISIBLE_DEVICESest -1, tous vos appareils sont masqués. Vous pouvez vérifier cette valeur dans le code avec cette ligne:os.environ['CUDA_VISIBLE_DEVICES']

Si la fonction ci-dessus revient, Truecela ne signifie pas nécessairement que vous utilisez le GPU. Dans Pytorch, vous pouvez attribuer des tenseurs aux appareils lorsque vous les créez. Par défaut, les tenseurs sont alloués au cpu. Pour vérifier où votre tenseur est alloué, procédez comme suit:

# assuming that 'a' is a tensor created somewhere else
a.device  # returns the device where the tensor is allocated

Notez que vous ne pouvez pas opérer sur des tenseurs alloués dans différents appareils. Pour voir comment allouer un tenseur au GPU, voir ici: https://pytorch.org/docs/stable/notes/cuda.html

Jadiel de Armas
la source
5

Presque toutes les réponses ici font référence torch.cuda.is_available(). Cependant, ce n'est qu'une partie de la pièce. Il vous indique si le GPU (en fait CUDA) est disponible, pas s'il est réellement utilisé. Dans une configuration typique, vous définiriez votre appareil avec quelque chose comme ceci:

device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

mais dans les environnements plus larges (par exemple la recherche), il est également courant de donner plus d'options à l'utilisateur, donc en fonction des entrées, ils peuvent désactiver CUDA, spécifier les ID CUDA, etc. Dans ce cas, le fait que le GPU soit utilisé ou non ne dépend pas uniquement de sa disponibilité ou non. Une fois que l'appareil a été défini sur un appareil torche, vous pouvez obtenir sa typepropriété pour vérifier s'il s'agit de CUDA ou non.

if device.type == 'cuda':
    # do something
Bram Vanroy
la source
Bons conseils pour les chercheurs.
prosti
3

Simplement à partir de l'invite de commande ou de l'environnement Linux, exécutez la commande suivante.

python -c 'import torch; print(torch.cuda.is_available())'

Ce qui précède devrait imprimer True

python -c 'import torch; print(torch.rand(2,3).cuda())'

Celui-ci devrait imprimer ce qui suit:

tensor([[0.7997, 0.6170, 0.7042], [0.4174, 0.1494, 0.0516]], device='cuda:0')
DSBLR
la source
2

Si vous êtes ici parce que votre pytorch donne toujours Falsepour torch.cuda.is_available()c'est probablement parce que vous avez installé votre version pytorch sans support GPU. (Par exemple: vous avez codé dans un ordinateur portable puis testez sur le serveur).

La solution est de désinstaller et de réinstaller pytorch avec la bonne commande depuis la page de téléchargement de pytorch . Reportez-vous également à ce numéro de pytorch.

mithunpaul
la source
1
Même si ce que vous avez écrit est lié à la question. La question est: "Comment vérifier si pytorch utilise le GPU?" et non "Que puis-je faire si PyTorch ne détecte pas mon GPU?" Je dirais donc que cette réponse n'appartient pas vraiment à cette question. Mais vous pouvez trouver une autre question sur ce problème spécifique où vous pouvez partager vos connaissances. Sinon, vous pouvez même écrire une question et y répondre vous-même pour aider les autres avec le même problème!
MBT
-4

Créez un tenseur sur le GPU comme suit:

$ python
>>> import torch
>>> print(torch.rand(3,3).cuda()) 

Ne quittez pas, ouvrez un autre terminal et vérifiez si le processus python utilise le GPU en utilisant:

$ nvidia-smi
litesaber
la source
2
J'ai spécifiquement demandé une solution qui n'implique pas nvidia-smide la ligne de commande
vinzee
Eh bien, techniquement, vous pouvez toujours analyser la sortie de tous les outils de ligne de commande, y compris nvidia-smi.
Pastafarianist