LocalAI versnellen met een Nvidia Tesla M40: GPU-acceleratie gids
Hoe ik een 24GB AI-Server bouwde met een oude Tesla M40 op een ASUS H87M-PLUS moederbord
AI lokaal draaien is hot, maar fatsoenlijke hardware is duur. Als Digital Problem Solver kijk ik liever naar wat er wél kan met spullen die er al zijn. Mijn doel? Een goedkope, krachtige lokale AI-omgeving (LocalAI) opzetten. Mijn wapens?
- Een oude Intel i7-4770
- een ASUS H87M-PLUS moederbord uit 2013
- een enterprise Nvidia Tesla M40 GPU met maar liefst 24GB aan VRAM.
Klinkt leuk, maar op papier had dit project eigenlijk direct moeten stranden.
Het Grote Probleem: Geen "Above 4G Decoding"
Om een monster van een videokaart met 12GB of 24GB VRAM aan te spreken, heeft een modern systeem Above 4G Decoding (en Resizable BAR) nodig in het BIOS. Dit zorgt ervoor dat het moederbord grote geheugenblokken over de PCIe-bus kan toewijzen.
Na het updaten van mijn ASUS-moederbord naar de allerlaatste BIOS-versie (2108), werd de pijnlijke realiteit duidelijk: deze optie ontbreekt volledig in het menu. Asus heeft dit destijds nooit toegevoegd voor de H87-chipset.
Bij het booten in Arch Linux en het laden van de Nvidia-legacy drivers (nvidia-580xx-dkms) liep ik dan ook direct tegen een keiharde muur aan:
modprobe: ERROR: could not insert 'nvidia': No such device
De kernel zag de kaart wel via lspci, maar de driver weigerde te communiceren omdat het BIOS de geheugenruimte niet wilde reserveren. Game over? Echt niet.
De Oplossing: Linux de PCIe-bus laten herindelen
Waar Windows strak de regels van het BIOS volgt, kun je de Linux-kernel dwingen om de lakens uit te delen. We kunnen Linux de PCIe-bus volledig opnieuw laten indelen (*reallocaten*) en de foutieve restricties van het oude BIOS negeren.
Door de volgende parameters mee te geven aan de bootloader in /etc/default/grub, dwong ik de kernel tot actie:
GRUB\_CMDLINE\_LINUX\_DEFAULT="loglevel=3 quiet pci=realloc,nocrs pcie\_aspm=off"
- pci=realloc,nocrs: Dit is de geheime saus. Het dwingt Linux om de geheugenblokken voor de Tesla-kaart zélf toe te wijzen en negeert de limieten die het BIOS probeert op te leggen.
- pcie\_aspm=off: Voorkomt dat agressief stroombeheer de serverkaart per ongeluk in de slaapstand gooit.
Na een grub-mkconfig en een reboot gebeurde het wonder: modprobe nvidia bleef stil en **nvidia-smi** toonde trots een perfect werkende Tesla M40\!
Docker-hindernissen: Van Whack-A-Mole naar CDI
Nu de host-driver werkte, was de volgende stap: LocalAI in Docker gooien om modellen zoals Gemma-4 lokaal te hosten.
De traditionele methode (--gpus all via de Nvidia Container Toolkit) belandde echter al snel in een frustrerend spelletje whack-a-mole. Omdat we op de legacy 580xx drivers draaien, zocht Docker telkens naar moderne .so bibliotheken die simpelweg niet bestaan voor deze kaart:
error during container init: failed to fulfil mount request: open /usr/lib/libnvidia-cbl.so... no such file or directory
In plaats van tientallen handmatige symlinks aan te maken, stapte ik over op de moderne CDI (Container Device Interface) methode. Hiermee scant de toolkit de host en genereert een waterdichte configuratie die exact matcht met wat er daadwerkelijk op het systeem staat:
sudo nvidia-ctk cdi generate \--output=/etc/cdi/nvidia.yaml
Na het activeren van CDI in de Docker daemon.json, kon de GPU direct en foutloos in de compose.yaml worden doorgegeven:
deploy:
resources:
reservations:
devices:
\- driver: cdi
device\_ids:
\- nvidia.com/gpu=all
capabilities: \[gpu\]
CUDA Architecture Mismatch (De Genadeslag)
De container startte, de UI van LocalAI opende, maar bij het laden van gemma-3-1b-it crashte de backend met de melding:
CUDA error: no kernel image is available for execution on the device
De boosdoener: De standaard CUDA 13-images van LocalAI zijn gecompileerd voor moderne kaarten (Compute Capability vanaf 7.5). Mijn Tesla M40 (Maxwell-architectuur) vereist echter specifiek Compute Capability 5.2.
Door de Docker-image in de Compose-file simpelweg te downgraden naar de breder ondersteunde CUDA 12 variant (localai/localai:latest-gpu-nvidia-cuda-12), was de mismatch opgelost.
Het Resultaat
Het resultaat is een superstabiele, spotgoedkope AI-playground. De LocalAI-container heeft nu volledige, exclusieve toegang tot de 24GB aan VRAM op de Tesla M40. Dankzij een 3D-geprinte shroud en een stevige fan blijven de temperaturen keurig binnen de perken, en draaien LLM's lokaal, privé en lekker snel op hardware die eigenlijk al lang was afgeschreven. De uiteindelijke compose.yaml ziet er zo uit:
services:
localai:
image: localai/localai:master-gpu-nvidia-cuda-12
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/readyz"]
interval: 1m
timeout: 20m
retries: 5
ports:
- 8510:8080
environment:
- DEBUG=false
volumes:
- /mnt/opslag/localai/models:/models
- /mnt/opslag/localai/backends:/backends
- /mnt/opslag/localai/backends:/usr/share/localai/backends
- /mnt/opslag/localai/images:/tmp/generated/images
deploy:
resources:
reservations:
devices:
- driver: cdi
device_ids:
- nvidia.com/gpu=all
capabilities: [gpu]
Conclusie: Laat je nooit tegenhouden door een ontbrekende knop in je BIOS of een foutmelding in Docker. Met de juiste kernel-parameters en de moderne CDI-standaard kun je hardware uit 2013 transformeren in een moderne AI-krachtpatser.
Heb jij ook een 'onmogelijke' hardware-uitdaging liggen in je homelab of bedrijf? Stuur mij even een berichtje.