diff --git a/CLAUDE.md b/CLAUDE.md index 2d2ad80..0d5d357 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -4,16 +4,17 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Présentation du projet -**Funk** — homelab IA composé d'un cluster Kubernetes (Talos) pour les services applicatifs, d'un hôte d'inférence LLM dédié (gpu-01 / LM Studio), et d'un agent autonome (Hermes Agent) sur storage-01. Stack IaC complète : Ansible + talhelper + ArgoCD. +**Funk** — homelab IA composé d'un cluster Kubernetes (Talos) pour les services applicatifs, d'un hôte d'inférence LLM dédié (gpu-01 / llama-server ROCm), et d'un agent autonome (Hermes Agent) sur storage-01. Stack IaC complète : Ansible + talhelper + ArgoCD. Référence complète : `Funk/Funk-infra/HOMELAB.md` -**État actuel (2026-05-09)** : -- ✅ Hermes Agent opérationnel sur le poste perso (LM Studio local `127.0.0.1:1234`) +**État actuel (2026-05-13)** : +- ✅ Hermes Agent opérationnel sur storage-01 (llama-server GPU via LiteLLM) - ✅ storage-01 installé — `192.168.10.1` (LAN cluster), `192.168.1.200` (WAN) -- ✅ gpu-01 installé — ping OK depuis storage-01 (`192.168.10.20`) -- ⏳ Phase 1/2 en cours — Ansible, ROCm, LM Studio, dnsmasq, NAT restent à faire -- ❌ Repo `lab-infra/` à initialiser, aucun cluster k8s monté +- ✅ gpu-01 installé — llama-server GPU (:1234) + CPU (:1236/:1237) opérationnels +- ✅ LiteLLM sur storage-01 — proxy multi-modèles + ask-agent +- ✅ Cluster k8s Talos opérationnel (MetalLB + Traefik + wildcard DNS lab.local) +- ⏳ WOL compute nodes non configuré (BIOS) — allumage manuel requis --- @@ -25,7 +26,7 @@ Référence complète : `Funk/Funk-infra/HOMELAB.md` | compute-01 | 192.168.10.11 | Talos v1.13+ | k8s control-plane | | compute-02 | 192.168.10.12 | Talos v1.13+ | k8s worker | | compute-03 | 192.168.10.13 | Talos v1.13+ | k8s worker | -| gpu-01 | 192.168.10.20 | AlmaLinux 9.7 | LM Studio dédié (RX 6700XT) — **hors cluster** | +| gpu-01 | 192.168.10.20 | AlmaLinux 9.7 | llama-server dédié (RX 6700XT, ROCm 7.x) — **hors cluster** | **Points clés d'architecture :** - `storage-01` et `gpu-01` sont **hors du cluster k8s** — ils sont consommés via des `ExternalName` services ou `Endpoints` manuels @@ -43,7 +44,7 @@ lab-infra/ │ ├── playbooks/site.yml │ ├── group_vars/ │ └── roles/ # common, gateway, dnsmasq, nfs_server, postgresql, -│ # qdrant, minio, rocm, lm_studio, hermes_agent +│ # qdrant, minio, rocm, llama_server, litellm, hermes_agent, hermes_user ├── talos/ # nœuds Talos via talhelper │ ├── talconfig.yaml # source de vérité (lue par talhelper) │ ├── talsecret.sops.yaml @@ -77,7 +78,7 @@ ansible-playbook -i inventory.yml playbooks/site.yml # apply ansible-playbook -i inventory.yml playbooks/site.yml --tags rocm # un rôle ``` -Rôles prévus : `common`, `gateway`, `dnsmasq`, `nfs_server`, `postgresql`, `qdrant`, `minio`, `rocm`, `lm_studio`, `hermes_agent`. Tous idempotents. Secrets via Ansible Vault. +Rôles : `common`, `gateway`, `dnsmasq`, `nfs_server`, `nfs_client`, `postgresql`, `qdrant`, `minio`, `rocm`, `llama_server`, `litellm`, `hermes_agent`, `hermes_user`. Tous idempotents. Secrets via Ansible Vault. ### talhelper (nœuds Talos) @@ -114,20 +115,15 @@ git push ## Contrainte GPU critique -La RX 6700XT (gfx1031) n'est **pas officiellement supportée** par ROCm. Sur gpu-01, toujours s'assurer que la variable est présente dans l'environnement LM Studio / le service systemd : +La RX 6700XT (gfx1031) n'est **pas officiellement supportée** par ROCm. Toujours s'assurer que la variable est présente dans le service systemd `llama-server` : ``` HSA_OVERRIDE_GFX_VERSION=10.3.0 ``` -ROCm tourne directement sur l'hôte AlmaLinux (pas dans des conteneurs). Fallback : Vulkan dans LM Studio si ROCm coince. +ROCm tourne directement sur l'hôte AlmaLinux (pas dans des conteneurs). L'inférence est assurée par llama-server (llama.cpp compilé ROCm 7.x). -LM Studio bind sur `127.0.0.1` par défaut → pour l'exposer au réseau : -```bash -lms server start --port 1234 --bind 0.0.0.0 -``` - -CLI LM Studio utile : `lms ls`, `lms load `, `lms unload`, `lms server status` +CLI `lms` disponible sur gpu-01 uniquement pour télécharger des modèles (`lms get `, `lms ls`). --- @@ -137,44 +133,32 @@ CLI LM Studio utile : `lms ls`, `lms load `, `lms unload`, `lms server st | Composant | Endpoint | |---|---| -| LM Studio | `http://127.0.0.1:1234/v1` | | Ollama | `http://127.0.0.1:11434` | -| Hermes Agent | `base_url: http://127.0.0.1:1234/v1` | - -```bash -# Prérequis : modèle chargé avec context suffisant (system prompt Hermes ≈ 15 000 tokens) -lms load --context-length 16384 -lms server start --port 1234 -``` - -Agents Goose dans `Funk/Funk-infra/agents/` — pointent tous sur `http://localhost:1234/v1` : -```bash -cd Funk/Funk-infra/agents/ -goose session --config goose-config.yaml -``` +| LM Studio (optionnel) | `http://127.0.0.1:1234/v1` | +| Hermes Agent | `base_url: http://127.0.0.1:1234/v1` ou Ollama | ### Setup 2 — Cluster Funk (production) | Composant | Endpoint | |---|---| -| LM Studio (gpu-01) | `http://192.168.10.20:1234/v1` | -| Hermes Agent | service systemd sur storage-01, pointe sur gpu-01 | +| llama-server GPU (gpu-01) | `http://192.168.10.20:1234/v1` | +| llama-server CPU system (gpu-01) | `http://192.168.10.20:1236/v1` | +| llama-server CPU monitor (gpu-01) | `http://192.168.10.20:1237/v1` | +| LiteLLM proxy (storage-01) | `http://127.0.0.1:4000/v1` (master_key: `lm-studio`) | +| Hermes Agent | service systemd sur storage-01, via LiteLLM | ```bash -# Sur gpu-01 — HSA_OVERRIDE requis pour RX 6700XT (gfx1031) -HSA_OVERRIDE_GFX_VERSION=10.3.0 lms load --context-length 16384 -lms server start --port 1234 --bind 0.0.0.0 +# Vérifier l'état complet depuis le poste perso +funk-status ``` -Détail complet des deux setups : `Funk/Funk-infra/HOMELAB.md` § 7.4 - --- ## Conventions - **Domaine** : `lab.local` — wildcard DNS via dnsmasq sur storage-01 - **Ingress** : `.lab.local` → IP MetalLB de Traefik (`192.168.10.200-230`) -- **LM Studio endpoint** : `http://192.168.10.20:1234/v1` +- **llama-server endpoint** : `http://192.168.10.20:1234/v1` (GPU) — accès via LiteLLM sur storage-01 - **Namespaces k8s** : `argocd`, `infra`, `storage`, `external`, `ai`, `workflows` - **Git** : branches `main` (prod) / `feature/*` — commits en conventional commits (`feat:`, `fix:`, `chore:`, `docs:`) - **Secrets** : Ansible Vault (Ansible), SOPS+age (Talos via talhelper), Sealed Secrets (k8s) diff --git a/admin/README.md b/admin/README.md index 0d4e14a..032678d 100644 --- a/admin/README.md +++ b/admin/README.md @@ -18,7 +18,7 @@ | [dnsmasq.md](dnsmasq.md) | DNS local lab.local — résolution, logs, ajout d'entrées | | [rocm.md](rocm.md) | GPU AMD RX 6700XT — ROCm, HSA_OVERRIDE, debug | | [llama_server.md](llama_server.md) | llama-server — inférence ROCm 7.x, API OpenAI, build, modèles | -| [lm_studio.md](lm_studio.md) | LM Studio — gestion des modèles uniquement (lms get/ls) | +| [lm_studio.md](lm_studio.md) | LM Studio — supprimé du cluster, CLI `lms` conservée pour téléchargement modèles | | [nfs.md](nfs.md) | NFS + RAID5 — exports, montages, automount, ajout de partages | | [systeme.md](systeme.md) | Services, logs, ressources, NetworkManager, dnf | | [litellm.md](litellm.md) | LiteLLM Proxy — routage Qwen local + Claude API, config, validation | diff --git a/admin/lm_studio.md b/admin/lm_studio.md index b6f6891..198c7a9 100644 --- a/admin/lm_studio.md +++ b/admin/lm_studio.md @@ -1,31 +1,28 @@ -# LM Studio — Commandes d'administration +# LM Studio — Historique -> **Note** : L'inférence GPU est désormais assurée par **llama-server** (voir `admin/llama_server.md`). -> LM Studio reste installé sur gpu-01 **uniquement pour la gestion des modèles** (`lms get`, `lms ls`). -> Le service `lm-studio` est désactivé. +> **LM Studio est supprimé du cluster Funk (2026-05-13).** +> L'inférence GPU est assurée par **llama-server** (llama.cpp compilé ROCm 7.x). +> L'utilisateur `lmstudio` et le répertoire `/opt/lmstudio` ont été supprimés. +> La CLI `lms` reste disponible sur gpu-01 pour télécharger des modèles GGUF. --- -## Gestion des modèles (lms CLI) +## Télécharger des modèles (lms CLI) ```bash -# Lister les modèles installés -lms ls +# Lister les modèles installés (stockés sur NFS /mnt/models) +ssh g01 "lms ls" # Télécharger un modèle depuis HuggingFace -lms get https://huggingface.co/bartowski/Qwen2.5-7B-Instruct-GGUF -y - -# Supprimer un modèle -lms remove bartowski/Qwen2.5-7B-Instruct-GGUF +ssh g01 "lms get https://huggingface.co/bartowski/Qwen2.5-7B-Instruct-GGUF -y" # Les modèles sont stockés sur le NFS partagé : # storage-01:/srv/data/models → gpu-01:/mnt/models -# Symlink : /opt/lmstudio/.lmstudio/models → /mnt/models ``` --- -## Pourquoi llama-server remplace LM Studio pour l'inférence +## Pourquoi llama-server remplace LM Studio | Critère | LM Studio (Vulkan) | llama-server (ROCm) | |---|---|---| @@ -34,7 +31,7 @@ lms remove bartowski/Qwen2.5-7B-Instruct-GGUF | Backend | Vulkan (ROCm 6.x uniquement) | ROCm 7.x natif | | API | OpenAI-compatible | OpenAI-compatible | -Le backend ROCm de LM Studio est compilé pour ROCm 6.x et incompatible avec ROCm 7.x installé sur gpu-01. +Le backend ROCm de LM Studio était compilé pour ROCm 6.x, incompatible avec ROCm 7.x installé. llama.cpp compilé from source avec ROCm 7.x donne un gain de ~5x sur la vitesse d'inférence. --- @@ -44,6 +41,6 @@ llama.cpp compilé from source avec ROCm 7.x donne un gain de ~5x sur la vitesse | Sujet | Détail | |---|---| | GPU non officiel | RX 6700XT (gfx1031) — `HSA_OVERRIDE_GFX_VERSION=10.3.0` dans le service llama-server | -| Gemma 4 interdit | Gemma 4 E2B/E4B crash Vulkan et ROCm sur prompts >800 tokens — utiliser Qwen | -| Modèles sur NFS | `/opt/lmstudio/.lmstudio/models` est un symlink vers `/mnt/models` (NFS automount) | -| lms get | Utiliser `lms get ` pour télécharger, puis pointer llama-server sur le GGUF | +| Gemma 4 interdit | Gemma 4 E2B/E4B crash ROCm sur prompts >800 tokens — utiliser Qwen | +| Modèles sur NFS | Stockés dans `/mnt/models/` sur gpu-01 (NFS automount depuis storage-01) | +| lms get | Télécharger avec `lms get `, puis pointer llama-server sur le GGUF | diff --git a/admin/nfs.md b/admin/nfs.md index 1337b8f..4768ab6 100644 --- a/admin/nfs.md +++ b/admin/nfs.md @@ -28,7 +28,7 @@ sudo systemctl status nfs-server /srv/data/ ├── nfs/ │ └── k8s/ → export pour le NFS provisioner Kubernetes -├── models/ → modèles LM Studio partagés (gpu-01 monte ce répertoire) +├── models/ → modèles GGUF partagés (gpu-01 monte ce répertoire via NFS) ├── hermes/ → données persistantes Hermes Agent (à venir) ├── postgres/ → données PostgreSQL (à venir) ├── qdrant/ → données Qdrant (à venir) @@ -69,20 +69,16 @@ Les montages NFS sur gpu-01 utilisent `x-systemd.automount` : --- -## Modèles LM Studio sur NFS +## Modèles GGUF sur NFS ```bash -# Sur gpu-01 — symlink transparent pour LM Studio -ls -la /opt/lmstudio/.lmstudio/models -# → lrwxrwxrwx ... models -> /mnt/models - -# Le contenu réel est sur storage-01 +# Les modèles sont montés directement sur gpu-01 ls /mnt/models/ -# → lmstudio-community/gemma-4-E2B-it-GGUF/ -# → lmstudio-community/gemma-4-E4B-it-GGUF/ +# → bartowski/ +# → lmstudio-community/ # Ajouter un modèle (depuis gpu-01 — sera stocké directement sur NFS) -lms get +ssh g01 "lms get " ``` --- diff --git a/admin/rocm.md b/admin/rocm.md index 829894c..b834f0f 100644 --- a/admin/rocm.md +++ b/admin/rocm.md @@ -82,7 +82,7 @@ ssh g01 "sudo usermod -aG video,render ansible" --- -## Debug ROCm / LM Studio +## Debug ROCm / llama-server ```bash # Tester OpenCL @@ -99,18 +99,3 @@ ssh g01 "cat /sys/class/drm/card*/device/hwmon/hwmon*/temp1_input" ssh g01 "cat /sys/class/drm/card*/device/mem_info_vram_used" ssh g01 "cat /sys/class/drm/card*/device/mem_info_vram_total" ``` - ---- - -## Fallback Vulkan (si ROCm ne fonctionne pas) - -Si `rocminfo` ne liste pas le GPU malgré `HSA_OVERRIDE`, LM Studio peut utiliser Vulkan : - -```bash -# Vérifier que Vulkan fonctionne -ssh g01 "vulkaninfo 2>/dev/null | grep 'GPU id'" - -# Installer les outils Vulkan si absents -ssh g01 "sudo dnf install -y vulkan-tools" -``` -Dans LM Studio : Settings → GPU → Backend → Vulkan