mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-22 06:28:11 +02:00
Moteur : port déjà occupé refusé, cache KV lent signalé
Deux reprises d'AJEAN 0.15.9, côté `loki serve`. PORT OCCUPÉ Un llama-server orphelin (un stop qui n'a pas tué, un relancement trop rapide) peut encore tenir le port quand le suivant démarre. Deux moteurs sur le même port se partagent alors les requêtes au hasard : VRAM saturée, réponses du mauvais modèle. waitPortFree tente une connexion TCP (fiable même en SO_REUSEADDR, là où un Listen de test réussirait), laisse 5 s à un moteur qu'on vient d'arrêter pour libérer, puis refuse avec un message qui dit quoi faire. argValue lit la DERNIÈRE occurrence de --port/--host, comme llama-server, puisque EXTRA_ARGS peut les surcharger. CACHE KV LENT llama.cpp CUDA, compilé avec ses options par défaut (FA_ALL_QUANTS=OFF), n'accélère en Flash-Attention que f16, bf16, q8_0 et q4_0 — et seulement à l'identique pour K et V. C'est le cas du moteur de l'image server-cuda et de ceux installés par OCI. q5_1 ou un couple mixte q8_0/q4_0 marchent mais sont reconvertis en f16 à chaque pas. L'amont ne prévient que pour son binaire précompilé ; chez nous tous les moteurs sont concernés, donc l'avertissement part toujours dans loki-engine.log. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
b893d1a81f
commit
20375d0e4c
2 files changed
+107
-1
No files matched your search
@@ -1,8 +1,10 @@
|
||||
package loki
|
||||
|
||||
import (
|
||||
"net"
|
||||
"reflect"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestHasAnyFlag(t *testing.T) {
|
||||
@@ -91,3 +93,32 @@ func TestNGLArgs(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestArgValueEtPortLibre(t *testing.T) {
|
||||
if got := argValue([]string{"--port", "8080", "-c", "1", "--port", "9000"}, "--port"); got != "9000" {
|
||||
t.Fatalf("la dernière occurrence doit gagner, got %q", got)
|
||||
}
|
||||
ln, err := net.Listen("tcp", "127.0.0.1:0")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
_, port, _ := net.SplitHostPort(ln.Addr().String())
|
||||
if waitPortFree("0.0.0.0", port, 600*time.Millisecond) == nil {
|
||||
t.Fatal("un port occupé doit être refusé")
|
||||
}
|
||||
ln.Close()
|
||||
if err := waitPortFree("0.0.0.0", port, time.Second); err != nil {
|
||||
t.Fatalf("un port libre doit passer : %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSlowKV(t *testing.T) {
|
||||
for _, c := range []struct {
|
||||
k, v string
|
||||
lent bool
|
||||
}{{"", "", false}, {"q8_0", "q8_0", false}, {"q4_0", "q4_0", false}, {"q8_0", "q4_0", true}, {"q5_1", "q5_1", true}} {
|
||||
if slowKV(c.k, c.v) != c.lent {
|
||||
t.Errorf("%s/%s : lent attendu %v", c.k, c.v, c.lent)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user