DEV Community

Raül Martínez i Peris
Raül Martínez i Peris

Posted on • Edited on

NVIDIA GPU & CUDA

Tengo instalada la distro https://neon.kde.org/ (iso: neon-user-20231221-0716.iso), y una tarea pendiente por falta de tiempo siempre ha sido instalar CUDA en mi Linux.


Documentación

Para instalar los drivers nativos de Nvidia hemos seguido los pasos indicados en su web: NVIDIA. Una vez selecciones el driver, podrás descargarlo y también leer la documentación.

Para instalar los drivers nativos de Cuda también hemos seguido los pasos de Nvidia: CUDA-DOC, CUDA-DRIVERS

Aunque Cuda también instala los drivers, yo prefiero realizar esta acción con anterioridad; evitando así que algún error proveniente de la instalación de los drivers me confunda con errores de la instalación de Cuda.


Índice


-^-

Instalación

Hemos hecho una incursión en tres formas diferentes de realizar la instalación, así podemos ver cuál es la mejor opción para nuestra distro.

La primera opción que tomamos fue instalarlo directamente de los repositorios de la distro, la segunda fue descargando los instaladores de Nvidia.

Pero, vayamos por partes.

-^-

Preparación (apto para ambos métodos de instalación)

Lo primero que hice fue instalarme la utilidad nvtop para poder ver gráficamente la información en tiempo real del funcionamiento de la GPU. Mi equipo tiene como gráfica principal una gráfica Intel de 300Mhz y con N/A (vamos, ná de ná) de memoria dedicada; además, posee una segunda gráfica NVIDIA GeForce 940MX (GPU) con 2Gb de RAM dedicada. Como punto final indicaré que es un portátil, por lo que las gráficas siempre van un poco más "capadas" que las normales.

Instalar nvtop:

sudo snap install nvtop
Enter fullscreen mode Exit fullscreen mode

Después, antes de continuar verifiqué el estado de la GPU, para ello consulté si realmente tenía una Nvidia por algún lado:

lspci | grep -i nvidia
Enter fullscreen mode Exit fullscreen mode

Después comprobé si encontraba la gráfica (parece obvio pero en algunas de las pruebas desapareció):

sudo lshw -c display
Enter fullscreen mode Exit fullscreen mode

Y por último comprobé si tenía Cuda instalado (pero no, al principio no estaba instalado):

nvidia-smi
Enter fullscreen mode Exit fullscreen mode

Una vez revisada la información y tras haber leído la documentación, lo primero que había que abordar era hacer desaparecer el driver nouveau para evitarnos problemas:

sudo apt purge xserver-xorg-video-nouveau
Enter fullscreen mode Exit fullscreen mode

Después lo pusimos en la blacklist y la desactivamos, para ello editamos el fichero /etc/modprobe.d/blacklist.conf y añadimos las siguientes líneas:

blacklist nouveau
options nouveau modeset=0
Enter fullscreen mode Exit fullscreen mode

Y para hacerlo efectivo:

sudo update-initramfs -u
Enter fullscreen mode Exit fullscreen mode

La preparación siempre hay que hacerla después de cada nueva instalación, dando por supuesto que limpiamos las instalaciones anteriores.

Reiniciamos el ordenador.

(5/3/2024) ACTUALIZACION:
Una vez reiniciado, cambie a un terminal sin interfaz gráfica utilizando la combinación de teclas CTRL+ALT+F2, seguidamente desactive la interfaz gráfica escribiendo sudo telinit 3

-^-

Método 1: Instalar desde los repositorios de Neon

Lo primero que hice fue decidir qué driver quería utilizar, opté por la versión 535 (el último disponible):

sudo apt install nvidia-driver-535
Enter fullscreen mode Exit fullscreen mode

Posteriormente instalé el applet de la barra de tareas, Cuda y varios paquetes necesarios:

sudo apt install plasma-optimus primus-vk-nvidia nvidia-cuda-toolkit-gcc cuda-drivers-fabricmanager-535 primus-nvidia
Enter fullscreen mode Exit fullscreen mode

El paso siguiente fue reiniciar el sistema para que se activaran los nuevos drivers.

Una vez inicializado, tuve que "obligar" a que se pusiera a trabajar el applet (a veces tardaba 30 segundos, otras veces no aparentaba arrancar).

Para "obligar" a leer la Nvidia puedes ejecutar un sudo modprobe nvidia_modeset, con ello la activas.

A continuación seleccioné el icono de Plasma-optimus para lanzar el "Switch to Nvidia GPU" (tras aceptar el mensaje el sistema se reinicia).

Incluso después de configurar todo correctamente había veces que se quedaba medio 'lela' y tenía que cambiar a la integrada de Intel y después volver a la GPU dedicada.

Todavía no hemos terminado, falta la configuración, que está después de explicar el otro método de instalación.

-^-

Método 2: Utilizar los instaladores de Nvidia

Después de reinstalar la iso para probar desde cero, y además preparar el sistema como ya hemos indicado, pasamos a realizar la instalación.

