python memory-management gpu nvidia pytorch

python - ¿Cómo verificar si pytorch está usando la GPU?



memory-management nvidia (8)

Me gustaría saber si pytorch está usando mi GPU. Es posible detectar con nvidia-smi si hay alguna actividad de la GPU durante el proceso, pero quiero algo escrito en un script de python .

¿Hay una manera de hacerlo?


Como no se ha propuesto aquí, estoy agregando un método usando torch.device , ya que esto es bastante útil, también al inicializar los tensores en el device correcto.

# 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'')

Salida:

Using device: cuda Tesla K80 Memory Usage: Allocated: 0.3 GB Cached: 0.6 GB

Como se mencionó anteriormente, utilizando el device es posible:

  • Para mover los tensores al device respectivo:

    torch.rand(10).to(device)

  • Para crear un tensor directamente en el device :

    torch.rand(10, device=device)

Lo que hace que el cambio entre CPU y GPU sea cómodo sin cambiar el código real.

Editar:

Como ha habido algunas preguntas y confusión sobre la memoria en caché y asignada , estoy agregando información adicional al respecto:


Puede entregar directamente un device como se especifica más arriba en la publicación o puede dejarlo Ninguno y usará el current_device() .


Cree un tensor en la GPU de la siguiente manera:

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

No salga, abra otra terminal y verifique si el proceso de Python está usando la GPU usando:

$ nvidia-smi


Desde el punto de vista práctico, solo una digresión menor:

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

Este desarrollador ahora sabe si cuda o cpu.

Y hay una diferencia en cómo manejas el modelo y los tensores cuando te mueves a cuda. Es un poco extraño al principio.

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

Todo esto es complicado y comprenderlo una vez te ayuda a lidiar rápidamente con menos depuración.


Después de comenzar a ejecutar el ciclo de entrenamiento, si desea verlo manualmente desde la terminal si su programa está utilizando los recursos de la GPU y en qué medida, puede usar:

$ watch -n 2 nvidia-smi

Esto actualizará las estadísticas de uso por cada 2 segundos hasta que presione Ctrl + C

Además, puede verificar si su instalación de PyTorch detecta su instalación CUDA correctamente haciendo lo siguiente:

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

True estado True significa que PyTorch está configurado correctamente y está utilizando la GPU, aunque debe mover / colocar los tensores con las declaraciones necesarias en su código.

Si desea hacer esto dentro del código de Python, busque en este módulo:

https://github.com/jonsafari/nvidia-ml-py o en pypi aquí: https://pypi.python.org/pypi/nvidia-ml-py/


En el sitio de la oficina y en la página de inicio, verifique la GPU para PyTorch de la siguiente manera:

import torch torch.cuda.is_available()

Referencia: PyTorch | Comenzar


Esto va a funcionar :

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

Esto me dice que GeForce GTX 950M está utilizando la GPU GeForce GTX 950M PyTorch .


FWIW: Si estás aquí porque tu pytorch siempre da false para torch.cuda.is_available() probablemente porque hayas instalado tu versión de pytorch sin soporte de GPU. (Por ejemplo: codificó en una computadora portátil y luego realizó una prueba en el servidor). La solución es desinstalar e instalar pytorch nuevamente con el comando correcto de la página de descargas de pytorch. Consulte también this problema de pytorch.


Para verificar si hay una GPU disponible:

torch.cuda.is_available()

Si la función anterior devuelve False , no tiene GPU, o los controladores de Nvidia no se han instalado, por lo que el sistema operativo no ve la GPU, o la GPU está oculta por la variable de entorno CUDA_VISIBLE_DEVICES . Cuando el valor de CUDA_VISIBLE_DEVICES es -1, todos sus dispositivos están ocultos. Puede verificar ese valor en el código con esta línea: `os.environ [''CUDA_VISIBLE_DEVICES'']

Si la función anterior devuelve True eso no significa necesariamente que esté utilizando la GPU. En Pytorch puede asignar tensores a dispositivos cuando los crea. Por defecto, los tensores se asignan a la cpu . Para verificar dónde está asignado su tensor, haga lo siguiente:

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

Tenga en cuenta que no puede operar con tensores asignados en diferentes dispositivos. Para ver cómo asignar un tensor a la GPU, consulte aquí: https://pytorch.org/docs/stable/notes/cuda.html