Estoy tratando de ejecutar Pytorch en una computadora portátil que tengo. Es un modelo más antiguo pero tiene una tarjeta gráfica Nvidia. Me doy cuenta de que probablemente no será suficiente para el aprendizaje automático real, pero estoy tratando de hacerlo para poder aprender el proceso de instalación de CUDA.
He seguido los pasos de la guía de instalación de Ubuntu 18.04 (mi distribución específica es Xubuntu).
Mi tarjeta gráfica es una GeForce 845M, verificada por lspci | grep nvidia :
01:00.0 3D controller: NVIDIA Corporation GM107M [GeForce 845M] (rev a2) 01:00.1 Audio device: NVIDIA Corporation Device 0fbc (rev a1) También tengo instalado gcc 7.5, verificado por gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Y tengo los encabezados correctos instalados, verificados al intentar instalarlos con sudo apt-get install linux-headers-$(uname -r) :
Reading package lists... Done Building dependency tree Reading state information... Done linux-headers-4.15.0-106-generic is already the newest version (4.15.0-106.107).Luego seguí las instrucciones de instalación usando un .deb local para la versión 10.1.
Npw, cuando ejecuto nvidia-smi , obtengo:
+-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.87.00 Driver Version: 418.87.00 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 GeForce 845M On | 00000000:01:00.0 Off | N/A | | N/A 40C P0 N/A / N/A | 88MiB / 2004MiB | 1% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | 0 982 G /usr/lib/xorg/Xorg 87MiB | +-----------------------------------------------------------------------------+ y ejecuto nvcc -V obtengo:
nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2019 NVIDIA Corporation Built on Sun_Jul_28_19:07:16_PDT_2019 Cuda compilation tools, release 10.1, V10.1.243 Luego realicé las instrucciones posteriores a la instalación de la sección 6.1 y, como resultado, echo $PATH se ve así:
/home/isaek/anaconda3/envs/stylegan2_pytorch/bin:/home/isaek/anaconda3/bin:/home/isaek/anaconda3/condabin:/usr/local/cuda-10.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin echo $LD_LIBRARY_PATH se ve así:
/usr/local/cuda-10.1/lib64 y mi archivo /etc/udev/rules.d/40-vm-hotadd.rules tiene este aspecto:
# On Hyper-V and Xen Virtual Machines we want to add memory and cpus as soon as they appear ATTR{[dmi/id]sys_vendor}=="Microsoft Corporation", ATTR{[dmi/id]product_name}=="Virtual Machine", GOTO="vm_hotadd_apply" ATTR{[dmi/id]sys_vendor}=="Xen", GOTO="vm_hotadd_apply" GOTO="vm_hotadd_end" LABEL="vm_hotadd_apply" # Memory hotadd request # CPU hotadd request SUBSYSTEM=="cpu", ACTION=="add", DEVPATH=="/devices/system/cpu/cpu[0-9]*", TEST=="online", ATTR{online}="1" LABEL="vm_hotadd_end" Después de todo esto, incluso compilé y ejecuté las muestras. ./deviceQuery devuelve:
./deviceQuery Starting... CUDA Device Query (Runtime API) version (CUDART static linking) Detected 1 CUDA Capable device(s) Device 0: "GeForce 845M" CUDA Driver Version / Runtime Version 10.1 / 10.1 CUDA Capability Major/Minor version number: 5.0 Total amount of global memory: 2004 MBytes (2101870592 bytes) ( 4) Multiprocessors, (128) CUDA Cores/MP: 512 CUDA Cores GPU Max Clock rate: 863 MHz (0.86 GHz) Memory Clock rate: 1001 Mhz Memory Bus Width: 64-bit L2 Cache Size: 1048576 bytes Maximum Texture Dimension Size (x,y,z) 1D=(65536), 2D=(65536, 65536), 3D=(4096, 4096, 4096) Maximum Layered 1D Texture Size, (num) layers 1D=(16384), 2048 layers Maximum Layered 2D Texture Size, (num) layers 2D=(16384, 16384), 2048 layers Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 49152 bytes Total number of registers available per block: 65536 Warp size: 32 Maximum number of threads per multiprocessor: 2048 Maximum number of threads per block: 1024 Max dimension size of a thread block (x,y,z): (1024, 1024, 64) Max dimension size of a grid size (x,y,z): (2147483647, 65535, 65535) Maximum memory pitch: 2147483647 bytes Texture alignment: 512 bytes Concurrent copy and kernel execution: Yes with 1 copy engine(s) Run time limit on kernels: Yes Integrated GPU sharing Host Memory: No Support host page-locked memory mapping: Yes Alignment requirement for Surfaces: Yes Device has ECC support: Disabled Device supports Unified Addressing (UVA): Yes Device supports Compute Preemption: No Supports Cooperative Kernel Launch: No Supports MultiDevice Co-op Kernel Launch: No Device PCI Domain ID / Bus ID / location ID: 0 / 1 / 0 Compute Mode: < Default (multiple host threads can use ::cudaSetDevice() with device simultaneously) > deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 10.1, CUDA Runtime Version = 10.1, NumDevs = 1 Result = PASS y ./bandwidthTest devuelve:
[CUDA Bandwidth Test] - Starting... Running on... Device 0: GeForce 845M Quick Mode Host to Device Bandwidth, 1 Device(s) PINNED Memory Transfers Transfer Size (Bytes) Bandwidth(GB/s) 32000000 11.7 Device to Host Bandwidth, 1 Device(s) PINNED Memory Transfers Transfer Size (Bytes) Bandwidth(GB/s) 32000000 11.8 Device to Device Bandwidth, 1 Device(s) PINNED Memory Transfers Transfer Size (Bytes) Bandwidth(GB/s) 32000000 14.5 Result = PASS NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.Pero después de todo esto, este fragmento de Python (en un entorno conda con todas las dependencias instaladas):
import torch torch.cuda.is_available() devuelve False
¿Alguien tiene alguna idea sobre cómo resolver esto? Intenté agregar /usr/local/cuda-10.1/bin a etc/environment de esta manera:
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games" PATH=$PATH:/usr/local/cuda-10.1/binY reiniciando la terminal, pero eso no lo solucionó. Realmente no sé qué más probar.
Collecting environment information... PyTorch version: 1.5.0 Is debug build: No CUDA used to build PyTorch: 10.2 OS: Ubuntu 18.04.4 LTS GCC version: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 CMake version: Could not collect Python version: 3.6 Is CUDA available: No CUDA runtime version: 10.1.243 GPU models and configuration: GPU 0: GeForce 845M Nvidia driver version: 418.87.00 cuDNN version: Could not collect Versions of relevant libraries: [pip] numpy==1.18.5 [pip] pytorch-ranger==0.1.1 [pip] stylegan2-pytorch==0.12.0 [pip] torch==1.5.0 [pip] torch-optimizer==0.0.1a12 [pip] torchvision==0.6.0 [pip] vector-quantize-pytorch==0.0.2 [conda] numpy 1.18.5 pypi_0 pypi [conda] pytorch-ranger 0.1.1 pypi_0 pypi [conda] stylegan2-pytorch 0.12.0 pypi_0 pypi [conda] torch 1.5.0 pypi_0 pypi [conda] torch-optimizer 0.0.1a12 pypi_0 pypi [conda] torchvision 0.6.0 pypi_0 pypi [conda] vector-quantize-pytorch 0.0.2 pypi_0 pypiPyTorch no utiliza la biblioteca CUDA del sistema. Cuando instala PyTorch usando los binarios precompilados usando pip o conda , se envía con una copia de la versión especificada de la biblioteca CUDA que se instala localmente. De hecho, ni siquiera necesita instalar CUDA en su sistema para usar PyTorch con soporte CUDA.
Hay dos escenarios que podrían haber causado su problema.
Instaló la versión solo para CPU de PyTorch. En este caso, PyTorch no se compiló con soporte para CUDA, por lo que no era compatible con CUDA.
Instaló la versión CUDA 10.2 de PyTorch. En este caso el problema es que tu tarjeta gráfica actualmente usa los drivers 418.87, los cuales solo soportan hasta CUDA 10.1. Las dos posibles soluciones en este caso serían instalar controladores actualizados (versión >= 440.33 según la Tabla 2 ) o instalar una versión de PyTorch compilada contra CUDA 10.1.
Para determinar el comando apropiado para usar al instalar PyTorch, puede usar el práctico widget en la sección "Instalar PyTorch" en pytorch.org . Simplemente seleccione el sistema operativo apropiado, el administrador de paquetes y la versión de CUDA y luego ejecute el comando recomendado.
En su caso, una solución fue usar
conda install pytorch torchvision cudatoolkit=10.1 -c pytorchque especifica explícitamente a conda que desea instalar la versión de PyTorch compilada contra CUDA 10.1.
Para obtener más información sobre la compatibilidad de PyTorch CUDA con respecto a los controladores y el hardware, consulte esta respuesta .
Editar Después de agregar la salida de collect_env , podemos ver que el problema era que tenía instalada la versión CUDA 10.2 de PyTorch. En base a eso, una solución alternativa habría sido actualizar el controlador de gráficos como se explica en el elemento 2 y la respuesta vinculada.
En mi caso, solo reiniciar mi máquina hizo que la GPU se activara nuevamente. El mensaje inicial que recibí fue que la GPU está siendo utilizada actualmente por otra aplicación. Pero cuando miré a nvidia-smi , no vi nada. Entonces, no hubo cambios en las dependencias, y simplemente comenzó a funcionar nuevamente.
Primero instale NVIDIA CUDA Toolkit proporcionado por Canonical:
sudo apt install -y nvidia-cuda-toolkito siga las instrucciones de los desarrolladores de NVIDIA :
# ENVARS ADDED **ONLY FOR READABILITY** NVIDIA_CUDA_PPA=https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/ NVIDIA_CUDA_PREFERENCES=https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin NVIDIA_CUDA_PUBKEY=https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/7fa2af80.pub # Add NVIDIA Developers 3rd-Party PPA sudo wget ${NVIDIA_CUDA_PREFERENCES} -O /etc/apt/preferences.d/nvidia-cuda sudo apt-key adv --fetch-keys ${NVIDIA_CUDA_PUBKEY} echo "deb ${NVIDIA_CUDA_PPA} /" | sudo tee /etc/apt/sources.list.d/nvidia-cuda.list # Install development tools sudo apt update sudo apt install -y cudaluego reinicie el sistema operativo cargue el kernel con los controladores NVIDIA
Cree un entorno usando su administrador favorito ( conda , venv , etc.)
conda create -n stack-overflow pytorch torchvision conda activate stack-overflow o reinstale pytorch y torchvision en el existente:
conda activate stack-overflow conda install --force-reinstall pytorch torchvisionde lo contrario, es posible que los enlaces NVIDIA CUDA C/C++ no se detecten correctamente.
Finalmente, asegúrese de que CUDA se detecte correctamente:
(stack-overflow)$ python3 -c 'import torch; print(torch.cuda.is_available())' True20.04.x22.04 (versión oficial anterior)