From e236069c9216d43ba80c7b55b205182bd2c9a9d7 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 8 Oct 2026 09:33:26 +0000 Subject: [PATCH] =?UTF-8?q?Strata=20sur=20un=20SSD=20d=C3=A9di=C3=A9=20:?= =?UTF-8?q?=20place=20libre=20mesur=C3=A9e=20sur=20/data/strata,=20caches?= =?UTF-8?q?=20pip/HF=20hors=20de=20l'image?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - strataDetect mesure l'espace libre de /data/strata (et non /data) : un SSD monté à cet endroit est celui qui compte pour l'installation. - L'installeur reçoit XDG_CACHE_HOME=/data/strata/cache : les caches pip et Hugging Face ne remplissent plus /root, c.-à-d. l'image Docker d'Unraid. - docker-compose.unraid.yml + README : monter un pool SSD en /data/strata. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01XLbFcZj6mJjDpWvCpcChGA --- README.md | 37 +++++++++++++++++++++++++++++++++ docker-compose.unraid.yml | 9 ++++++++ internal/loki/backend_strata.go | 9 ++++++-- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index aeca61b..5fd41eb 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,43 @@ verrouiller la mémoire : `ulimits: memlock: -1` (déjà présent dans les fichiers compose fournis). Le benchmark et l'optimiseur ne s'appliquent qu'à llama.cpp. +### Strata sur un SSD dédié (Unraid) + +Strata range **tout** dans `/data/strata` : moteur, environnement Python (~10 +Go), modèle (66 à 84 Go), et, quand la RAM ne suffit pas à garder les experts +(mode « lus depuis le disque »), il les relit en continu depuis ce dossier. Un +SSD de 250 Go dédié lui suffit largement (quelle que soit la qualité choisie) +et c'est lui qui fait la vitesse en mode disque : un NVMe vaut mieux qu'un SATA, +et un disque dur de l'array est à proscrire. + +1. **Le SSD en pool Unraid.** Array arrêté : *Main → Add Pool*, nom `strata`, + 1 emplacement, assigne le SSD. Démarre l'array, clique le pool, *File + system type* = `xfs` (ou `btrfs`), puis *Format* en bas de la page Main. + Le SSD est alors monté en `/mnt/strata`. + (Avec le plugin *Unassigned Devices* à la place : monte-le, il apparaît en + `/mnt/disks/` — même suite en remplaçant le chemin.) +2. **Le dossier** (terminal Unraid) : `mkdir -p /mnt/strata/loki`. + Vérifie avec `df -h /mnt/strata` que c'est bien le SSD (~230 Go) et pas + `rootfs` : un `/mnt/` qui n'existe pas est dans la RAM d'Unraid. +3. **Ce qui existe déjà.** Si une installation de Strata avait commencé dans + `/mnt/user/appdata/loki/data/strata`, *Compose Down* puis, au choix : + `rsync -a /mnt/user/appdata/loki/data/strata/ /mnt/strata/loki/` (on garde, + les presets restent valides : le chemin vu par le conteneur ne change pas), + ou supprime ce dossier pour repartir de zéro. Sinon il reste caché sous le + montage et occupe de la place pour rien. +4. **Le compose** : décommente dans `docker-compose.unraid.yml` la ligne + ```yaml + - /mnt/strata/loki:/data/strata + ``` + (sous les deux volumes existants), puis *Compose Up*. +5. **Installer** : *Paramètres → Moteur → Strata*. La fenêtre affiche + maintenant l'espace libre **du SSD** ; choisis la version et la qualité + proposées, puis installe. + +Pas de partage `/mnt/user/…` pour ce montage : la couche FUSE d'Unraid +ralentit fortement la lecture des experts en mmap. Et rien à faire côté mover +ou cache : le pool `strata` n'est lié à aucun partage. + ## Installation sur Unraid L'image est construite et publiée par GitHub Actions sur GHCR diff --git a/docker-compose.unraid.yml b/docker-compose.unraid.yml index 32101f5..9f12718 100644 --- a/docker-compose.unraid.yml +++ b/docker-compose.unraid.yml @@ -64,6 +64,15 @@ services: - /mnt/user/appdata/loki/data:/data # /models : dossier de .gguf déposés à la main (gros fichiers) - /mnt/user/appdata/loki/models:/models + # Strata sur un SSD dédié (optionnel) : tout ce que Strata installe + # (moteur, Python, modèle de 66 à 84 Go, experts lus en mmap) va dans + # /data/strata. Monter un SSD à cet endroit l'y envoie entier. Le SSD + # doit être un pool Unraid (Main -> Add Pool, ex. « strata ») : chemin + # /mnt//…, PAS /mnt/user/… (FUSE ralentit le mmap des experts). + # Vérifie que /mnt/strata existe avant Compose Up : sinon Docker crée + # le dossier dans la RAM d'Unraid. Détails : README, « Strata sur un + # SSD dédié ». + # - /mnt/strata/loki:/data/strata # Moteur Strata (Qwen3.8 Flash Next) : il verrouille ses experts en RAM # (mlock, 30 à 50 Go). La limite Docker par défaut (64 Ko) l'en empêche. ulimits: diff --git a/internal/loki/backend_strata.go b/internal/loki/backend_strata.go index 416ca3e..b25feff 100644 --- a/internal/loki/backend_strata.go +++ b/internal/loki/backend_strata.go @@ -284,7 +284,9 @@ const strataMinArch = 75 func strataDetect() strataEnv { env := strataEnv{Main: -1, Helper: -1, RAMGB: totalRAMGB()} env.AvailGB = min(memAvailableGB()+strataEngineRSSGB(), env.RAMGB) - if f := diskFree(LokiHome()); f > 0 { + // strataHome() et pas LokiHome() : /data/strata peut être un disque à part + // (SSD dédié monté dans le conteneur), c'est sa place libre qui compte. + if f := diskFree(strataHome()); f > 0 { env.DiskFreeGB = float64(f) / 1e9 } if runtime.GOOS != "linux" || runtime.GOARCH != "amd64" { @@ -774,7 +776,10 @@ func strataRunInstall(req strataInstallReq) { // réserver sa propre variante (qui ne voit pas un experts.bin présent). "--low-ram", "off", } - extra := "CUDA_DEVICE_ORDER=PCI_BUS_ID\x00PYTHONUNBUFFERED=1" + // XDG_CACHE_HOME : les caches de pip et de Hugging Face (~/.cache, soit + // /root dans le conteneur, donc l'image Docker — 20 Go sur Unraid) suivent + // le reste de Strata dans /data/strata. + extra := "CUDA_DEVICE_ORDER=PCI_BUS_ID\x00PYTHONUNBUFFERED=1\x00XDG_CACHE_HOME=" + filepath.Join(strataHome(), "cache") if err := runStepEnv("installation de Strata", strataSrcDir(), extra, "bash", args...); err != nil { lcFail(fmt.Errorf("l'installation a échoué : %w (voir le journal)", err)) return