@@ -191,6 +191,7 @@ def launch(
191191 watchdog_min : int = 0 ,
192192 trainer : str = "marker" ,
193193 decoder_opts : dict | None = None ,
194+ extra_rows : int = 0 ,
194195):
195196 if trainer not in ("marker" , "decoder" ):
196197 raise SystemExit (f"--trainer must be marker or decoder, got { trainer !r} " )
@@ -214,7 +215,12 @@ def launch(
214215 # Full-corpus epochs measured at ~110 min on 4x T4 with 8192-token rows; budget
215216 # 130 min/epoch plus 40 min for corpus build + sync, unless overridden.
216217 if watchdog_min <= 0 :
217- watchdog_min = 40 + 130 * epochs
218+ if trainer == "decoder" :
219+ # Measured on 4x A10G: 18.6 rows/s on the universal corpus, 11 rows/s once judge/RAGTruth-length rows
220+ # are mixed in. Budget the slow rate over every row the run will see, plus setup and eval.
221+ watchdog_min = 40 + int (epochs * (max_train + long_context + synthetic_n + extra_rows ) / 11 / 60 ) + 30
222+ else :
223+ watchdog_min = 40 + 130 * epochs
218224 print (f" Watchdog: { watchdog_min } min" )
219225 print (" Cluster Target: 4x GPU (g4dn.12xlarge / g5.12xlarge)" )
220226 print (" Region: us-west-2" )
@@ -409,6 +415,7 @@ def launch(
409415 parser .add_argument ("--base-model-id" , default = "" , help = "Hub id of the backbone (decoder trainer); default Qwen/Qwen3.5-0.8B" )
410416 parser .add_argument ("--decoder-opt" , action = "append" , default = [],
411417 help = "decoder trainer knob as key=value: max_length, lora_r, lora_alpha, head_width, head_routing_layers, head_layers, head_heads, head_feedforward, eval_name" )
418+ parser .add_argument ("--extra-rows" , type = int , default = 0 , help = "row count of --extra-train-s3, for the watchdog estimate" )
412419 parser .add_argument ("--watchdog-min" , type = int , default = 0 ,
413420 help = "hard shutdown ceiling in minutes (0 = derive from epochs)" )
414421 args = parser .parse_args ()
@@ -433,6 +440,7 @@ def launch(
433440 lr = args .lr ,
434441 watchdog_min = args .watchdog_min ,
435442 trainer = args .trainer ,
443+ extra_rows = args .extra_rows ,
436444 base_model_id = args .base_model_id or ("Qwen/Qwen3.5-0.8B" if args .trainer == "decoder" else "wfzyx/von" ),
437445 decoder_opts = {k : (int (v ) if v .isdigit () else v ) for k , v in (o .split ("=" , 1 ) for o in args .decoder_opt )},
438446 )
0 commit comments