web-dev-qa-db-fra.com

Comment vérifier si pytorch utilise le GPU?

J'aimerais savoir si pytorch utilise mon GPU. Il est possible de détecter avec nvidia-smi s'il y a une activité du GPU pendant le processus, mais je veux quelque chose d'écrit dans un script python.

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

31
vinzee

Cela va marcher:

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'

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

56
vinzee

Une fois que vous avez commencé à exécuter la boucle d’entraînement, si vous voulez manuellement le regarder depuis le terminal, que votre programme utilise les ressources du processeur graphique et dans quelle mesure, vous pouvez utiliser:

$ watch -n 2 nvidia-smi

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


De plus, vous pouvez vérifier si votre installation de PyTorch détecte correctement votre installation de CUDA en procédant comme suit:

In [13]: import  torch

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

True status signifie que PyTorch est configuré correctement et utilise avec le processeur graphique, bien que vous deviez déplacer/placer les tenseurs avec les instructions 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 en pypi ici: https://pypi.python.org/pypi/nvidia-ml-py/

28
kmario23

Comme cela n’a pas été proposé ici, j’ajoute une méthode utilisant torch.device , ce qui est très pratique, également lors de l’initialisation des tenseurs sur le correct 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')

Sortie:

Using device: cuda

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

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

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

    torch.Rand(10).to(device)
    
  • Ou créez un tenseur directement sur le device:

    torch.Rand(10, device=device)
    

Cela facilite la commutation entre le processeur et le processeur graphique sans modifier le code réel.

8
blue-phoenox

Sur le site Web et sur la page de démarrage, recherchez GPU pour PyTorch comme suit: 

import torch
torch.cuda.is_available()

Référence: PyTorch | Get Start

6
TimeSeam

Pour vérifier si un GPU est disponible:

torch.cuda.is_available()

Si la fonction ci-dessus renvoie False, vous n'avez pas de GPU ou les pilotes Nvidia n'ont pas été installés, de sorte que le système d'exploitation ne voit pas le GPU ou que le GPU est masqué par la variable d'environnement CUDA_VISIBLE_DEVICES. Si la valeur est -1, tous vos périphériques 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 renvoie True, cela ne signifie pas nécessairement que vous utilisez le processeur graphique. Dans Pytorch, vous pouvez affecter des tenseurs aux appareils lorsque vous les créez. Par défaut, les tenseurs sont affectés à la variable cpu. Pour vérifier où votre tenseur est affecté, faites:

# 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 utiliser des tenseurs attribués à différents appareils. Pour savoir comment affecter un tenseur au GPU, voir ici: https://pytorch.org/docs/stable/notes/cuda.html

2
Jadiel de Armas

Du point de vue pratique, juste une digression mineure:

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

Cette dev sait maintenant si cuda ou cpu.

Et il y a une différence dans la manière dont vous traitez le modèle et les tenseurs lorsque vous passez au 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


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 à gérer rapidement avec moins de débogage.

2
prosti

FWIW: Si vous êtes ici parce que votre pytorch donne toujours false pour torch.cuda.is_available(), c'est probablement parce que vous avez installé votre version de Pytorch sans prise en charge du processeur graphique. (Par exemple: vous avez codé dans un ordinateur portable puis avez testé sur le serveur). La solution consiste à désinstaller et à réinstaller pytorch à l'aide de la commande appropriée à partir de pytorch téléchargements page. Voir également this pytorch issue.

0
mithunpaul

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
0
litesaber