Funk-lab/ansible/roles/llama_server
ALI YESILKAYA 577d61ebaa
feat: anti-502 LLM — heartbeat (litellm) + watchdog auto-réparation (llama_server) (#23)
* feat(litellm): heartbeat anti-502 + request_timeout 20s

Cause racine du 502 « 1ʳᵉ demande après une pause » : la connexion keep-alive
LiteLLM↔llama-server devient inactive → llama-server la ferme → LiteLLM garde le
socket mort → la requête suivante part dans le vide → timeout → 502.

- llm-heartbeat : service systemd qui appelle hermes-default toutes les 15s
  (max_tokens:1, /no_think → ~10ms GPU) → la connexion n'est jamais inactive,
  jamais périmée. Logge les échecs → sert aussi de sonde (vraie génération).
- request_timeout 60→20s : un socket périmé échoue vite, dans la fenêtre où
  num_retries:2 peut rejouer sur une connexion neuve (sinon le client abandonnait
  avant le retry → 502 sec).
- Doc : admin/incidents-llm-gpu.md (fix racine) + README rôle.

⚠️ heartbeat appelle hermes-default en continu → si bascule sur Claude (facturé),
mettre llm_heartbeat_enabled: false. request_timeout global → remonter si Claude.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* feat(llama_server): watchdog auto-réparation du wedge ROCm

Service systemd local sur gpu-01 qui sonde une vraie génération sur :1234
(pas juste /health, qui ment quand le slot d'inférence est figé). Sur N
échecs consécutifs → systemctl restart llama-server en local (root, sans
SSH/sudo distant). Gère le 503 "Loading model" post-restart sans le compter
comme échec.

Complète le llm-heartbeat (rôle litellm) : le heartbeat empêche la péremption
par inactivité de la connexion ; le watchdog répare le figeage du serveur lui-même.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 20:52:29 +02:00
..
defaults feat: anti-502 LLM — heartbeat (litellm) + watchdog auto-réparation (llama_server) (#23) 2026-06-19 20:52:29 +02:00
handlers feat: anti-502 LLM — heartbeat (litellm) + watchdog auto-réparation (llama_server) (#23) 2026-06-19 20:52:29 +02:00
tasks feat: anti-502 LLM — heartbeat (litellm) + watchdog auto-réparation (llama_server) (#23) 2026-06-19 20:52:29 +02:00
templates feat: anti-502 LLM — heartbeat (litellm) + watchdog auto-réparation (llama_server) (#23) 2026-06-19 20:52:29 +02:00
README.md feat: anti-502 LLM — heartbeat (litellm) + watchdog auto-réparation (llama_server) (#23) 2026-06-19 20:52:29 +02:00

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