diff --git a/README.md b/README.md index 6b5d455..b952bb2 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,15 @@ puis installe et active le modèle en un clic (téléchargement de 66 à 84 Go d `/data/strata`). Le modèle installé devient un preset comme les autres : basculer dessus lance Strata, basculer sur un autre preset revient à llama.cpp. Son engrenage ouvre les réglages propres à Strata (contexte jusqu'à 262 144, -cache KV fp16/8 bits, prédiction MTP, lecture des images, carte d'appoint). +cache KV fp16/8 bits, prédiction MTP, lecture des images, seconde carte). + +La seconde carte a trois réglages : **non utilisée**, **aide aux experts** (le +défaut : elle garde et calcule une part des experts) ou **partage des couches** +(les deux cartes se répartissent les couches du modèle). Le partage est souvent +plus rapide avec deux cartes identiques (+50 % en génération mesuré par un +utilisateur d'AJEAN sur deux RTX 3060) ; sur deux cartes très différentes, +l'aide aux experts reste le meilleur choix. En partage des couches, le mode +« hors RAM » n'est jamais choisi : la seconde carte n'y garde pas d'experts. Depuis le paquet 1.1, la carte d'appoint calcule elle-même ses experts à la lecture des prompts (au lieu de les recopier vers la principale) : les ajouts diff --git a/internal/loki/backend_strata.go b/internal/loki/backend_strata.go index db2c91f..b2249cd 100644 --- a/internal/loki/backend_strata.go +++ b/internal/loki/backend_strata.go @@ -220,7 +220,9 @@ func strataPackHasExpertsBin(args []string) bool { // Pure : la décision se teste en table. func strataResolveExperts(cfg map[string]string, args []string, availGB, helperGB float64) string { binReady := strataPackHasExpertsBin(args) && strataEngineInstalled() == strataEngineAsset - dropReady := binReady && strataHelperOn(cfg) && cfg["STRATA_DROP"] != "0" + // (experts de la carte d'aide hors RAM : propre au mode d'aide, jamais en + // partage des couches, où la seconde carte ne garde pas d'experts) + dropReady := binReady && strataHelperOn(cfg) && !strataLayerSplit(cfg) && cfg["STRATA_DROP"] != "0" arena := strataArenaGB(cfg) switch strings.ToLower(strings.TrimSpace(cfg["STRATA_EXPERTS"])) { case strataExpertsDisk: @@ -504,6 +506,7 @@ type strataDetails struct { // pour les réglages : ce que la machine permet et l'état actuel HasHelper bool `json:"has_helper"` // une carte d'aide est disponible HelperOn bool `json:"helper_on"` + Split bool `json:"split_layers"` // les deux cartes se partagent les couches Vision bool `json:"vision"` } @@ -565,6 +568,7 @@ func strataDetailsFor(presetID string, env strataEnv) *strataDetails { if strataHelperOn(pc) { d.HelperOn = true d.HelperGPU = gpuName(h) + d.Split = strataLayerSplit(pc) } } d.Vision = pc["STRATA_VISION"] != "0" @@ -968,6 +972,16 @@ func strataBuildConfig(base map[string]any, cfg map[string]string, apiKey, mode } helper := strings.TrimSpace(cfg["STRATA_HELPER_GPU"]) hasHelper := strataHelperOn(cfg) + if strataLayerSplit(cfg) { + // Partage des couches : le serveur de Strata le fait de lui-même quand sa + // clé « gpu » liste plusieurs cartes (--layer-split auto, réparti selon la + // VRAM libre), numérotées comme nvidia-smi. Pas de chemin « aide » : la + // réserve de VRAM de l'installeur et l'encodeur d'images restent en place. + main, _ := strconv.Atoi(strings.TrimSpace(cfg["STRATA_MAIN_GPU"])) + second, _ := strconv.Atoi(helper) + out["gpu"] = []any{main, second} + hasHelper = false + } // Deuxième carte en aide : elle garde et CALCULE sa part des experts (le // chemin « helper » du moteur), la carte principale reste CUDA0. Les cartes // sont posées par CUDA_VISIBLE_DEVICES (serveStrata), PAS par la clé « gpu » : @@ -1191,6 +1205,16 @@ func strataHelperOn(cfg map[string]string) bool { return h != "" && h != "-1" && cfg["STRATA_HELPER"] != "0" } +// strataLayerSplit : les deux cartes se partagent les COUCHES du modèle (clé de +// preset STRATA_SPLIT=layers) au lieu que la seconde n'aide que pour une part +// des experts. Mesuré par un utilisateur d'AJEAN sur deux RTX 3060 identiques +// (#121 amont) : la carte d'aide ne travaillait qu'à ~15 %, le partage des +// couches donnait +50 % en génération. Sur deux cartes très différentes, le +// mode d'aide reste le défaut mesuré : le partage est un choix, jamais imposé. +func strataLayerSplit(cfg map[string]string) bool { + return strataHelperOn(cfg) && cfg["STRATA_SPLIT"] == "layers" +} + // strataCudaDevices : ordre des cartes vu par le moteur, la principale en CUDA0. func strataCudaDevices(cfg map[string]string) string { main := strings.TrimSpace(cfg["STRATA_MAIN_GPU"]) @@ -1437,6 +1461,9 @@ type strataSettingsReq struct { Vision bool `json:"vision"` Helper bool `json:"helper"` Experts string `json:"experts"` // auto, ram ou disk ; vide = inchangé + // Split : rôle de la seconde carte, « helper » (aide aux experts) ou + // « layers » (partage des couches). Vide = inchangé (anciens clients). + Split string `json:"split"` } // strataApplySettings réécrit les clés du preset (pure, testable). @@ -1451,6 +1478,8 @@ func strataApplySettings(content string, r strataSettingsReq) (string, error) { return "", fmt.Errorf("MTP hors limites : %d", r.Spec) case r.Experts != "" && r.Experts != strataExpertsAuto && r.Experts != strataExpertsRAM && r.Experts != strataExpertsDisk: return "", fmt.Errorf("placement des experts inconnu : %s", r.Experts) + case r.Split != "" && r.Split != "helper" && r.Split != "layers": + return "", fmt.Errorf("répartition inconnue : %s", r.Split) } set := map[string]string{ "CTX": strconv.Itoa(r.Ctx), "STRATA_KV": r.KV, "STRATA_SPEC": strconv.Itoa(r.Spec), @@ -1461,6 +1490,14 @@ func strataApplySettings(content string, r strataSettingsReq) (string, error) { set["STRATA_EXPERTS"] = r.Experts keys = append(keys, "STRATA_EXPERTS") } + if r.Split != "" { + // « helper » est le défaut : la clé disparaît plutôt que d'être écrite + set["STRATA_SPLIT"] = "" + if r.Split == "layers" { + set["STRATA_SPLIT"] = "layers" + } + keys = append(keys, "STRATA_SPLIT") + } var lines []string for _, l := range strings.Split(strings.TrimRight(content, "\n"), "\n") { k, _, _ := strings.Cut(strings.TrimSpace(l), "=") @@ -1470,6 +1507,9 @@ func strataApplySettings(content string, r strataSettingsReq) (string, error) { lines = append(lines, l) } for _, k := range keys { + if set[k] == "" && k == "STRATA_SPLIT" { + continue + } lines = append(lines, k+"="+set[k]) } return strings.Join(lines, "\n") + "\n", nil diff --git a/internal/loki/backend_strata_split_test.go b/internal/loki/backend_strata_split_test.go new file mode 100644 index 0000000..c3a6904 --- /dev/null +++ b/internal/loki/backend_strata_split_test.go @@ -0,0 +1,124 @@ +package loki + +import ( + "os" + "path/filepath" + "strings" + "testing" +) + +// Partage des couches (#121 amont) : la clé « gpu » liste les deux cartes (le +// serveur de Strata en déduit --layer-split), et rien du mode d'aide ne subsiste. +func TestStrataBuildConfigLayerSplit(t *testing.T) { + base := map[string]any{ + "args": []any{"--pack", "/p", "--vram-reserve-mib", "900"}, + "vision": map[string]any{"exe": "/v"}, + } + cfg := map[string]string{"STRATA_MAIN_GPU": "1", "STRATA_HELPER_GPU": "0", "STRATA_SPLIT": "layers"} + out, err := strataBuildConfig(base, cfg, "", "drop") + if err != nil { + t.Fatal(err) + } + g, ok := out["gpu"].([]any) + if !ok || len(g) != 2 || g[0] != 1 || g[1] != 0 { + t.Fatalf("gpu = %v, attendu [1 0] (principale d'abord, numéros nvidia-smi)", out["gpu"]) + } + a := strataArgs(t, out) + if strataHasArg(a, "--remote-expert-opt") || strataHasArg(a, "--expert-cache-device1") { + t.Errorf("options du mode d'aide en partage des couches : %v", a) + } + if argAfter(a, "--vram-reserve-mib") != "900" { + t.Errorf("la réserve de VRAM de l'installeur doit rester : %v", a) + } + if argAfter(a, "--short-read") != "150" { + t.Errorf("lecture des prompts par la carte d'aide en partage des couches : %v", a) + } + env := out["env"].(map[string]any) + if env["STRATA_REMOTE_DROP"] != nil || env["STRATA_PREFILL_HELPER_SOURCE"] != nil { + t.Errorf("experts hors RAM ou source d'aide (mode d'aide) en partage des couches : %v", env) + } + if _, has := out["vision"].(map[string]any)["cuda_device"]; has { + t.Errorf("encodeur d'images déplacé sur la seconde carte en partage des couches") + } + + // Sans la clé, rien ne change : le mode d'aide reste le défaut. + delete(cfg, "STRATA_SPLIT") + out, _ = strataBuildConfig(base, cfg, "", "drop") + if _, has := out["gpu"]; has { + t.Errorf("clé gpu posée en mode d'aide : %v", out["gpu"]) + } + if !strataHasArg(strataArgs(t, out), "--remote-expert-opt") { + t.Errorf("mode d'aide perdu sans STRATA_SPLIT") + } + // Seconde carte coupée : pas de partage même si la clé traîne. + cfg["STRATA_SPLIT"], cfg["STRATA_HELPER"] = "layers", "0" + if strataLayerSplit(cfg) { + t.Errorf("partage des couches avec la seconde carte coupée") + } +} + +// En partage des couches, la seconde carte ne garde pas d'experts : le mode +// hors RAM (qui compte sur elle pour en loger une part) n'est jamais choisi. +func TestStrataResolveExpertsLayerSplit(t *testing.T) { + home := t.TempDir() + t.Setenv("LOKI_HOME", home) + pack := filepath.Join(home, "pack") + _ = os.MkdirAll(pack, 0o755) + _ = os.WriteFile(filepath.Join(pack, "experts.bin"), []byte("x"), 0o644) + _ = os.MkdirAll(filepath.Join(strataSrcDir(), "engine-cuda12"), 0o755) + _ = os.WriteFile(strataEngineMarker(), []byte(strataEngineAsset+"\n"), 0o644) + args := []string{"--pack", pack} + cfg := map[string]string{"STRATA_CONFIG": "/x/strata-swift-iq3_xxs.json", "STRATA_HELPER_GPU": "1", "STRATA_DROP": "1"} + if got := strataResolveExperts(cfg, args, 44, 12); got != "drop" { + t.Fatalf("mode d'aide : %s, attendu drop", got) + } + cfg["STRATA_SPLIT"] = "layers" + if got := strataResolveExperts(cfg, args, 44, 12); got != "arena" { + t.Errorf("partage des couches : %s, attendu arena", got) + } + cfg["STRATA_EXPERTS"] = "ram" + if got := strataResolveExperts(cfg, args, 44, 12); got != "ram" { + t.Errorf("partage des couches, experts en RAM : %s, attendu ram", got) + } +} + +func TestStrataApplySettingsSplit(t *testing.T) { + in := "ENGINE=strata\nSTRATA_HELPER_GPU=0\n" + req := strataSettingsReq{Ctx: 131072, KV: "fp16", Spec: 3, Vision: true, Helper: true, Split: "layers"} + out, err := strataApplySettings(in, req) + if err != nil || !strings.Contains(out, "STRATA_SPLIT=layers\n") { + t.Fatalf("STRATA_SPLIT=layers attendu : %q (%v)", out, err) + } + req.Split = "helper" + if out, _ = strataApplySettings(out, req); strings.Contains(out, "STRATA_SPLIT") { + t.Errorf("retour au mode d'aide : la clé doit disparaître : %q", out) + } + // un ancien client n'envoie pas « split » : la clé est conservée + req.Split = "" + out, _ = strataApplySettings("STRATA_SPLIT=layers\n", req) + if !strings.Contains(out, "STRATA_SPLIT=layers") { + t.Errorf("clé effacée par un client qui ne la connaît pas : %q", out) + } + req.Split = "nimporte" + if _, err := strataApplySettings(in, req); err == nil { + t.Errorf("répartition inconnue acceptée") + } +} + +func TestStrataDetailsForLayerSplit(t *testing.T) { + home := t.TempDir() + t.Setenv("LOKI_HOME", home) + base := filepath.Join(home, "base.json") + _ = os.WriteFile(base, []byte(`{"args":["--pack","/p"],"vision":{"exe":"v"}}`), 0o644) + _ = os.MkdirAll(presetsDir(), 0o755) + preset := "ENGINE=strata\nSTRATA_CONFIG=" + base + "\nSTRATA_MAIN_GPU=1\nSTRATA_HELPER_GPU=0\nSTRATA_SPLIT=layers\n" + _ = os.WriteFile(filepath.Join(presetsDir(), "X.env"), []byte(preset), 0o644) + env := strataEnv{GPUs: []strataGPU{{Index: 0, Name: "NVIDIA GeForce RTX 3060", VRAMGB: 12}, {Index: 1, Name: "NVIDIA GeForce RTX 3060", VRAMGB: 12}}} + d := strataDetailsFor("X", env) + if d == nil { + t.Fatal("pas de détails") + } + if !d.Split || !d.HelperOn || d.HelperGPU == "" || d.VisionGPU != d.MainGPU || d.ShortRead != "150" { + t.Errorf("%+v", *d) + } +} diff --git a/internal/loki/parity_strata_test.go b/internal/loki/parity_strata_test.go index e97fbe8..c6090b6 100644 --- a/internal/loki/parity_strata_test.go +++ b/internal/loki/parity_strata_test.go @@ -333,7 +333,7 @@ func TestPariteStrata(t *testing.T) { mu.Unlock() st.After = map[string]string{} cfg := ReadConfig() - for _, k := range []string{"ENGINE", "STRATA_CONFIG", "CTX", "STRATA_KV", "STRATA_HELPER"} { + for _, k := range []string{"ENGINE", "STRATA_CONFIG", "CTX", "STRATA_KV", "STRATA_HELPER", "STRATA_SPLIT"} { if v := cfg[k]; v != "" { st.After["config/"+k] = mask(v) } @@ -382,6 +382,10 @@ func TestPariteStrata(t *testing.T) { Method: "POST", Path: "/api/strata/settings", Body: settings("S", 98304, "")}, {Name: "réglages du preset actif pendant une optimisation", Tune: true, Method: "POST", Path: "/api/strata/settings", Body: settings("S", 98304, "")}, + {Name: "réglages, répartition inconnue", Method: "POST", Path: "/api/strata/settings", Body: settings("S", 98304, `,"split":"nimporte"`)}, + {Name: "réglages, partage des couches", Method: "POST", Path: "/api/strata/settings", Body: settings("S", 98304, `,"split":"layers"`)}, + {Name: "réglages d'un ancien client, partage gardé", Method: "POST", Path: "/api/strata/settings", Body: settings("S", 98304, "")}, + {Name: "réglages, retour à l'aide aux experts", Method: "POST", Path: "/api/strata/settings", Body: settings("S", 98304, `,"split":"helper"`)}, // Installation. {Name: "installation en GET", Method: "GET", Path: "/api/strata/install"}, @@ -417,6 +421,11 @@ func TestPariteStrata(t *testing.T) { "STRATA_CONFIG={{HOME}}/strata/" + srcDir + "/strata-swift-iq3_xxs.json\nSTRATA_MAIN_GPU=1\nSTRATA_HELPER_GPU=0\n" + "STRATA_VISION=1\nSTRATA_EXPERTS=auto\nSTRATA_DROP=1\nSTRATA_KV=fp16\nSTRATA_KV_RESIDENT=32768\nSTRATA_SPEC=3\nCTX=196608\nREASONING=off\n", }, Method: "GET", Path: "/api/strata"}, + {Name: "seconde carte en partage des couches", Files: map[string]string{ + "presets/STRATA FLASH NEXT SWIFT 1.5 IQ3_XXS.env": "# NAME=Qwen3.8 Flash Next Swift 1.5 IQ3_XXS (Strata)\nENGINE=strata\n" + + "STRATA_CONFIG={{HOME}}/strata/" + srcDir + "/strata-swift-iq3_xxs.json\nSTRATA_MAIN_GPU=1\nSTRATA_HELPER_GPU=0\n" + + "STRATA_VISION=1\nSTRATA_EXPERTS=auto\nSTRATA_DROP=1\nSTRATA_KV=fp16\nSTRATA_KV_RESIDENT=32768\nSTRATA_SPEC=3\nCTX=196608\nREASONING=off\nSTRATA_SPLIT=layers\n", + }, Method: "GET", Path: "/api/strata"}, {Name: "mode hors RAM coupé dans le preset", Files: map[string]string{ "presets/STRATA FLASH NEXT SWIFT 1.5 IQ3_XXS.env": "# NAME=Qwen3.8 Flash Next Swift 1.5 IQ3_XXS (Strata)\nENGINE=strata\n" + "STRATA_CONFIG={{HOME}}/strata/" + srcDir + "/strata-swift-iq3_xxs.json\nSTRATA_MAIN_GPU=1\nSTRATA_HELPER_GPU=0\n" + diff --git a/internal/loki/ui/index.html b/internal/loki/ui/index.html index 7a37f61..872336f 100644 --- a/internal/loki/ui/index.html +++ b/internal/loki/ui/index.html @@ -4521,6 +4521,7 @@ async function loadCfg(){ rows.push(row('CTX', d.ctx)); rows.push(row('KV', d.kv+(d.kv_resident ? ' · '+k(d.kv_resident)+' VRAM' : ''))); rows.push(row('MTP', d.spec)); + if(d.helper_gpu) rows.push(row('GPU 2', d.split_layers ? 'couches' : 'aide', d.helper_gpu)); rows.push(row('EXPERTS', ({drop:'mlock (hors appoint)', ram:'RAM', arena:'experts.bin', disk:'mmap (disque)'})[d.mode] || (d.mmap ? 'mmap' : 'RAM'), d.mode_label||'')); if(d.vision_gpu) rows.push(row('VISION', 'on', d.vision_gpu)); }else if(c.CTX) rows.push(row('CTX', c.CTX)); @@ -9281,7 +9282,11 @@ function strataRenderSettings(fit){ ['Experts', sel('strata-s-experts', [['auto','auto (selon la RAM libre)'],['ram','en RAM (le plus rapide)'],['disk','depuis le disque (mmap, économe)']], d.experts||'auto')], ['Lire les images', sw('strata-s-vision', d.vision)], ]; - if(d.has_helper) rows.push(["Carte d'appoint", sw('strata-s-helper', d.helper_on)]); + // Seconde carte : aide aux experts (défaut mesuré) ou partage des couches, + // souvent plus rapide avec deux cartes identiques (#121 d'AJEAN). + if(d.has_helper) rows.push(['Seconde carte', sel('strata-s-helper', + [['off', 'non utilisée'], ['helper', 'aide aux experts'], ['layers', 'partage des couches']], + !d.helper_on ? 'off' : d.split_layers ? 'layers' : 'helper')]); document.getElementById('strata-settings').innerHTML = rows.map(([a,b])=> '
'+escHtml(a)+''+b+'
').join(''); strataCtxLbl(); @@ -9301,8 +9306,11 @@ async function strataSaveSettings(){ if(!fit || !fit.preset) return; const v = id => document.getElementById(id); const body = {preset: fit.preset, ctx: +v('strata-s-ctx').value, kv: v('strata-s-kv').value, spec: +v('strata-s-spec').value, - vision: v('strata-s-vision').checked, helper: v('strata-s-helper') ? v('strata-s-helper').checked : false, + vision: v('strata-s-vision').checked, experts: v('strata-s-experts') ? v('strata-s-experts').value : ''}; + const second = v('strata-s-helper') ? v('strata-s-helper').value : 'off'; + body.helper = second !== 'off'; + if(body.helper) body.split = second; if(fit.active && !await askConfirm('Le modèle va redémarrer avec ces réglages (quelques minutes).', {title:'Strata — Qwen3.8 Flash Next', okText:'Enregistrer'})) return; const r = await jpost('/api/strata/settings', body); if(!r.ok){ toast('Erreur : '+(r.error||'')); return; } @@ -9321,7 +9329,7 @@ function strataRenderDetails(fit){ const k = n => (+n >= 1024 ? Math.round(+n/1024)+'K' : n); const rows = [ ['Carte principale', d.main_gpu], - ["Carte d'appoint", d.helper_gpu || 'aucune'], + ['Seconde carte', d.helper_gpu ? d.helper_gpu + (d.split_layers ? ' · partage des couches' : ' · aide aux experts') : 'aucune'], ['Lecture des images', d.vision_gpu || 'aucune'], ['Contexte', (+d.ctx).toLocaleString('fr-FR')+' jetons'], ['Cache KV', d.kv + (d.kv_resident ? ' · '+k(d.kv_resident)+' en VRAM, le reste en RAM' : '')], diff --git a/internal/loki/ui/src/js/05-status.js b/internal/loki/ui/src/js/05-status.js index 33bdd4b..314d4bc 100644 --- a/internal/loki/ui/src/js/05-status.js +++ b/internal/loki/ui/src/js/05-status.js @@ -330,6 +330,7 @@ async function loadCfg(){ rows.push(row('CTX', d.ctx)); rows.push(row('KV', d.kv+(d.kv_resident ? ' · '+k(d.kv_resident)+' VRAM' : ''))); rows.push(row('MTP', d.spec)); + if(d.helper_gpu) rows.push(row('GPU 2', d.split_layers ? 'couches' : 'aide', d.helper_gpu)); rows.push(row('EXPERTS', ({drop:'mlock (hors appoint)', ram:'RAM', arena:'experts.bin', disk:'mmap (disque)'})[d.mode] || (d.mmap ? 'mmap' : 'RAM'), d.mode_label||'')); if(d.vision_gpu) rows.push(row('VISION', 'on', d.vision_gpu)); }else if(c.CTX) rows.push(row('CTX', c.CTX)); diff --git a/internal/loki/ui/src/js/10b-strata.js b/internal/loki/ui/src/js/10b-strata.js index 4e7dc6e..361ee20 100644 --- a/internal/loki/ui/src/js/10b-strata.js +++ b/internal/loki/ui/src/js/10b-strata.js @@ -128,7 +128,11 @@ function strataRenderSettings(fit){ ['Experts', sel('strata-s-experts', [['auto','auto (selon la RAM libre)'],['ram','en RAM (le plus rapide)'],['disk','depuis le disque (mmap, économe)']], d.experts||'auto')], ['Lire les images', sw('strata-s-vision', d.vision)], ]; - if(d.has_helper) rows.push(["Carte d'appoint", sw('strata-s-helper', d.helper_on)]); + // Seconde carte : aide aux experts (défaut mesuré) ou partage des couches, + // souvent plus rapide avec deux cartes identiques (#121 d'AJEAN). + if(d.has_helper) rows.push(['Seconde carte', sel('strata-s-helper', + [['off', 'non utilisée'], ['helper', 'aide aux experts'], ['layers', 'partage des couches']], + !d.helper_on ? 'off' : d.split_layers ? 'layers' : 'helper')]); document.getElementById('strata-settings').innerHTML = rows.map(([a,b])=> '
'+escHtml(a)+''+b+'
').join(''); strataCtxLbl(); @@ -148,8 +152,11 @@ async function strataSaveSettings(){ if(!fit || !fit.preset) return; const v = id => document.getElementById(id); const body = {preset: fit.preset, ctx: +v('strata-s-ctx').value, kv: v('strata-s-kv').value, spec: +v('strata-s-spec').value, - vision: v('strata-s-vision').checked, helper: v('strata-s-helper') ? v('strata-s-helper').checked : false, + vision: v('strata-s-vision').checked, experts: v('strata-s-experts') ? v('strata-s-experts').value : ''}; + const second = v('strata-s-helper') ? v('strata-s-helper').value : 'off'; + body.helper = second !== 'off'; + if(body.helper) body.split = second; if(fit.active && !await askConfirm('Le modèle va redémarrer avec ces réglages (quelques minutes).', {title:'Strata — Qwen3.8 Flash Next', okText:'Enregistrer'})) return; const r = await jpost('/api/strata/settings', body); if(!r.ok){ toast('Erreur : '+(r.error||'')); return; } @@ -168,7 +175,7 @@ function strataRenderDetails(fit){ const k = n => (+n >= 1024 ? Math.round(+n/1024)+'K' : n); const rows = [ ['Carte principale', d.main_gpu], - ["Carte d'appoint", d.helper_gpu || 'aucune'], + ['Seconde carte', d.helper_gpu ? d.helper_gpu + (d.split_layers ? ' · partage des couches' : ' · aide aux experts') : 'aucune'], ['Lecture des images', d.vision_gpu || 'aucune'], ['Contexte', (+d.ctx).toLocaleString('fr-FR')+' jetons'], ['Cache KV', d.kv + (d.kv_resident ? ' · '+k(d.kv_resident)+' en VRAM, le reste en RAM' : '')], diff --git a/rust/loki-rs/src/strata/api.rs b/rust/loki-rs/src/strata/api.rs index 035764c..bc468a6 100644 --- a/rust/loki-rs/src/strata/api.rs +++ b/rust/loki-rs/src/strata/api.rs @@ -345,7 +345,7 @@ impl Strata { "mmap": mode == "disk" || mode == "arena", "drop": mode == "drop", "experts": experts, "mode_label": experts_label(&mode), "mode": mode, "main_gpu": main_gpu, - "has_helper": false, "helper_on": false, + "has_helper": false, "helper_on": false, "split_layers": false, }); let kvr = val("--kv-resident"); if !kvr.is_empty() { @@ -356,6 +356,7 @@ impl Strata { d["has_helper"] = json!(true); if helper_on(&pc) { d["helper_on"] = json!(true); + d["split_layers"] = json!(layer_split(&pc)); let hg = gpu_name(h); if !hg.is_empty() { d["helper_gpu"] = json!(hg); @@ -825,6 +826,7 @@ pub async fn serve( ("vision", Kind::Bool), ("helper", Kind::Bool), ("experts", Kind::Str), + ("split", Kind::Str), ], ); if let Some(e) = d.err.clone() { @@ -838,6 +840,7 @@ pub async fn serve( vision: d.bool("vision"), helper: d.bool("helper"), experts: d.str("experts"), + split: d.str("split"), }; if r.preset.contains(['/', '\\']) || r.preset.is_empty() { return fail(StatusCode::BAD_REQUEST, "preset invalide"); diff --git a/rust/loki-rs/src/strata/mod.rs b/rust/loki-rs/src/strata/mod.rs index d194674..25d347d 100644 --- a/rust/loki-rs/src/strata/mod.rs +++ b/rust/loki-rs/src/strata/mod.rs @@ -287,6 +287,13 @@ pub fn helper_on(cfg: &Cfg) -> bool { !h.is_empty() && h != "-1" && cfg_get(cfg, "STRATA_HELPER") != "0" } +/// `strataLayerSplit` : les deux cartes se partagent les couches +/// (`STRATA_SPLIT=layers`) au lieu que la seconde n'aide que pour une part +/// des experts. Un choix, jamais imposé : le mode d'aide reste le défaut. +pub fn layer_split(cfg: &Cfg) -> bool { + helper_on(cfg) && cfg_get(cfg, "STRATA_SPLIT") == "layers" +} + /// `strataResolveExperts` : le mode lancé (drop, ram, arena, disk), d'après /// le choix du preset et la RAM disponible. pub fn resolve_experts( @@ -297,7 +304,9 @@ pub fn resolve_experts( helper_gb: f64, ) -> &'static str { let bin_ready = pack_has_experts_bin(args) && paths.engine_installed() == ENGINE_ASSET; - let drop_ready = bin_ready && helper_on(cfg) && cfg_get(cfg, "STRATA_DROP") != "0"; + // (jamais en partage des couches : la seconde carte n'y garde pas d'experts) + let drop_ready = + bin_ready && helper_on(cfg) && !layer_split(cfg) && cfg_get(cfg, "STRATA_DROP") != "0"; let arena = arena_gb(cfg); match cfg_get(cfg, "STRATA_EXPERTS") .trim() @@ -411,7 +420,18 @@ pub fn build_config(base: &Value, cfg: &Cfg, api_key: &str, mode: &str) -> Resul args = set_arg(args, flag, v); } let helper = cfg_get(cfg, "STRATA_HELPER_GPU").trim(); - let has_helper = helper_on(cfg); + let mut has_helper = helper_on(cfg); + if layer_split(cfg) { + // Partage des couches : la clé « gpu » liste les deux cartes (numéros + // nvidia-smi), le serveur de Strata en déduit --layer-split. + let main = cfg_get(cfg, "STRATA_MAIN_GPU") + .trim() + .parse::() + .unwrap_or(0); + let second = helper.parse::().unwrap_or(0); + out.insert("gpu".into(), json!([main, second])); + has_helper = false; + } if has_helper { args = set_arg(args, "--expert-cache-device1", "auto"); if !has_arg(&args, "--remote-expert-opt") { @@ -788,6 +808,8 @@ pub struct SettingsReq { pub vision: bool, pub helper: bool, pub experts: String, + /// « helper » ou « layers » ; vide = inchangé (anciens clients). + pub split: String, } /// `strataApplySettings` : réécrit les clés du preset. Pure. @@ -808,6 +830,9 @@ pub fn apply_settings(content: &str, r: &SettingsReq) -> Result { return Err(format!("placement des experts inconnu : {}", r.experts)); } + if !r.split.is_empty() && r.split != "helper" && r.split != "layers" { + return Err(format!("répartition inconnue : {}", r.split)); + } let mut set: Vec<(&str, String)> = vec![ ("CTX", r.ctx.to_string()), ("STRATA_KV", r.kv.clone()), @@ -818,6 +843,11 @@ pub fn apply_settings(content: &str, r: &SettingsReq) -> Result if !r.experts.is_empty() { set.push(("STRATA_EXPERTS", r.experts.clone())); } + if !r.split.is_empty() { + // « helper » est le défaut : la clé disparaît plutôt que d'être écrite + let v = if r.split == "layers" { "layers" } else { "" }; + set.push(("STRATA_SPLIT", v.into())); + } let mut lines: Vec = Vec::new(); for l in content.trim_end_matches('\n').split('\n') { let k = l.trim().split_once('=').map_or(l.trim(), |(k, _)| k); @@ -827,6 +857,9 @@ pub fn apply_settings(content: &str, r: &SettingsReq) -> Result lines.push(l.to_string()); } for (k, v) in set { + if k == "STRATA_SPLIT" && v.is_empty() { + continue; + } lines.push(format!("{k}={v}")); } Ok(lines.join("\n") + "\n") diff --git a/rust/loki-rs/src/strata/tests.rs b/rust/loki-rs/src/strata/tests.rs index d1552d2..1494078 100644 --- a/rust/loki-rs/src/strata/tests.rs +++ b/rust/loki-rs/src/strata/tests.rs @@ -405,6 +405,89 @@ fn hors_ram_reserve_et_contexte() { } } +// `TestStrataBuildConfigLayerSplit`. +#[test] +fn partage_des_couches() { + let base = json!({ + "args": ["--pack", "/p", "--vram-reserve-mib", "900"], + "vision": { "exe": "/v" }, + }); + let mut c = cfg(&[ + ("STRATA_MAIN_GPU", "1"), + ("STRATA_HELPER_GPU", "0"), + ("STRATA_SPLIT", "layers"), + ]); + let out = build_config(&base, &c, "", "drop").unwrap(); + assert_eq!(out["gpu"], json!([1, 0])); + let a = args_of(&out); + assert!(!has_arg(&a, "--remote-expert-opt") && !has_arg(&a, "--expert-cache-device1")); + assert_eq!(arg_after(&a, "--vram-reserve-mib"), "900"); + assert_eq!(arg_after(&a, "--short-read"), "150"); + assert!(out["env"].get("STRATA_REMOTE_DROP").is_none()); + assert!(out["env"].get("STRATA_PREFILL_HELPER_SOURCE").is_none()); + assert!(out["vision"].get("cuda_device").is_none()); + c.remove("STRATA_SPLIT"); + let out = build_config(&base, &c, "", "drop").unwrap(); + assert!(out.get("gpu").is_none()); + assert!(has_arg(&args_of(&out), "--remote-expert-opt")); + c.insert("STRATA_SPLIT".into(), "layers".into()); + c.insert("STRATA_HELPER".into(), "0".into()); + assert!(!layer_split(&c)); +} + +// `TestStrataResolveExpertsLayerSplit`. +#[test] +fn partage_des_couches_sans_hors_ram() { + let d = tempfile::tempdir().unwrap(); + let p = Paths { + home: d.path().to_path_buf(), + }; + let pack = d.path().join("pack"); + std::fs::create_dir_all(&pack).unwrap(); + std::fs::write(pack.join("experts.bin"), "x").unwrap(); + std::fs::create_dir_all(p.src_dir().join("engine-cuda12")).unwrap(); + std::fs::write(p.engine_marker(), format!("{ENGINE_ASSET}\n")).unwrap(); + let args = vec!["--pack".to_string(), pack.to_string_lossy().into_owned()]; + let mut c = cfg(&[ + ("STRATA_CONFIG", "/x/strata-swift-iq3_xxs.json"), + ("STRATA_HELPER_GPU", "1"), + ("STRATA_DROP", "1"), + ]); + assert_eq!(resolve_experts(&p, &c, &args, 44.0, 12.0), "drop"); + c.insert("STRATA_SPLIT".into(), "layers".into()); + assert_eq!(resolve_experts(&p, &c, &args, 44.0, 12.0), "arena"); + c.insert("STRATA_EXPERTS".into(), "ram".into()); + assert_eq!(resolve_experts(&p, &c, &args, 44.0, 12.0), "ram"); +} + +// `TestStrataApplySettingsSplit`. +#[test] +fn reglages_de_la_seconde_carte() { + let input = "ENGINE=strata\nSTRATA_HELPER_GPU=0\n"; + let mut r = SettingsReq { + ctx: 131072, + kv: "fp16".into(), + spec: 3, + vision: true, + helper: true, + split: "layers".into(), + ..SettingsReq::default() + }; + let out = apply_settings(input, &r).unwrap(); + assert!(out.contains("STRATA_SPLIT=layers\n"), "{out:?}"); + r.split = "helper".into(); + let out = apply_settings(&out, &r).unwrap(); + assert!(!out.contains("STRATA_SPLIT"), "{out:?}"); + r.split = String::new(); + let out = apply_settings("STRATA_SPLIT=layers\n", &r).unwrap(); + assert!(out.contains("STRATA_SPLIT=layers"), "{out:?}"); + r.split = "nimporte".into(); + assert_eq!( + apply_settings(input, &r).unwrap_err(), + "répartition inconnue : nimporte" + ); +} + #[test] fn reglages_des_experts() { let input = "ENGINE=strata\nSTRATA_EXPERTS=auto\n"; diff --git a/rust/loki-rs/tests/parity_bench/bench.json b/rust/loki-rs/tests/parity_bench/bench.json index 722abf0..107d753 100644 --- a/rust/loki-rs/tests/parity_bench/bench.json +++ b/rust/loki-rs/tests/parity_bench/bench.json @@ -231,8 +231,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 }, @@ -304,7 +304,7 @@ "max_tokens": 300, "messages": [ { - "content": "<8129 octets a3e9aa90e552>", + "content": "<8102 octets f67301f37ff4>", "role": "user" } ], @@ -335,8 +335,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -358,8 +358,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -387,8 +387,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -410,8 +410,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -433,8 +433,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -542,8 +542,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 }, @@ -615,7 +615,7 @@ "max_tokens": 300, "messages": [ { - "content": "<8129 octets a3e9aa90e552>", + "content": "<8102 octets f67301f37ff4>", "role": "user" } ], @@ -855,8 +855,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -947,8 +947,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -993,8 +993,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 }, @@ -1066,7 +1066,7 @@ "max_tokens": 300, "messages": [ { - "content": "<8129 octets a3e9aa90e552>", + "content": "<8102 octets f67301f37ff4>", "role": "user" } ], @@ -1103,8 +1103,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -1132,8 +1132,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -1241,8 +1241,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 }, @@ -1314,7 +1314,7 @@ "max_tokens": 300, "messages": [ { - "content": "<8129 octets a3e9aa90e552>", + "content": "<8102 octets f67301f37ff4>", "role": "user" } ], @@ -1554,8 +1554,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -1646,8 +1646,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -1686,8 +1686,8 @@ "predicted_ms": 81920, "predicted_n": 4096, "predicted_per_second": 50, - "prompt_ms": 16401.5, - "prompt_n": 32803, + "prompt_ms": 16403, + "prompt_n": 32806, "prompt_per_second": 2000, "protocol": 2 }, @@ -1759,7 +1759,7 @@ "max_tokens": 4096, "messages": [ { - "content": "<131199 octets aa7e053a18e5>", + "content": "<131211 octets 96987502f054>", "role": "user" } ], @@ -1790,8 +1790,8 @@ "predicted_ms": 81920, "predicted_n": 4096, "predicted_per_second": 50, - "prompt_ms": 16401.5, - "prompt_n": 32803, + "prompt_ms": 16403, + "prompt_n": 32806, "prompt_per_second": 2000, "protocol": 2 } @@ -1813,8 +1813,8 @@ "predicted_ms": 81920, "predicted_n": 4096, "predicted_per_second": 50, - "prompt_ms": 16401.5, - "prompt_n": 32803, + "prompt_ms": 16403, + "prompt_n": 32806, "prompt_per_second": 2000, "protocol": 2 } @@ -2093,7 +2093,7 @@ "max_tokens": 16, "messages": [ { - "content": "<3740 octets 48e62bdc3898>", + "content": "<3743 octets 302346ae5a44>", "role": "user" } ], @@ -2187,8 +2187,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 }, @@ -2260,7 +2260,7 @@ "max_tokens": 300, "messages": [ { - "content": "<8129 octets a3e9aa90e552>", + "content": "<8102 octets f67301f37ff4>", "role": "user" } ], @@ -2291,8 +2291,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -2314,8 +2314,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -2420,8 +2420,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -2443,8 +2443,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -2541,7 +2541,7 @@ "max_tokens": 300, "messages": [ { - "content": "<8129 octets a3e9aa90e552>", + "content": "<8102 octets f67301f37ff4>", "role": "user" } ], @@ -2572,8 +2572,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -2595,8 +2595,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -2693,7 +2693,7 @@ "max_tokens": 300, "messages": [ { - "content": "<8129 octets a3e9aa90e552>", + "content": "<8102 octets f67301f37ff4>", "role": "user" } ], @@ -2747,8 +2747,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -2770,8 +2770,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -2868,7 +2868,7 @@ "max_tokens": 300, "messages": [ { - "content": "<8129 octets a3e9aa90e552>", + "content": "<8102 octets f67301f37ff4>", "role": "user" } ], @@ -2992,8 +2992,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -3015,8 +3015,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -3121,8 +3121,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -3144,8 +3144,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -3189,8 +3189,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 }, @@ -3287,7 +3287,7 @@ "max_tokens": 300, "messages": [ { - "content": "<8129 octets a3e9aa90e552>", + "content": "<8102 octets f67301f37ff4>", "role": "user" } ], @@ -3319,8 +3319,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -3342,8 +3342,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -3383,8 +3383,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 }, @@ -3457,7 +3457,7 @@ "max_tokens": 300, "messages": [ { - "content": "<8129 octets a3e9aa90e552>", + "content": "<8102 octets f67301f37ff4>", "role": "user" } ], @@ -3489,8 +3489,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -3512,8 +3512,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -3579,8 +3579,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 }, @@ -3652,7 +3652,7 @@ "max_tokens": 300, "messages": [ { - "content": "<8129 octets a3e9aa90e552>", + "content": "<8102 octets f67301f37ff4>", "role": "user" } ], @@ -3737,8 +3737,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -3760,8 +3760,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -3867,7 +3867,7 @@ "max_tokens": 300, "messages": [ { - "content": "<8129 octets a3e9aa90e552>", + "content": "<8102 octets f67301f37ff4>", "role": "user" } ], @@ -3952,8 +3952,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -3975,8 +3975,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -4034,8 +4034,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -4057,8 +4057,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -4089,8 +4089,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -4112,8 +4112,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } @@ -4135,8 +4135,8 @@ "predicted_ms": 6000, "predicted_n": 300, "predicted_per_second": 50, - "prompt_ms": 1018, - "prompt_n": 2036, + "prompt_ms": 1014.5, + "prompt_n": 2029, "prompt_per_second": 2000, "protocol": 2 } diff --git a/rust/loki-rs/tests/parity_strata/strata.json b/rust/loki-rs/tests/parity_strata/strata.json index 3abe10b..3213ed7 100644 --- a/rust/loki-rs/tests/parity_strata/strata.json +++ b/rust/loki-rs/tests/parity_strata/strata.json @@ -3006,6 +3006,126 @@ "f strata/data/models/swift-IQ3_XXS/a.gguf -rw-r--r-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ] }, + { + "name": "réglages, répartition inconnue", + "method": "POST", + "path": "/api/strata/settings", + "body": "{\"preset\":\"S\",\"ctx\":98304,\"kv\":\"int8\",\"spec\":4,\"vision\":false,\"helper\":true,\"split\":\"nimporte\"}", + "status": 400, + "out": { + "error": "répartition inconnue : nimporte", + "ok": false + }, + "actions": [], + "after": { + "config/CTX": "98304", + "config/ENGINE": "strata", + "config/STRATA_HELPER": "1", + "config/STRATA_KV": "int8" + }, + "tree": [ + "d presets", + "d strata", + "d strata/data", + "d strata/data/models", + "d strata/data/models/swift-IQ3_XXS", + "f presets/S.env -rw-r--r-- # NAME=Strata S\nENGINE=strata\nSTRATA_HELPER_GPU=0\nSTRATA_EXPERTS=disk\nCTX=98304\nSTRATA_KV=int8\nSTRATA_SPEC=4\nSTRATA_VISION=0\nSTRATA_HELPER=1\n", + "f presets/llama.env -rw-r--r-- MODEL=/m.gguf\n", + "f strata/data/models/swift-IQ3_XXS/a.gguf -rw-r--r-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + ] + }, + { + "name": "réglages, partage des couches", + "method": "POST", + "path": "/api/strata/settings", + "body": "{\"preset\":\"S\",\"ctx\":98304,\"kv\":\"int8\",\"spec\":4,\"vision\":false,\"helper\":true,\"split\":\"layers\"}", + "status": 200, + "out": { + "ok": true, + "restarted": true + }, + "actions": [ + "restart" + ], + "after": { + "config/CTX": "98304", + "config/ENGINE": "strata", + "config/STRATA_HELPER": "1", + "config/STRATA_KV": "int8", + "config/STRATA_SPLIT": "layers" + }, + "tree": [ + "d presets", + "d strata", + "d strata/data", + "d strata/data/models", + "d strata/data/models/swift-IQ3_XXS", + "f presets/S.env -rw-r--r-- # NAME=Strata S\nENGINE=strata\nSTRATA_HELPER_GPU=0\nSTRATA_EXPERTS=disk\nCTX=98304\nSTRATA_KV=int8\nSTRATA_SPEC=4\nSTRATA_VISION=0\nSTRATA_HELPER=1\nSTRATA_SPLIT=layers\n", + "f presets/llama.env -rw-r--r-- MODEL=/m.gguf\n", + "f strata/data/models/swift-IQ3_XXS/a.gguf -rw-r--r-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + ] + }, + { + "name": "réglages d'un ancien client, partage gardé", + "method": "POST", + "path": "/api/strata/settings", + "body": "{\"preset\":\"S\",\"ctx\":98304,\"kv\":\"int8\",\"spec\":4,\"vision\":false,\"helper\":true}", + "status": 200, + "out": { + "ok": true, + "restarted": true + }, + "actions": [ + "restart" + ], + "after": { + "config/CTX": "98304", + "config/ENGINE": "strata", + "config/STRATA_HELPER": "1", + "config/STRATA_KV": "int8", + "config/STRATA_SPLIT": "layers" + }, + "tree": [ + "d presets", + "d strata", + "d strata/data", + "d strata/data/models", + "d strata/data/models/swift-IQ3_XXS", + "f presets/S.env -rw-r--r-- # NAME=Strata S\nENGINE=strata\nSTRATA_HELPER_GPU=0\nSTRATA_EXPERTS=disk\nSTRATA_SPLIT=layers\nCTX=98304\nSTRATA_KV=int8\nSTRATA_SPEC=4\nSTRATA_VISION=0\nSTRATA_HELPER=1\n", + "f presets/llama.env -rw-r--r-- MODEL=/m.gguf\n", + "f strata/data/models/swift-IQ3_XXS/a.gguf -rw-r--r-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + ] + }, + { + "name": "réglages, retour à l'aide aux experts", + "method": "POST", + "path": "/api/strata/settings", + "body": "{\"preset\":\"S\",\"ctx\":98304,\"kv\":\"int8\",\"spec\":4,\"vision\":false,\"helper\":true,\"split\":\"helper\"}", + "status": 200, + "out": { + "ok": true, + "restarted": true + }, + "actions": [ + "restart" + ], + "after": { + "config/CTX": "98304", + "config/ENGINE": "strata", + "config/STRATA_HELPER": "1", + "config/STRATA_KV": "int8" + }, + "tree": [ + "d presets", + "d strata", + "d strata/data", + "d strata/data/models", + "d strata/data/models/swift-IQ3_XXS", + "f presets/S.env -rw-r--r-- # NAME=Strata S\nENGINE=strata\nSTRATA_HELPER_GPU=0\nSTRATA_EXPERTS=disk\nCTX=98304\nSTRATA_KV=int8\nSTRATA_SPEC=4\nSTRATA_VISION=0\nSTRATA_HELPER=1\n", + "f presets/llama.env -rw-r--r-- MODEL=/m.gguf\n", + "f strata/data/models/swift-IQ3_XXS/a.gguf -rw-r--r-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + ] + }, { "name": "installation en GET", "method": "GET", @@ -3529,6 +3649,7 @@ "prefill": "16384", "short_read": "48", "spec": "3", + "split_layers": false, "version": "1.1", "vision": true, "vision_gpu": "RTX 3070 (8 Go)" @@ -3731,6 +3852,7 @@ "prefill": "16384", "short_read": "48", "spec": "3", + "split_layers": false, "version": "1.1", "vision": true, "vision_gpu": "RTX 3070 (8 Go)" @@ -3775,6 +3897,7 @@ "prefill": "16384", "short_read": "150", "spec": "4", + "split_layers": false, "version": "1.1", "vision": false }, @@ -3806,6 +3929,7 @@ "prefill": "16384", "short_read": "150", "spec": "4", + "split_layers": false, "version": "1.1", "vision": true, "vision_gpu": "RTX 5060 Ti (16 Go)" @@ -3975,6 +4099,7 @@ "prefill": "16384", "short_read": "48", "spec": "3", + "split_layers": false, "version": "1.1", "vision": true, "vision_gpu": "RTX 3070 (8 Go)" @@ -4019,6 +4144,7 @@ "prefill": "16384", "short_read": "150", "spec": "4", + "split_layers": false, "version": "1.1", "vision": false }, @@ -4050,6 +4176,7 @@ "prefill": "16384", "short_read": "150", "spec": "4", + "split_layers": false, "version": "1.1", "vision": true, "vision_gpu": "RTX 5060 Ti (16 Go)" @@ -4215,6 +4342,7 @@ "prefill": "16384", "short_read": "48", "spec": "3", + "split_layers": false, "version": "1.1", "vision": true, "vision_gpu": "RTX 3070 (8 Go)" @@ -4259,6 +4387,7 @@ "prefill": "16384", "short_read": "150", "spec": "4", + "split_layers": false, "version": "1.1", "vision": false }, @@ -4290,6 +4419,7 @@ "prefill": "16384", "short_read": "150", "spec": "4", + "split_layers": false, "version": "1.1", "vision": true, "vision_gpu": "RTX 5060 Ti (16 Go)" @@ -4455,6 +4585,7 @@ "prefill": "16384", "short_read": "48", "spec": "3", + "split_layers": false, "version": "1.1", "vision": true, "vision_gpu": "RTX 3070 (8 Go)" @@ -4499,6 +4630,7 @@ "prefill": "16384", "short_read": "150", "spec": "4", + "split_layers": false, "version": "1.1", "vision": false }, @@ -4530,6 +4662,7 @@ "prefill": "16384", "short_read": "150", "spec": "4", + "split_layers": false, "version": "1.1", "vision": true, "vision_gpu": "RTX 5060 Ti (16 Go)" @@ -4696,6 +4829,7 @@ "prefill": "16384", "short_read": "48", "spec": "3", + "split_layers": false, "version": "1.1", "vision": true, "vision_gpu": "RTX 3070 (8 Go)" @@ -4740,6 +4874,7 @@ "prefill": "16384", "short_read": "150", "spec": "4", + "split_layers": false, "version": "1.1", "vision": false }, @@ -4771,6 +4906,7 @@ "prefill": "16384", "short_read": "150", "spec": "4", + "split_layers": false, "version": "1.1", "vision": true, "vision_gpu": "RTX 5060 Ti (16 Go)" @@ -4870,6 +5006,250 @@ "f strata/prebuilt/strata-linux-x64-cuda12.zip" ] }, + { + "name": "seconde carte en partage des couches", + "files": { + "presets/STRATA FLASH NEXT SWIFT 1.5 IQ3_XXS.env": "# NAME=Qwen3.8 Flash Next Swift 1.5 IQ3_XXS (Strata)\nENGINE=strata\nSTRATA_CONFIG={{HOME}}/strata/ajean-moe-1.1/strata-swift-iq3_xxs.json\nSTRATA_MAIN_GPU=1\nSTRATA_HELPER_GPU=0\nSTRATA_VISION=1\nSTRATA_EXPERTS=auto\nSTRATA_DROP=1\nSTRATA_KV=fp16\nSTRATA_KV_RESIDENT=32768\nSTRATA_SPEC=3\nCTX=196608\nREASONING=off\nSTRATA_SPLIT=layers\n" + }, + "method": "GET", + "path": "/api/strata", + "status": 200, + "out": { + "active": true, + "env": { + "avail_gb": 45.500000256, + "disk_free_gb": 400, + "gpus": [ + { + "arch": 86, + "index": 0, + "name": "NVIDIA GeForce RTX 3070", + "vram_gb": 8 + }, + { + "arch": 120, + "index": 1, + "name": "NVIDIA GeForce RTX 5060 Ti", + "vram_gb": 15.9287109375 + } + ], + "helper": 0, + "main": 1, + "python": "3.12", + "ram_gb": 47, + "supported": true + }, + "families": [ + { + "about": "réfléchit moins, répond plus vite", + "fits": [ + { + "disk_gb": 68, + "drop": false, + "mmap": false, + "ok": true, + "quant": { + "about": "un peu plus fidèle, presque aussi rapide", + "arena_gb": 35.5, + "download_gb": 68, + "id": "IQ2_XS" + } + }, + { + "details": { + "cache_root": "256", + "ctx": "196608", + "drop": false, + "experts": "auto", + "has_helper": true, + "helper_gpu": "RTX 3070 (8 Go)", + "helper_on": true, + "kv": "fp16", + "kv_resident": "32768", + "main_gpu": "RTX 5060 Ti (16 Go)", + "mmap": true, + "mode": "arena", + "mode_label": "experts.bin mappé (cache système)", + "prefill": "16384", + "short_read": "150", + "spec": "3", + "split_layers": true, + "version": "1.1", + "vision": true, + "vision_gpu": "RTX 5060 Ti (16 Go)" + }, + "disk_gb": 75.799997999, + "drop": false, + "mmap": true, + "ok": true, + "preset": "STRATA FLASH NEXT SWIFT 1.5 IQ3_XXS", + "quant": { + "about": "99 % de la qualité du modèle complet", + "arena_gb": 42.9, + "download_gb": 75.8, + "id": "IQ3_XXS" + } + } + ], + "id": "swift", + "label": "Swift 1.5", + "quants": [ + "IQ2_XS", + "IQ3_XXS" + ], + "recommend": "IQ3_XXS" + }, + { + "about": "le Qwen3.8-Flash-Next original", + "fits": [ + { + "details": { + "cache_root": "256", + "ctx": "131072", + "drop": false, + "experts": "ram", + "has_helper": true, + "helper_on": false, + "kv": "int8", + "main_gpu": "RTX 3070 (8 Go)", + "mmap": false, + "mode": "ram", + "mode_label": "chargés et verrouillés en RAM", + "prefill": "16384", + "short_read": "150", + "spec": "4", + "split_layers": false, + "version": "1.1", + "vision": false + }, + "disk_gb": 66.4, + "drop": false, + "mmap": false, + "ok": true, + "preset": "STRATA FLASH NEXT CLASSIQUE Q2_0", + "quant": { + "about": "le plus rapide", + "arena_gb": 34, + "download_gb": 66.4, + "id": "Q2_0" + } + }, + { + "details": { + "cache_root": "256", + "ctx": "131072", + "drop": false, + "experts": "disk", + "has_helper": false, + "helper_on": false, + "kv": "int8", + "main_gpu": "RTX 5060 Ti (16 Go)", + "mmap": true, + "mode": "arena", + "mode_label": "experts.bin mappé (cache système)", + "prefill": "16384", + "short_read": "150", + "spec": "4", + "split_layers": false, + "version": "1.1", + "vision": true, + "vision_gpu": "RTX 5060 Ti (16 Go)" + }, + "disk_gb": 68, + "drop": false, + "mmap": false, + "ok": true, + "preset": "STRATA FLASH NEXT CLASSIQUE IQ2_XS", + "quant": { + "about": "un peu plus fidèle, presque aussi rapide", + "arena_gb": 35.5, + "download_gb": 68, + "id": "IQ2_XS" + } + }, + { + "disk_gb": 75.8, + "drop": false, + "mmap": true, + "ok": true, + "quant": { + "about": "99 % de la qualité du modèle complet", + "arena_gb": 42.9, + "download_gb": 75.8, + "id": "IQ3_XXS" + } + }, + { + "disk_gb": 83.6, + "drop": false, + "mmap": true, + "ok": true, + "quant": { + "about": "la meilleure qualité, le plus lent", + "arena_gb": 50.3, + "download_gb": 83.6, + "id": "IQ3_S" + } + } + ], + "id": "qwen", + "label": "Classique", + "quants": [ + "Q2_0", + "IQ2_XS", + "IQ3_XXS", + "IQ3_S" + ], + "recommend": "IQ3_XXS" + } + ], + "installed": [ + "STRATA FLASH NEXT CLASSIQUE IQ2_XS", + "STRATA FLASH NEXT SWIFT 1.5 IQ3_XXS", + "STRATA FLASH NEXT CLASSIQUE Q2_0", + "S" + ], + "version": "1.1" + }, + "actions": [], + "after": { + "config/CTX": "131072", + "config/ENGINE": "strata", + "config/STRATA_CONFIG": "{{HOME}}/strata/ajean-moe-1.1/strata-swift-iq3_xxs.json", + "config/STRATA_KV": "fp16" + }, + "tree": [ + "d presets", + "d strata", + "d strata/ajean-moe-1.1", + "d strata/ajean-moe-1.1/.venv", + "d strata/ajean-moe-1.1/.venv/bin", + "d strata/ajean-moe-1.1/engine-cuda12", + "d strata/ajean-moe-1.1/serve", + "d strata/data", + "d strata/data/models", + "d strata/data/models/swift-IQ3_XXS", + "d strata/data/packs", + "d strata/data/packs/swift-iq3_xxs", + "d strata/dl", + "d strata/prebuilt", + "f presets/S.env -rw-r--r-- # NAME=Strata S\nENGINE=strata\nSTRATA_HELPER_GPU=0\nSTRATA_EXPERTS=disk\nCTX=98304\nSTRATA_KV=int8\nSTRATA_SPEC=4\nSTRATA_VISION=0\nSTRATA_HELPER=1\n", + "f presets/STRATA FLASH NEXT CLASSIQUE IQ2_XS.env -rw-r--r-- # NAME=Classique IQ2_XS\nENGINE=strata\nSTRATA_CONFIG={{HOME}}/strata/ajean-moe-1.1/strata-swift-iq3_xxs.json\nSTRATA_MAIN_GPU=1\nSTRATA_HELPER_GPU=-1\nSTRATA_EXPERTS=disk\n", + "f presets/STRATA FLASH NEXT CLASSIQUE Q2_0.env -rw-r--r-- ENGINE=moe\nSTRATA_CONFIG={{HOME}}/strata/ajean-moe-1.1/strata-swift-iq3_xxs.json\nSTRATA_MAIN_GPU=0\nSTRATA_HELPER_GPU=1\nSTRATA_HELPER=0\nSTRATA_VISION=0\nSTRATA_EXPERTS=ram\n", + "f presets/STRATA FLASH NEXT SWIFT 1.5 IQ3_XXS.env -rw-r--r-- # NAME=Qwen3.8 Flash Next Swift 1.5 IQ3_XXS (Strata)\nENGINE=strata\nSTRATA_CONFIG={{HOME}}/strata/ajean-moe-1.1/strata-swift-iq3_xxs.json\nSTRATA_MAIN_GPU=1\nSTRATA_HELPER_GPU=0\nSTRATA_VISION=1\nSTRATA_EXPERTS=auto\nSTRATA_DROP=1\nSTRATA_KV=fp16\nSTRATA_KV_RESIDENT=32768\nSTRATA_SPEC=3\nCTX=196608\nREASONING=off\nSTRATA_SPLIT=layers\n", + "f presets/llama.env -rw-r--r-- MODEL=/m.gguf\n", + "f strata/ajean-moe-1.1/engine-cuda12/.loki-engine -rw-r--r-- ajean-moe-engine-1.1-linux-x64-cuda12.zip\n", + "f strata/ajean-moe-1.1/serve/server.py -rw-r--r-- # serveur\n", + "f strata/ajean-moe-1.1/setup.py -rw-r--r-- # installeur\n", + "f strata/ajean-moe-1.1/setup.sh -rwxr-xr-x #!/bin/bash\necho \"installeur : $*\"\necho \"cache : $XDG_CACHE_HOME\"\nprintf 'modèle 10%%\\r'\nprintf 'modèle 20%%\\r'\necho \"modèle téléchargé\"\nmkdir -p engine-cuda12 .venv/bin\nfam=\"\"; model=\"\"; data=\"\"\nwhile [ $# -gt 0 ]; do\n case \"$1\" in\n --family) fam=\"$2\"; shift;;\n --model) model=\"$2\"; shift;;\n --data-dir) data=\"$2\"; shift;;\n esac\n shift\ndone\ncase \"$model\" in\nQ2_0) echo \"erreur : téléchargement interrompu\" >&2; exit 3;;\nIQ2_XS) echo \"rien d'écrit\"; exit 0;;\nesac\nlow=$(echo \"$model\" | tr 'A-Z' 'a-z')\nif [ \"$fam\" = \"swift\" ]; then tag=\"swift-$low\"; else tag=\"$low\"; fi\nmkdir -p \"$data/packs/$tag\"\nprintf '{\"exe\":\"engine-cuda12/strata\",\"args\":[\"--pack\",\"%s\",\"--kv\",\"int8\",\"--spec\",\"4\",\"--max-context\",\"131072\",\"--vision\",\"--vram-reserve-mib\",\"700\"],\"vision\":{\"exe\":\"v\",\"gpu\":true},\"gpu\":0,\"port\":8080}\\n' \"$data/packs/$tag\" > \"strata-$tag.json\"\necho \"prêt : strata-$tag.json\"\n", + "f strata/ajean-moe-1.1/strata-swift-iq3_xxs.json -rw-r--r-- {\"exe\":\"engine-cuda12/strata\",\"args\":[\"--pack\",\"{{HOME}}/strata/data/packs/swift-iq3_xxs\",\"--kv\",\"int8\",\"--spec\",\"4\",\"--max-context\",\"131072\",\"--vision\",\"--vram-reserve-mib\",\"700\"],\"vision\":{\"exe\":\"v\",\"gpu\":true},\"gpu\":0,\"port\":8080}\n", + "f strata/data/models/swift-IQ3_XXS/a.gguf -rw-r--r-- xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", + "f strata/data/packs/swift-iq3_xxs/experts.bin -rw-r--r-- x", + "f strata/dl/ajean-moe-engine-1.1-linux-x64-cuda12.zip", + "f strata/dl/ajean-moe-src-1.1.tar.gz", + "f strata/prebuilt/strata-linux-x64-cuda12.zip" + ] + }, { "name": "mode hors RAM coupé dans le preset", "files": { @@ -4937,6 +5317,7 @@ "prefill": "16384", "short_read": "48", "spec": "3", + "split_layers": false, "version": "1.1", "vision": true, "vision_gpu": "RTX 3070 (8 Go)" @@ -4981,6 +5362,7 @@ "prefill": "16384", "short_read": "150", "spec": "4", + "split_layers": false, "version": "1.1", "vision": false }, @@ -5012,6 +5394,7 @@ "prefill": "16384", "short_read": "150", "spec": "4", + "split_layers": false, "version": "1.1", "vision": true, "vision_gpu": "RTX 5060 Ti (16 Go)" @@ -5179,6 +5562,7 @@ "prefill": "16384", "short_read": "48", "spec": "3", + "split_layers": false, "version": "1.1", "vision": true, "vision_gpu": "RTX 3070 (8 Go)" @@ -5223,6 +5607,7 @@ "prefill": "16384", "short_read": "150", "spec": "4", + "split_layers": false, "version": "1.1", "vision": false }, @@ -5254,6 +5639,7 @@ "prefill": "16384", "short_read": "150", "spec": "4", + "split_layers": false, "version": "1.1", "vision": true, "vision_gpu": "RTX 5060 Ti (16 Go)" diff --git a/rust/loki-rs/tests/strata.rs b/rust/loki-rs/tests/strata.rs index a7291ae..7637699 100644 --- a/rust/loki-rs/tests/strata.rs +++ b/rust/loki-rs/tests/strata.rs @@ -318,6 +318,7 @@ async fn parite_de_strata() { "CTX", "STRATA_KV", "STRATA_HELPER", + "STRATA_SPLIT", ] { if let Some(v) = bn.go.get("config", k).filter(|v| !v.is_empty()) { after.insert(format!("config/{k}"), Value::String(bn.mask(&v)));