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?
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
.
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/
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.
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
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
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.
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.
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