Files
Loki/docs/superpowers/specs/2026-10-15-rust-migration-lot25-strata-design.md
T
Claude ed9b2e8c1c Lot 25 : Strata tenu par la façade (LOKI_STRATA=rust)
Port de backend_strata.go (rust/loki-rs/src/strata) : la machine (cartes
par nvidia-smi, Python 3.10+ et venv, RAM totale et disponible, RAM du
moteur Strata en marche, place libre), ce qui y tient et la
recommandation, la configuration de lancement en clair des modèles
installés (placement des experts drop/ram/arena/disk, carte d'aide,
réglages du preset), les réglages d'un modèle installé et l'installation
(job des moteurs : paquet figé vérifié par SHA-256, installeur lancé et
journalisé comme le sinkWriter du Go, preset écrit puis activé par le Go).

Tenu seulement avec LOKI_BACKENDS=rust ; le lancement (loki serve) reste
au Go, qui relaie les routes du tunnel.

Correction du Go : /api/strata/settings décidait « en service » après
avoir écrit les nouveaux réglages, donc jamais pour un réglage changé ;
décidé désormais avant l'écriture, comme SavePresetApplying. Le port suit.

Parité : parity_strata_test.go (crochets de test : release, meminfo,
place libre, action de service) tire du Go un journal rejoué par
tests/strata.rs ; les tests du Go portés dans strata/tests.rs ;
TestFacadeStrata côté Go. Mutations : 71 tuées sur 71.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016tcGfJWefW5kUGoC2wL8cv
2026-10-15 22:43:04 +00:00

5.3 KiB

Lot 25 — Strata tenu par la façade

Contexte

Strata est le deuxième moteur de Loki. Il répartit les experts d'un MoE de 125 B (famille Qwen3.8-Flash-Next) entre VRAM, RAM et disque. Le moteur est le paquet figé publié par AJEAN : les sources et le binaire Linux CUDA 12, vérifiés par SHA-256. Un preset le choisit (ENGINE=strata).

backend_strata.go sert trois routes :

  • /api/strata : la machine (cartes, RAM, disque, Python), ce qui y tient, la recommandation par version et les modèles installés, avec leur configuration de lancement en clair ;
  • /api/strata/settings : les réglages d'un modèle installé. S'il est en service, la configuration est réappliquée et le moteur relancé ;
  • /api/strata/install : un job des moteurs. Il télécharge et vérifie le paquet, lance l'installeur de Strata, écrit le preset et bascule dessus.

Le lancement (loki serve d'un preset Strata) vit aussi dans ce fichier.

Le lot

Avec LOKI_STRATA=rust et LOKI_BACKENDS=rust (expérimental), la façade (rust/loki-rs/src/strata) sert les trois routes :

  • la décision pure (strata/mod.rs) :
    • placement des experts : drop, ram, arena ou disk, selon la RAM disponible, la carte d'appoint et experts.bin ;
    • configuration de lancement : réglages validés, carte d'aide, mode des experts, réglages du preset ;
    • ce qui tient sur la machine, la recommandation, les réglages, les noms ;
  • la machine (strata/api.rs) :
    • cartes via nvidia-smi (la sonde des backends) ;
    • Python 3.10+ et son module venv ;
    • RAM totale et disponible (/proc/meminfo) ;
    • RAM du moteur Strata en marche (arbre du service dans /proc) ;
    • place libre ;
  • l'installation : le job des moteurs. La sortie de l'installeur est découpée en lignes comme le sinkWriter du Go : une barre \r n'est montrée que toutes les 10 s. La bascule finale passe par le Go (/internal/v1/preset/apply, mode switch), qui applique le preset et relance le service.

Sans les backends, loki-rs ne passe pas la variable au Go et Strata reste au Go. Le lancement reste au Go (loki serve, que loki-rs engine serve lui délègue pour un preset Strata).

Côté Go, facade_strata.go relaie à la façade les routes reçues par le tunnel.

Correction du Go

/api/strata/settings décidait si le preset était en service après y avoir écrit les nouveaux réglages. L'empreinte du nouveau contenu ne correspondait alors plus à la configuration active : changer un réglage du modèle en service ne l'appliquait jamais, et le moteur n'était pas relancé. « En service » se décide désormais avant l'écriture, comme dans SavePresetApplying. Le port Rust suit.

Parité

internal/loki/parity_strata_test.go (Linux x86_64) tire du Go un journal rejoué par tests/strata.rs. Pour le tirer, le Go reçoit des crochets de test : strataReleaseBase (variable), meminfoPath, strataDiskFree et serviceActionOSFn. Le journal couvre :

  • la machine :
    • sans carte, nvidia-smi en panne ou vide, carte trop ancienne ou trop petite, carte d'aide trop ancienne ;
    • trois cartes de même VRAM : la plus récente devant (capacité de calcul arrondie au dixième) ;
    • Python absent, en panne, illisible, trop ancien, sans venv ;
    • 16, 47 ou 64 Go de RAM, meminfo sans MemAvailable ;
    • disque presque plein ou juste trop petit (marge de 5 Go), données déjà présentes ;
  • les réglages :
    • GET, corps illisible, preset vide ou avec chemin, preset absent ou llama.cpp ;
    • hors limites, experts inconnus ;
    • preset inactif ; preset actif (appliqué et relancé), et pendant une optimisation ;
  • l'installation :
    • GET, corps illisible, quant inconnu, optimisation en cours ;
    • machine sans carte, modèle qui ne tient pas ;
    • release introuvable, moteur altéré (empreinte) ;
    • installation complète, puis réinstallation (sources déjà là et décompressées, moteur téléchargé périmé retéléchargé) ;
    • installeur en échec, installeur sans configuration ;
  • les modèles installés :
    • détails de lancement du modèle actif et de modèles inactifs (experts sur disque ou en RAM, vision coupée, sans carte d'aide) ;
    • mode du dernier lancement ;
    • experts.bin avec le moteur du paquet ou d'un autre paquet ;
    • RAM juste sous ou au-dessus du seuil du mode hors RAM, mode hors RAM coupé dans le preset ;
    • configuration de lancement disparue ou illisible ;
  • après chaque appel : les actions du service, les clés de la configuration et l'arborescence de presets/ et strata/ (sans le contenu des archives).

Autres tests :

  • les tests du Go (backend_strata_test.go), portés (strata/tests.rs) : configuration de lancement, placement des experts, recommandation, réglages, noms ;
  • la RAM du moteur en marche, le découpage en lignes et les nombres écrits à la Go ;
  • le Go (TestFacadeStrata) : les trois routes partent à la façade, et elles seules.

Mutations

71 mutations du port Rust, toutes tuées (les dix survivantes du premier passage l'ont été par les étapes et les tests ajoutés ci-dessus).

Écarts assumés

  • Les erreurs réseau (release injoignable) gardent le texte de reqwest.
  • Une copie du moteur qui échoue (prebuilt/) ne donne pas exactement le message du Go, qui ouvre la source puis la destination.