how-to-install-and-manage Help

Ollama

Cette VM ollama est une machine NixOS hébergée sous XCP-ng, avec passage de la carte graphique NVIDIA en PCI passthrough. Elle sert d’hôte à Ollama (serveur LLM local).

Environnement & matériel

  • Hyperviseur: XCP-ng

  • OS invité: NixOS (configuration déclarative via Nix flakes)

  • GPU passthrough: NVIDIA, avec modules noyau propriétaire

    • Modules nvidia chargés dans l’initrd

    • Support CUDA via hardware.nvidia-container-toolkit.enable = true

    • Installation de CUDA Toolkit, nvtop, pciutils, file

Étapes XCP-ng : PCI Passthrough de la carte NVIDIA

La VM srv-ollama utilise le PCI passthrough pour exposer la carte graphique NVIDIA GeForce RTX 4060 à l’environnement NixOS invité. Voici les étapes réalisées depuis XCP-ng :

1. Préparation : masquer la carte à Dom0

Voici l'exécution des commandes pour cacher les deux périphériques PCI (VGA et Audio) de la carte NVIDIA :

/opt/xensource/libexec/xen-cmdline --set-dom0 "xen-pciback.hide=(0000:03:00.0)(0000:03:00.1)"

On redémarre le serveur pour une bonne prise en compte :

reboot

On vérifie que les périphériques sont bien assignables :

xl pci-assignable-list

2. Attribution à la VM cible

Identification de l’UUID de la VM ollama:

xe vm-list

On affecte les deux périphériques PCI à cette VM :

xe vm-param-set other-config:pci=0/0000:03:00.0,0/0000:03:00.1 uuid=<UUID_VM_SRV_OLLAMA>

On redémarre l'hyperviseur XCP-ng :

reboot

ollama-pci-xcp.png

Fichiers de configuration

Fichier

Description

nvidia.nix

Drivers NVIDIA, CUDA Toolkit, GPU passthrough

ollama.nix

Services Ollama, nginx

Configuration logicielle

Tous les services sont gérés dans la flake ollama.nix

1. Service services.ollama

services.ollama = { enable = true; host = "0.0.0.0"; port = 8081; openFirewall = true; acceleration = "cuda"; environmentVariables = { OLLAMA_DEBUG = "1"; LD_LIBRARY_PATH = "${pkgs.cudaPackages.cudatoolkit}/lib:${pkgs.cudaPackages.cudatoolkit}/lib64"; }; package = lib.mkForce pkgs.ollama-cuda; };
  • Accélération CUDA activée

  • Débogage activé

  • Service exposé sur le port 8081

  • Firewall mis à jour automatiquement

2. Service Open WebUI

services.open-webui = { enable = true; port = 8080; openFirewall = true; environment = { OLLAMA_API_BASE_URL = "http://localhost:8081"; ANONYMIZED_TELEMETRY = "False"; DO_NOT_TRACK = "False"; SCARF_NO_ANALYTICS = "False"; }; stateDir = "/var/lib/open-webui/"; };
  • Interface web disponible sur le port 8080

  • Communication vers Ollama via localhost:8081

3. Reverse proxy via nginx

services.nginx = { enable = true; virtualHosts."10.0.0.50" = { locations."/" = { proxyPass = "http://localhost:8080"; proxyWebsockets = true; }; }; };
  • Accès WebUI depuis http://10.0.0.50/

  • Support des WebSockets

Installation & déploiement

  1. Nous avons configuré le passthrough GPU dans XCP-ng (assignation à la VM)

  2. Il a fallut activer les drivers NVIDIA dans NixOS (nvidia.nix)

  3. Et appliquer la flake Nix :

    nixos-rebuild switch
  4. Après build :

    • ollama écoute sur le port 8081

    • open-webui sur 8080

    • nginx proxy sur 10.0.0.50

Accès aux services

  • Ollama API: http://10.0.0.50:8081

Gestion des modèles

  • Pour télécharger les modèles, nous somme passé via la CLI Ollama.

  • Les modèles sont stockés par défaut dans /var/lib/ollama

Maintenance & mise à jour

  • Configuration entièrement déclarative via Nix

  • Rebuild :

    nixos-rebuild switch --flake ~/Documents/nixos-config/ollama
  • Surveillance GPU via nvtop, nvidia-smi

Last modified: 22 July 2025