Primero descargamos la versión, en este caso hemos optado por la última: la 545. Como indiqué arriba, descargada de NVIDIA. Es curioso que nvidia tiene dos páginas para descargar, la otra te propone la versión 535. Curioso.

Una vez descargada, y tras documentarnos; vemos que necesitamos tener instalado pkg-config:

sudo apt install pkg-config
Enter fullscreen mode Exit fullscreen mode

Necesitamos este paquete e indicarle también al instalador la ruta.

Una vez terminado, procedemos a ejecutar el instalador indicandole la ruta del glvnd-egl-config-path:

sh NVIDIA-Linux-x86_64-545.29.06.run --silent --glvnd-egl-config-path=/usr/lib/x86_64-linux-gnu/
Enter fullscreen mode Exit fullscreen mode

Una vez terminada la instalación, comprobamos que está correcta:

sh NVIDIA-Linux-x86_64-545.29.06.run --sanity
Enter fullscreen mode Exit fullscreen mode

Y verificamos las versiones:

sh NVIDIA-Linux-x86_64-545.29.06.run --driver-info
Enter fullscreen mode Exit fullscreen mode

El siguiente paso es instalar Cuda, para ello descargamos el instalador:

wget https://developer.download.nvidia.com/compute/cuda/12.3.2/local_installers/cuda_12.3.2_545.23.08_linux.run
Enter fullscreen mode Exit fullscreen mode

Cuatro insignificantes gigas (más que mi distro).

Atendiendo a la documentación, procedemos a preparar el sistema instalando los headers de mi kernel y borrando la key desfasada:

sudo apt-get install linux-headers-$(uname -r)
sudo apt-key del 7fa2af80
Enter fullscreen mode Exit fullscreen mode

Ahora a instalar Cuda:

sudo sh cuda_12.3.2_545.23.08_linux.run
Enter fullscreen mode Exit fullscreen mode

Como anteriormente hemos instalado los drivers de Nvidia, ahora nos toca desmarcarlos del instalador, ya que de lo contrario tendremos un error y no podremos continuar; no marco nada más, ya que no es pertinente para mi arquitectura. Evidentemente, hago caso omiso al mensaje que se presenta advirtiendo que no se ha pedido instalar el driver.

El siguiente paso es terminar de configurar las rutas de la instalación.

Añadimos a $HOME/.bashrc las siguientes rutas:

export PATH=/usr/local/cuda-12.3/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
Enter fullscreen mode Exit fullscreen mode

y releer las preferencias para activarlas:

source ~/.bashrc
Enter fullscreen mode Exit fullscreen mode

Ahora añadimos persistence-daemon para que arranque al inicio del sistema. Añadimos al archivo /etc/profile.d/99-nvidia-config.sh

/usr/bin/nvidia-persistenced --verbose
Enter fullscreen mode Exit fullscreen mode

Por último, instalamos el applet para poder activar la GPU:

sudo apt install plasma-optimus
Enter fullscreen mode Exit fullscreen mode

-^-

Configuración (apto para ambos métodos de instalación)

Para los dos métodos deberemos terminar con la configuración de la GPU para que sea convenientemente reconocida.

-^-

Configurar Cuda

Configuramos Cuda añadiendo al archivo /etc/profile.d/99-cuda-config.sh las siguientes líneas:

export CUDA_HOME=/usr/local/cuda
export CUDA_PATH=$CUDA_HOME/lib
export CUDA_DEVICE_ORDER="PCI_BUS_ID"
Enter fullscreen mode Exit fullscreen mode

Además, debemos indicar cuál es la posición de la GPU, en mi caso es la "1". Puedes comprobarlo fácilmente con nvtop, viendo si la Nvidia es el Device 0, 1, 2, etc.:

export CUDA_VISIBLE_DEVICES=1
Enter fullscreen mode Exit fullscreen mode

En esta variable podemos indicar tantas GPU como estén disponibles para Cuda.

Y si queremos que Cuda utilice la memoria Swap, entonces tendremos que agregar lo siguiente:

export CUDA_DEVICE_ALLOW_GROWTH=1
Enter fullscreen mode Exit fullscreen mode

Hago notar que Torch necesita al menos 12Gb de RAM, si la GPU no los tiene disponibles no funcionará, de ahí la importancia de poder acceder a memoria externa a la GPU. Ni qué decir que pretender trabajar con la memoria Swap es una burrada.

-^-

Configurar NVIDIA

Revisamos el archivo /etc/modprobe.d/nvidia-graphics-drivers-kms.conf y revisamos si existe lo siguiente:

options nvidia-drm modeset=1
Enter fullscreen mode Exit fullscreen mode

Y si queremos que NVIDIA utilice la memoria Swap, entonces tendremos que agregar lo siguiente:

options nvidia_uvm allow_sw_pages=1
Enter fullscreen mode Exit fullscreen mode

-^-

Terminar la instalación

Ya es momento de reiniciar por última vez. En la documentación de Cuda aconsejan que te bajes un repo de ejemplo y que compruebes que funciona.

A mi, el método de instalación que más estabilidad me ha dado es instalar descargando los drivers de la web de Nvidia.


Espero te haya servido de ayuda.
:)

Top comments (0)