mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-23 23:18:13 +02:00
Optimiseur : relecture — slot fixe sous SIDE_SLOT, moteur mort vu tôt, verrou réécrit sous Windows
- Avec SIDE_SLOT, les tours en profondeur d'un essai restent sur le second slot : la reprise du cache ne dépend plus du slot choisi par le moteur - Après application, un moteur qui meurt au chargement (OOM) ramène l'ancienne version en quelques secondes au lieu d'attendre le délai entier - La réécriture du verrou (essai en cours) réessaie quand Windows refuse de remplacer un fichier lu au même instant Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
9bffff78c2
commit
9d02592d4f
2 files changed
+33
-5
No files matched your search
@@ -197,7 +197,18 @@ func (l *tuneLock) write() error {
|
|||||||
if err := os.WriteFile(tmp, b, 0o644); err != nil {
|
if err := os.WriteFile(tmp, b, 0o644); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return os.Rename(tmp, l.path)
|
// Windows refuse de remplacer un fichier qu'un autre processus lit à cet
|
||||||
|
// instant (tuneGuard d'une requête) : on réessaie un peu avant de renoncer.
|
||||||
|
for i := 0; ; i++ {
|
||||||
|
err := os.Rename(tmp, l.path)
|
||||||
|
if err == nil || i == 4 {
|
||||||
|
if err != nil {
|
||||||
|
_ = os.Remove(tmp)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
time.Sleep(50 * time.Millisecond)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// setTrial note l'essai en cours (nil : aucun), AVANT qu'il ne charge quoi que
|
// setTrial note l'essai en cours (nil : aucun), AVANT qu'il ne charge quoi que
|
||||||
|
|||||||
@@ -544,7 +544,12 @@ func runTune(ctx context.Context, opts tuneOpts, tr *tuneTracker) (*tuneResult,
|
|||||||
var runs []tuneRun
|
var runs []tuneRun
|
||||||
for i := 0; i < n; i++ {
|
for i := 0; i < n; i++ {
|
||||||
tr.setPhase("%s : mesure %d/%d", phase, i+1, n)
|
tr.setPhase("%s : mesure %d/%d", phase, i+1, n)
|
||||||
r, err := benchRun(ctx, l.eng, bopts, tuneBenchSetup(cfg, env.ArgEnv, cpuPlaced), corp, nil)
|
// SIDE_SLOT : deux slots ; les tours en profondeur restent sur le même
|
||||||
|
// (le second, comme le bench ordinaire), sans quoi la reprise du cache
|
||||||
|
// dépendrait du slot choisi par le moteur.
|
||||||
|
s := tuneBenchSetup(cfg, env.ArgEnv, cpuPlaced)
|
||||||
|
s.sideSlot = sideSlotOn(cfg) && l.slots >= 2
|
||||||
|
r, err := benchRun(ctx, l.eng, bopts, s, corp, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return runs, err
|
return runs, err
|
||||||
}
|
}
|
||||||
@@ -934,8 +939,9 @@ func tuneApply(ctx context.Context, res *tuneResult, target string, say func(str
|
|||||||
// tuneSvc et tuneProbeFn : serviceActionOS et tunePostApplyProbe, remplaçables
|
// tuneSvc et tuneProbeFn : serviceActionOS et tunePostApplyProbe, remplaçables
|
||||||
// dans les tests (application puis retour arrière sans vrai moteur).
|
// dans les tests (application puis retour arrière sans vrai moteur).
|
||||||
var (
|
var (
|
||||||
tuneSvc = serviceActionOS
|
tuneSvc = serviceActionOS
|
||||||
tuneProbeFn = tunePostApplyProbe
|
tuneProbeFn = tunePostApplyProbe
|
||||||
|
tuneHealthFn = healthCheck
|
||||||
)
|
)
|
||||||
|
|
||||||
// tuneAppliedMismatch : la configuration active après application doit être
|
// tuneAppliedMismatch : la configuration active après application doit être
|
||||||
@@ -968,10 +974,21 @@ func tunePostApplyProbe(ctx context.Context, res *tuneResult, say func(string))
|
|||||||
say("attente du moteur")
|
say("attente du moteur")
|
||||||
e := benchEngine{base: fmt.Sprintf("http://localhost:%d", LLMPort()), auth: tuneAuth(), client: http.DefaultClient}
|
e := benchEngine{base: fmt.Sprintf("http://localhost:%d", LLMPort()), auth: tuneAuth(), client: http.DefaultClient}
|
||||||
deadline := time.Now().Add(tuneLoadTimeout)
|
deadline := time.Now().Add(tuneLoadTimeout)
|
||||||
for !healthCheck() {
|
// Un moteur mort au chargement (OOM) se voit vite : plus de service du tout,
|
||||||
|
// trois fois de suite après les premières secondes. Inutile d'attendre le
|
||||||
|
// délai entier pour revenir à l'ancienne version.
|
||||||
|
gone, t0 := 0, time.Now()
|
||||||
|
for !tuneHealthFn() {
|
||||||
if time.Now().After(deadline) {
|
if time.Now().After(deadline) {
|
||||||
return fmt.Errorf("le moteur ne répond pas après %s", tuneLoadTimeout)
|
return fmt.Errorf("le moteur ne répond pas après %s", tuneLoadTimeout)
|
||||||
}
|
}
|
||||||
|
if time.Since(t0) > 10*time.Second && !engineNeedsStop() {
|
||||||
|
if gone++; gone >= 3 {
|
||||||
|
return errors.New("le moteur s'est arrêté au chargement")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
gone = 0
|
||||||
|
}
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
return ctx.Err()
|
return ctx.Err()
|
||||||
|
|||||||
Reference in new issue
Block a user