@@ -46,25 +46,33 @@ def resolve_mtp(model_path, explicit=None):
4646
4747class Server :
4848 def __init__ (self , binary , model , port = 8099 , ngl = 99 , threads = None , ctx = 4096 ,
49- mtp = None , n_max = None , p_min = 0.0 , backend_sampling = True ):
49+ mtp = None , n_max = None , p_min = 0.0 , backend_sampling = True , spec_type = None ):
5050 self .binary , self .model , self .port = binary , model , port
5151 self .ngl , self .threads , self .ctx = ngl , threads , ctx
5252 self .mtp , self .n_max , self .p_min = mtp , n_max , p_min
5353 self .backend_sampling = backend_sampling
54+ # speculation method(s): None = vanilla; "draft-mtp" (default when mtp set);
55+ # comma list e.g. "draft-mtp,ngram-mod" runs a cascade.
56+ self .spec_type = spec_type
5457 self .proc = None
5558
5659 def cmd (self ):
5760 c = [self .binary , "-m" , self .model , "-ngl" , str (self .ngl ), "-c" , str (self .ctx ),
5861 "--port" , str (self .port ), "--host" , "127.0.0.1" ]
5962 if self .threads :
6063 c += ["-t" , str (self .threads )]
61- if self .mtp :
62- c += ["-md" , self .mtp , "--spec-type" , "draft-mtp" ,
63- "--spec-draft-ngl" , str (self .ngl ), "--spec-draft-p-min" , str (self .p_min )]
64- if self .n_max is not None :
65- c += ["--spec-draft-n-max" , str (self .n_max )]
66- if not self .backend_sampling :
67- c += ["--no-spec-draft-backend-sampling" ]
64+ spec = self .spec_type or ("draft-mtp" if self .mtp else None )
65+ if spec :
66+ c += ["--spec-type" , spec ]
67+ # draft-model methods (draft-mtp / draft-eagle3) need the head + draft flags;
68+ # ngram-* methods draft from context and need neither.
69+ if self .mtp and ("draft-mtp" in spec or "draft-eagle3" in spec ):
70+ c += ["-md" , self .mtp , "--spec-draft-ngl" , str (self .ngl ),
71+ "--spec-draft-p-min" , str (self .p_min )]
72+ if self .n_max is not None :
73+ c += ["--spec-draft-n-max" , str (self .n_max )]
74+ if not self .backend_sampling :
75+ c += ["--no-spec-draft-backend-sampling" ]
6876 return c
6977
7078 def __enter__ (self ):
@@ -152,7 +160,7 @@ def do_bench(args):
152160 vm = gen_metrics (v )
153161
154162 with Server (binary , args .model , port = args .port , ngl = args .ngl , threads = args .threads ,
155- ctx = args .ctx , mtp = mtp , n_max = args .n_max , p_min = args .p_min ) as s :
163+ ctx = args .ctx , mtp = mtp , n_max = args .n_max , p_min = args .p_min , spec_type = args . methods ) as s :
156164 d = s .complete (prompt , args .n_predict )
157165 dm = gen_metrics (d )
158166
@@ -193,7 +201,7 @@ def do_autotune(args):
193201 rows , best = [], None
194202 for nm in grid :
195203 with Server (binary , args .model , port = args .port , ngl = args .ngl , threads = args .threads ,
196- ctx = args .ctx , mtp = mtp , n_max = nm , p_min = args .p_min ) as s :
204+ ctx = args .ctx , mtp = mtp , n_max = nm , p_min = args .p_min , spec_type = args . methods ) as s :
197205 m = gen_metrics (s .complete (prompt , args .n_predict ))
198206 sp = m ["tok_s" ] / vm ["tok_s" ]
199207 rows .append ((nm , m ["tok_s" ], sp , m .get ("accept_pct" , 0 )))
@@ -210,7 +218,7 @@ def do_run(args):
210218 binary = find_server ()
211219 mtp = resolve_mtp (args .model , args .mtp )
212220 cmd = Server (binary , args .model , port = args .port , ngl = args .ngl , threads = args .threads ,
213- ctx = args .ctx , mtp = mtp , n_max = args .n_max , p_min = args .p_min ).cmd ()
221+ ctx = args .ctx , mtp = mtp , n_max = args .n_max , p_min = args .p_min , spec_type = args . methods ).cmd ()
214222 print ("[self-draft] launching:\n " + " " .join (cmd ))
215223 os .execv (binary , cmd )
216224
@@ -222,7 +230,7 @@ def do_agent(args):
222230 with Server (binary , args .model , port = args .port , ngl = args .ngl , threads = args .threads , ctx = args .ctx ):
223231 v = run_agent (args .port , verbose = args .verbose )
224232 with Server (binary , args .model , port = args .port , ngl = args .ngl , threads = args .threads , ctx = args .ctx ,
225- mtp = mtp , n_max = args .n_max , p_min = args .p_min ):
233+ mtp = mtp , n_max = args .n_max , p_min = args .p_min , spec_type = args . methods ):
226234 d = run_agent (args .port , verbose = args .verbose )
227235 print ("\n ============ agent loop (ReAct + calculator tool) ============" )
228236 print (f"vanilla : { v ['wall_ms' ]/ 1000 :6.2f} s steps={ v ['steps' ]} tokens={ v ['tokens' ]} answer={ v ['answer' ]} correct={ v ['correct' ]} " )
@@ -246,6 +254,8 @@ def common(p):
246254 p .add_argument ("--ctx" , type = int , default = 4096 )
247255 p .add_argument ("--port" , type = int , default = 8099 )
248256 p .add_argument ("--p-min" , type = float , default = 0.0 )
257+ p .add_argument ("--methods" , default = "draft-mtp" ,
258+ help = "speculation method(s): draft-mtp | ngram-mod | 'draft-mtp,ngram-mod' (cascade, usually fastest)" )
249259 p .add_argument ("--workload" , default = "code" , help = "'code', 'prose', or a literal prompt string" )
250260 p .add_argument ("--n-predict" , type = int , default = 200 )
251261 p .add_argument ("--price" , type = float , default = 0.0 , help = "instance price $/hr (e.g. c7g.xlarge ~0.145) -> reports $/1M tokens" )
0 commit comments