mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-23 23:18:13 +02:00
Spéculation : SPEC=ngram et mtp+ngram, n-grammes du contexte en opt-in
En mode Code, le modèle recopie sans cesse ce qui est déjà dans le contexte : chemins, diffs, arguments JSON, fichiers réécrits. ngram-mod de llama.cpp y cherche la suite des 24 derniers jetons et propose d'un coup les 48 à 64 suivants, sans modèle brouillon. La clé SPEC (off par défaut, inchangé) gagne deux valeurs : ngram, et mtp+ngram qui y ajoute la tête MTP. Même vérification exacte que MTP : distribution inchangée, mais pas le même texte au bit près (vérification par lots), donc on compare des sessions rejouées, pas des diffs. - forme explicite seulement : --spec-type ngram-mod --spec-ngram-mod-n-match 24 --spec-ngram-mod-n-min 48 --spec-ngram-mod-n-max 64 ; jamais --spec-default (TODO amont, contenu susceptible de changer avec le moteur) - garde-fou d'aide sur « --spec-ngram-mod-n-match » (pas le simple mot ngram-mod, encore listé par les moteurs d'avant le renommage) ; absent = SPEC ignoré, note au journal - mtp+ngram : --spec-type draft-mtp,ngram-mod seulement avec draft-mtp dans l'aide ET une tête MTP réelle (tenseur nextn ou MODEL_DRAFT) ; sinon n-grammes seuls, avec la raison — jamais « failed to create MTP context » en boucle - EXTRA_ARGS/LLAMA_ARG_* : mêmes exclusions qu'avant, plus --spec_type et tout --spec-ngram-* (--spec-type s'additionne sans prévenir) ; pour ngram seul, un --spec-draft-* fait aussi taire Loki - poids sur CPU (experts MoE, -ot, NGL partiel) : refusé tant que GGML_OP_OFFLOAD_MIN_BATCH (env ou OP_OFFLOAD_MIN_BATCH) ne dépasse pas le lot de vérification de 65 jetons, avec la suggestion OP_OFFLOAD_MIN_BATCH=128 ; avertissements pour un modèle plus gros que la RAM, les points de reprise d'un hybride, NGL imposé (logits) - avec ngram, une tête MTP ou MODEL_DRAFT inutilisés sont signalés - --spec-synth-len/--spec-synth-rates (et LLAMA_ARG_SPEC_SYNTH_LEN) : acceptation au hasard, avertissement au lancement ; Loki ne les pose jamais - télémétrie : /api/perf/summary donne draft_n, draft_accepted et draft_rate par nature de requête - UI : deux options du sélecteur de décodage spéculatif ; README et configTemplate - tests : forme explicite, garde d'aide, repli de mtp+ngram, exclusions, seuil d'offload, ligne inchangée sans SPEC, acceptation par nature Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
28ba44eb46
commit
539e36ea49
11 files changed
+495
-67
No files matched your search
@@ -453,6 +453,12 @@ type perfKindSum struct {
|
||||
LostEvents int `json:"lost_events"`
|
||||
LostTokens int `json:"lost_tokens"`
|
||||
TTFTMedianMs *float64 `json:"ttft_median_ms,omitempty"`
|
||||
// Acceptation du brouillon par nature : un n-gramme paie en mode code
|
||||
// (chemins, diffs recopiés) et presque pas en prose — le taux global
|
||||
// mélangerait les deux. Absent = moteur muet ou spéculation coupée.
|
||||
DraftN int `json:"draft_n,omitempty"`
|
||||
DraftAccepted int `json:"draft_accepted,omitempty"`
|
||||
DraftRate *float64 `json:"draft_rate,omitempty"`
|
||||
}
|
||||
|
||||
type perfDepthSum struct {
|
||||
@@ -550,8 +556,10 @@ func perfSummarize(recs []perfRec) perfSummary {
|
||||
}
|
||||
if r.DraftN != nil {
|
||||
s.DraftN += *r.DraftN
|
||||
k.DraftN += *r.DraftN
|
||||
if r.DraftAcc != nil {
|
||||
s.DraftAccepted += *r.DraftAcc
|
||||
k.DraftAccepted += *r.DraftAcc
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -561,6 +569,10 @@ func perfSummarize(recs []perfRec) perfSummary {
|
||||
k.PrefillSecPerTurn = k.PrefillSec / float64(k.Turns)
|
||||
}
|
||||
k.TTFTMedianMs = perfMedian(ttft[kind])
|
||||
if k.DraftN > 0 {
|
||||
r := float64(k.DraftAccepted) / float64(k.DraftN)
|
||||
k.DraftRate = &r
|
||||
}
|
||||
}
|
||||
if sumTotal > 0 {
|
||||
r := float64(sumCached) / float64(sumTotal)
|
||||
|
||||
Reference in new issue
Block a user