# llama_server Compile llama.cpp (backend HIP/ROCm) et déploie le service **llama-server GPU** (`:1234`) sur gpu-01. Sert aussi les embeddings du RAG. ## Ce que fait le rôle - Clone + build llama.cpp (cmake HIP, `gfx1030`) — build seulement si le binaire est absent - Service systemd `llama-server` : modèle GGUF depuis `/mnt/models` (NFS), `:1234` - Embeddings activés (`--embeddings`, pooling mean) - Ouvre le port dans le firewall, désactive l'ancien service lm-studio - **Instance dédiée embeddings** (optionnelle, `llama_embed_enabled`) : service systemd `llama-embed` servant un modèle d'embedding spécialisé (ex. `nomic-embed-text`) sur `:1238`, GPU. Télécharge le GGUF depuis `llama_embed_model_url` si absent. Partage le binaire et le GPU avec `:1234` (modèle ~300 Mo VRAM). - **Watchdog** (optionnel, `llama_watchdog_enabled`, défaut `true`) : service systemd `llama-watchdog` qui sonde une **vraie génération** sur `:1234` toutes les `llama_watchdog_interval` s. Sur `llama_watchdog_failures` échecs consécutifs → `systemctl restart llama-server` **en local** (tourne en root, pas de SSH). Répare automatiquement le wedge ROCm où `/health` reste vert mais l'inférence est morte (cf. `admin/incidents-llm-gpu.md`). Logs : `journalctl -u llama-watchdog`. ## Watchdog — variables | Variable | Défaut | |---|---| | `llama_watchdog_enabled` | `true` | | `llama_watchdog_port` | `{{ llama_server_port }}` (1234) | | `llama_watchdog_model` | `{{ llama_model_alias }}` (`qwen3-8b`) | | `llama_watchdog_interval` | `20` (s entre deux sondes) | | `llama_watchdog_timeout` | `15` (s max par sonde) | | `llama_watchdog_failures` | `3` (échecs consécutifs avant restart) | > Complémentaire au `llm-heartbeat` du rôle `litellm` : le heartbeat empêche la > *péremption par inactivité* de la connexion LiteLLM↔llama-server ; le watchdog répare le > *figeage* du llama-server lui-même. Le watchdog gère le `503 "Loading model"` post-restart > (rechargement VRAM) sans le compter comme échec. ## Variables principales | Variable | Défaut | Surcharge gpu-01 | |---|---|---| | `llama_server_port` | 1234 | — | | `llama_model_path` | `""` | `/mnt/models/bartowski/Qwen3-8B-GGUF/Qwen3-8B-Q4_K_M.gguf` | | `llama_model_alias` | `""` | `qwen3-8b` | | `llama_ctx_size` | 32768 | 32768 | | `llama_n_gpu_layers` | 99 | — | | `hsa_override_gfx_version` | `10.3.0` | — | | `llama_embed_enabled` | `false` | `true` | | `llama_embed_port` | 1238 | — | | `llama_embed_model_path` | `""` | `/mnt/models/nomic-ai/nomic-embed-text-v1.5.f16.gguf` | | `llama_embed_model_url` | `""` | URL HuggingFace du GGUF nomic | | `llama_embed_model_alias` | `nomic-embed-text` | — | ## ⚠️ Gap IaC — instances CPU hors Ansible Le rôle ne gère que l'instance **GPU** (`llama-server.service`). Les services suivants existent sur gpu-01 mais ont été créés **à la main** (non reproductibles par `make apply-gpu`) : | Service | Port | Modèle | Usage | |---|---|---|---| | `llama-server-system.service` | 1236 | Qwen3-1.7B CPU | profil `system` | | `llama-server-monitor.service` | 1237 | Qwen3-1.7B CPU | profil `monitor` | | `llama-server-dev.service` | — | (non documenté, présent dans /etc/systemd/system) | ? | **À faire** : templatiser ces instances dans le rôle (liste d'instances avec port/modèle/threads) pour qu'une réinstallation de gpu-01 restaure les 3 serveurs. ## Caveats - Rebuild forcé : supprimer le binaire (`/opt/llama.cpp/build/bin/llama-server`) puis relancer le rôle - Le modèle vient du NFS — voir caveat du rôle `nfs_client`