Instalacija NVIDIA drajvera i CUDA toolkit-a na Linux serveru

Bez ispravnog drajvera nijedan alat iz ovog serijala neće videti grafičku karticu. Neće prijaviti grešku — samo će tiho preći na procesor i raditi deset puta sporije, o čemu govori prethodni tekst.

Postupak je kratak kada se zna redosled, i mučan kada se ne zna. Ovaj tekst pokriva četiri distribucije, proveru da je sve stvarno legalo i tri greške koje odnose najviše vremena.

Šta ti zapravo treba

Ovde se gubi najviše vremena bez potrebe, pa da odmah raščistimo.

Komponenta Šta radi Treba li ti
Kernel drajver Omogućava sistemu da vidi karticu Uvek
CUDA runtime Biblioteke za izvršavanje CUDA koda Dolazi uz drajver
CUDA toolkit Kompajler nvcc i razvojna zaglavlja Samo ako sam kompajliraš

Za Ollamu i vLLM dovoljan je drajver. Toolkit od nekoliko gigabajta koji svi instaliraju „za svaki slučaj" treba ti tek ako kompajliraš llama.cpp iz izvornog koda. Kreni bez njega.

Verzija drajvera određuje najvišu podržanu CUDA verziju, ne obrnuto. Noviji drajver pokreće starije CUDA aplikacije bez problema, pa je pravilo jednostavno: uzmi najnoviji stabilan drajver iz repozitorijuma svoje distribucije.

Provera pre početka

Da li sistem uopšte vidi karticu:

$ lspci | grep -i nvidia
01:00.0 VGA compatible controller: NVIDIA Corporation GA102 [GeForce RTX 3090] (rev a1)

Ako ovde nema ničega, drajver nije problem — proveri da li je kartica dobro nalegla, ima li napajanje i da li je u BIOS-u uključena.

Da li već postoji neki drajver:

$ lsmod | grep -E 'nvidia|nouveau'
nouveau              2555904  0

Učitan nouveau je otvoreni drajver iz kernela. Za AI ne služi ničemu i mora da se skloni — instalacioni paketi to rade sami, pa ga ne diraj ručno osim ako baš mora.

Ubuntu

Najjednostavniji slučaj. Ubuntu ima alat koji sam prepoznaje karticu i predlaže drajver.

$ sudo apt update
$ sudo apt install -y ubuntu-drivers-common
$ sudo ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00002204sv...
vendor   : NVIDIA Corporation
model    : GA102 [GeForce RTX 3090]
driver   : nvidia-driver-570-server - distro non-free recommended
driver   : nvidia-driver-570 - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

Na serveru bez grafičkog okruženja uzmi varijantu sa nastavkom -server, koja ne povlači X paketе:

$ sudo apt install -y nvidia-driver-570-server
$ sudo reboot

Ako ti je svejedno koja verzija, prepusti alatu:

$ sudo ubuntu-drivers install --gpgpu

Debian

Drajver je u non-free komponenti, koja podrazumevano nije uključena.

$ sudo nano /etc/apt/sources.list

Redovima dodaj contrib non-free non-free-firmware:

deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware

Zatim:

$ sudo apt update
$ sudo apt install -y linux-headers-$(uname -r) nvidia-driver firmware-misc-nonfree
$ sudo reboot

Zaglavlja kernela nisu opciona — bez njih se modul ne može izgraditi.

Debian je konzervativan, pa je verzija u stabilnom izdanju često nekoliko generacija stara. Za noviju uzmi bookworm-backports ili NVIDIA repozitorijum iz sledećeg odeljka.

RHEL, Rocky, AlmaLinux

Ovde ide NVIDIA repozitorijum. Zameni rhel9 svojom verzijom.

$ sudo dnf install -y epel-release
$ sudo dnf config-manager --add-repo \
    https://developer.download.nvidia.com/compute/cuda/repos/rhel9/x86_64/cuda-rhel9.repo
