* 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>
|
||
|---|---|---|
| .. | ||
| defaults | ||
| handlers | ||
| tasks | ||
| templates | ||
| README.md | ||
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 systemdllama-embedservant un modèle d'embedding spécialisé (ex.nomic-embed-text) sur:1238, GPU. Télécharge le GGUF depuisllama_embed_model_urlsi absent. Partage le binaire et le GPU avec:1234(modèle ~300 Mo VRAM). - Watchdog (optionnel,
llama_watchdog_enabled, défauttrue) : service systemdllama-watchdogqui sonde une vraie génération sur:1234toutes lesllama_watchdog_intervals. Surllama_watchdog_failureséchecs consécutifs →systemctl restart llama-serveren local (tourne en root, pas de SSH). Répare automatiquement le wedge ROCm où/healthreste 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-heartbeatdu rôlelitellm: 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 le503 "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