mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-22 22:48:11 +02:00
Slots : SIDE_SLOT ouvre un second slot pour les travaux annexes, en opt-in
En --parallel 1, une vérification, un sous-agent, une tâche ou un bench prennent le slot de la discussion : son état part dans le cache RAM et en revient, ou se recalcule s'il n'y tient plus. Avec SIDE_SLOT=on (off par défaut), le moteur ouvre deux slots et la discussion garde le sien. Dimensionnement choisi pour qu'un débordement concurrent soit impossible par construction : cache KV NON unifié (--no-kv-unified) et -c 2×CTX, soit deux flux séparés de CTX jetons. Sous cache unifié, les deux slots partagent le pool et, plein, llama.cpp renvoie « Context size has been exceeded. » aux deux — que Loki prenait pour un débordement de la conversation. Chaque slot garde la fenêtre entière : ctxWindow et la compaction restent sur CTX, rien n'est raccourci. --cache-idle-slots ne vide les slots au repos que sous cache unifié : rien à régler. - lancement : refus (un slot, ligne d'avant, note au journal) si modèle + deux états dépassent 90 % de la VRAM, VRAM ou GGUF inconnus, poids sur CPU, moteur sans --no-kv-unified, PARALLEL≠2, ou -c/-np/-kvu/--no-kv-unified/ --kv-unified-per-slot/--cache-idle-slots dans EXTRA_ARGS (ou leurs LLAMA_ARG_*) ; note de VRAM en plus, avertissement si NGL imposé - routage id_slot seulement si /props annonce 2 slots d'au moins CTX jetons : 0 pour le tour, ses étapes, le préchauffage et le résumé en continuation ; 1 pour vérification, sous-agents, tâches, bench, résumé sur transcription - clients /v1 (proxy et relais) : corps réécrit en id_slot 1, quel qu'il soit - cohérence lot 1 : l'effacement de slot s'abstient (2 slots) ; une requête du slot 1 n'avance pas le numéro d'engineSlotHolds, la continuation de compaction reste possible après une vérification - « Context size has been exceeded. » sans nombre de jetons, deux slots en service : requête rejouée telle quelle, jamais compaction ni réduction - préchauffage permis sur les deux slots de SIDE_SLOT, vers le slot 0 - éditeur de preset : VRAM du second slot ou raison du refus - tests : ligne identique sans la clé, chaque conflit refuse sans changer la ligne, routage par nature, aucun id_slot sur un slot / preset externe / fenêtre partagée, rejeu sans compaction, proxy forcé, préchauffage Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c1d3757f23
commit
7a57322a62
18 files changed
+927
-16
No files matched your search
@@ -228,7 +228,14 @@ func (e benchEngine) do(ctx context.Context, method, path string, payload any) (
|
||||
}
|
||||
// Requête en vol jusqu'à la lecture complète du corps : l'isolation des
|
||||
// travaux annexes n'efface jamais le slot pendant ce temps (llm_slots.go).
|
||||
defer engineRequestStart()()
|
||||
// Une requête du second slot (SIDE_SLOT) ne touche pas au slot de la
|
||||
// discussion.
|
||||
side := false
|
||||
if m, ok := payload.(map[string]any); ok {
|
||||
side = payloadOnSideSlot(m)
|
||||
}
|
||||
end, _ := engineRequestBeginSide(nil, side)
|
||||
defer end()
|
||||
resp, err := e.client.Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -422,6 +429,9 @@ type benchSetup struct {
|
||||
kv string
|
||||
kvQuant bool
|
||||
gpus string
|
||||
// sideSlot : SIDE_SLOT en service, le bench passe par le second slot
|
||||
// (id_slot 1) et laisse la conversation en place (llm_sideslot.go).
|
||||
sideSlot bool
|
||||
}
|
||||
|
||||
func benchSetupFrom(cfg map[string]string, argEnv map[string]string) benchSetup {
|
||||
@@ -492,6 +502,9 @@ func (s benchSetup) payload(msgs []Message, maxTokens int, cache bool) map[strin
|
||||
if s.kwargs != nil {
|
||||
p["chat_template_kwargs"] = s.kwargs
|
||||
}
|
||||
if s.sideSlot {
|
||||
setEngineSlot(p, 1)
|
||||
}
|
||||
return p
|
||||
}
|
||||
|
||||
@@ -825,6 +838,7 @@ func runBench(ctx context.Context, opts benchOpts, progress benchProgress) (*ben
|
||||
effortRemember(want, got)
|
||||
logEffortFallback(want, got)
|
||||
}
|
||||
setup.sideSlot = engineSlotFor(resolveChatEndpoint(), false) == 1
|
||||
eng := benchEngine{base: fmt.Sprintf("http://localhost:%d", port), auth: resolveChatEndpoint().auth, client: http.DefaultClient}
|
||||
// Le bench prend le slot de la conversation : une fois fini (erreur et
|
||||
// annulation comprises), on l'efface si c'est sans risque, pour que son état
|
||||
|
||||
Reference in new issue
Block a user