$ sudo dnf clean all
$ sudo dnf module install -y nvidia-driver:latest-dkms
$ sudo reboot

DKMS varijanta ponovo gradi modul pri svakom ažuriranju kernela. Na serveru je to ono što želiš — bez nje ti kartica nestane posle prvog dnf update koji dotakne kernel.

Ako dnf module ne postoji u tvojoj verziji:

$ sudo dnf install -y kernel-devel-$(uname -r) kernel-headers-$(uname -r)
$ sudo dnf install -y nvidia-driver nvidia-driver-cuda

Fedora

Preko RPM Fusion repozitorijuma:

$ sudo dnf install -y \
    https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm \
    https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
$ sudo dnf install -y akmod-nvidia
$ sudo reboot

Modul se gradi u pozadini posle instalacije i tome treba nekoliko minuta. Ne restartuj odmah — sačekaj da se izgradnja završi:

$ modinfo -F version nvidia
570.133.07

Dok ova komanda ne vrati verziju, restart će te ostaviti bez drajvera.

Secure Boot

Ako je Secure Boot uključen, kernel odbija nepotpisane module i drajver neće raditi bez obzira na to što je uredno instaliran.

$ mokutil --sb-state
SecureBoot enabled

Dve mogućnosti. Prva je isključivanje Secure Boot-a u BIOS-u — najbrže, ali smanjuje zaštitu sistema. Druga je potpisivanje modula sopstvenim ključem.

$ sudo mokutil --import /var/lib/dkms/mok.pub

Alat traži lozinku koju ćeš uneti pri sledećem podizanju sistema. Posle restarta pojavljuje se plavi MOK Manager ekran: izaberi Enroll MOK, potvrdi ključ i unesi lozinku.

Ovaj ekran se pojavljuje samo jednom i traje oko deset sekundi. Ako propustiš prozor, sistem se podiže bez ključa i sve moraš iznova — zato ovaj korak ne radi preko udaljene sesije bez pristupa konzoli.

Provera da sve radi

$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 570.133.07   Driver Version: 570.133.07   CUDA Version: 12.8      |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce RTX 3090  Off  | 00000000:01:00.0 Off |                  N/A |
| 30%   34C    P8    24W / 350W |      0MiB / 24576MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

Ovo je jedina provera koja je bitna. CUDA Version u zaglavlju je najviša verzija koju drajver podržava, ne ono što je instalirano.

Da je modul zaista učitan:

$ lsmod | grep nvidia
nvidia_uvm           1560576  0
nvidia_drm             77824  0
nvidia_modeset       1290240  1 nvidia_drm
nvidia              62881792  2 nvidia_uvm,nvidia_modeset

nvidia_uvm mora biti tu — bez njega CUDA aplikacije ne rade, iako nvidia-smi uredno prijavljuje karticu.

Podešavanje za server

Uključi trajni režim da se drajver ne rasterećuje između poziva:

$ sudo nvidia-smi -pm 1
Enabled persistence mode for GPU 00000000:01:00.0.

Bez toga se pri svakom pokretanju modela gubi nekoliko sekundi na inicijalizaciju. Da preživi restart, napravi servis:

$ sudo systemctl enable --now nvidia-persistenced

Ako paket ne postoji, dodaj sopstvenu jedinicu:

$ sudo tee /etc/systemd/system/nvidia-pm.service > /dev/null <<'EOF'
[Unit]
Description=NVIDIA persistence mode
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/usr/bin/nvidia-smi -pm 1
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now nvidia-pm.service

CUDA toolkit, ako ti ipak treba

Samo za kompajliranje. Na Ubuntu:

$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb
$ sudo dpkg -i cuda-keyring_1.1-1_all.deb
$ sudo apt update
$ sudo apt install -y cuda-toolkit-12-8

Paket cuda-toolkit-* ne dira drajver. Paket cuda bez nastavka povlači i drajver iz NVIDIA repozitorijuma, što ume da se sudari sa onim iz distribucije — ne instaliraj ga.

Putanja nije podrazumevano u okruženju:

$ echo 'export PATH=/usr/local/cuda/bin:$PATH' | sudo tee /etc/profile.d/cuda.sh
$ source /etc/profile.d/cuda.sh
$ nvcc --version
Cuda compilation tools, release 12.8, V12.8.61

Praktični scenariji

Scenario 1: nvidia-smi ne nalazi karticu

NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver.

Redom: da li je modul učitan (lsmod | grep nvidia), da li je Secure Boot uključen (mokutil --sb-state) i da li je bilo restarta posle instalacije. U devedeset odsto slučajeva odgovor je jedan od ta tri.

Scenario 2: sve je radilo, pa je prestalo posle ažuriranja

Novi kernel, a modul nije prebačen. Zato je DKMS obavezan na serveru:

$ dkms status
nvidia/570.133.07, 6.8.0-51-generic, x86_64: installed
nvidia/570.133.07, 6.8.0-52-generic, x86_64: installed

Ako novi kernel nedostaje u ispisu, izgradi modul ručno:

$ sudo dkms autoinstall

Scenario 3: nvidia-smi radi, ali Ollama ne vidi karticu

Najčešće nedostaje nvidia_uvm. Učitaj ga:

$ sudo modprobe nvidia_uvm

Ako pomogne, dodaj ga u /etc/modules-load.d/nvidia.conf da se učitava sam.

Scenario 4: dve kartice, koristi se samo jedna

Proveri da ih sistem obe vidi, pa ograniči ili proširi vidljivost promenljivom:

$ nvidia-smi -L
GPU 0: NVIDIA GeForce RTX 3090 (UUID: GPU-a1b2...)
GPU 1: NVIDIA GeForce RTX 3090 (UUID: GPU-c3d4...)

$ CUDA_VISIBLE_DEVICES=0,1 ollama serve

Scenario 5: instalacija javlja da nedostaju zaglavlja

ERROR: Unable to find the kernel source tree

Instaliraj zaglavlja za tačno onaj kernel koji je pokrenut, ne za najnoviji dostupan:

$ sudo apt install -y linux-headers-$(uname -r)

Kratka referenca

  • lspci | grep -i nvidia — da li sistem vidi karticu
  • ubuntu-drivers devices — predlog drajvera na Ubuntu
  • nvidia-driver-XXX-server — varijanta bez X paketa
  • dnf module install nvidia-driver:latest-dkms — RHEL i derivati
  • akmod-nvidia — Fedora, preko RPM Fusion
  • linux-headers-$(uname -r) — obavezno pre instalacije
  • mokutil --sb-state — stanje Secure Boot-a
  • mokutil --import — upis ključa za potpisivanje modula
  • nvidia-smi — glavna provera
  • lsmod | grep nvidianvidia_uvm mora biti tu
  • nvidia-smi -pm 1 — trajni režim
  • dkms status — modul po kernelima
  • dkms autoinstall — ručna izgradnja posle novog kernela
  • nvidia-smi -L — spisak kartica
  • CUDA_VISIBLE_DEVICES — izbor kartica za proces
  • Toolkit — samo za kompajliranje, ne za pokretanje

Vežba

  1. Utvrdi model svoje kartice preko lspci i pronađi koliko ima memorije.
  2. Instaliraj drajver po uputstvu za svoju distribuciju i potvrdi nvidia-smi ispisom.
  3. Proveri da li je nvidia_uvm učitan. Ako nije, učitaj ga i podesi da se učitava pri podizanju.
  4. Uključi trajni režim i napravi systemd jedinicu koja ga postavlja posle svakog restarta.
  5. Pogledaj dkms status i objasni šta bi se desilo pri sledećem ažuriranju kernela da DKMS nije u igri.

Sledeći tekst u serijalu: nvidia-smi i nvtop — praćenje GPU-a iz terminala

Povezano:

Comments

Popular posts from this blog

Početak u Linuxu — šta je i zašto se uči

Konverzija tipova podataka u Pythonu

groupadd