@@ -35,6 +35,15 @@ def parse_args():
3535 # Model
3636 p .add_argument ("--model-config" , default = "small" ,
3737 choices = ["small" , "ouro_1_4b" , "ouro_2_6b" ])
38+ # Model config overrides (applied after loading preset)
39+ p .add_argument ("--hidden-size" , type = int , default = None )
40+ p .add_argument ("--num-layers" , type = int , default = None )
41+ p .add_argument ("--num-heads" , type = int , default = None )
42+ p .add_argument ("--intermediate-size" , type = int , default = None )
43+ # Ablation flags
44+ p .add_argument ("--use-q-act" , action = "store_true" )
45+ p .add_argument ("--q-weight" , type = float , default = 0.1 )
46+ p .add_argument ("--q-gamma" , type = float , default = 0.99 )
3847
3948 # Data
4049 p .add_argument ("--dataset" , default = "wikitext" )
@@ -91,14 +100,25 @@ def parse_args():
91100 return p .parse_args ()
92101
93102
94- def build_model_config (name : str , seq_len : int ) -> LoopLMConfig :
103+ def build_model_config (args ) -> LoopLMConfig :
95104 configs = {
96105 "small" : LoopLMConfig .small (),
97106 "ouro_1_4b" : LoopLMConfig .ouro_1_4b (),
98107 "ouro_2_6b" : LoopLMConfig .ouro_2_6b (),
99108 }
100- cfg = configs [name ]
101- cfg .max_seq_len = seq_len
109+ cfg = configs [args .model_config ]
110+ cfg .max_seq_len = args .seq_len
111+ # Apply overrides
112+ if args .hidden_size is not None :
113+ cfg .hidden_size = args .hidden_size
114+ if args .num_layers is not None :
115+ cfg .num_layers = args .num_layers
116+ if args .num_heads is not None :
117+ cfg .num_heads = args .num_heads
118+ if args .intermediate_size is not None :
119+ cfg .intermediate_size = args .intermediate_size
120+ if args .num_recurrent_steps is not None :
121+ cfg .max_recurrent_steps = args .num_recurrent_steps
102122 return cfg
103123
104124
@@ -188,7 +208,7 @@ def main():
188208 rank = dist .get_rank ()
189209 world_size = dist .get_world_size ()
190210
191- model_cfg = build_model_config (args . model_config , args . seq_len )
211+ model_cfg = build_model_config (args )
192212 eval_tasks = [t .strip () for t in args .eval_tasks .split ("," ) if t .strip ()]
193213
194214 # Build multi-stage list (each non-zero step value enables that stage)
@@ -222,12 +242,25 @@ def main():
222242 eval_tasks = eval_tasks ,
223243 eval_limit = args .eval_limit ,
224244 tokenizer_id = args .tokenizer_id ,
245+ q_weight = args .q_weight ,
246+ q_gamma = args .q_gamma ,
225247 )
226248
249+ # Model kwargs for ablation flags
250+ model_kwargs = {}
251+ if args .use_q_act :
252+ model_kwargs ["use_q_act" ] = True
253+
227254 n_params = model_cfg .num_parameters ()
228255 eff_batch_tokens = args .batch_size * args .grad_accum_steps * args .seq_len * world_size
229256 if rank == 0 :
230- print (f"Model: { args .model_config } ({ n_params / 1e6 :.1f} M params)" )
257+ overrides = []
258+ if args .hidden_size : overrides .append (f"h={ args .hidden_size } " )
259+ if args .num_layers : overrides .append (f"L={ args .num_layers } " )
260+ if args .num_recurrent_steps : overrides .append (f"T={ args .num_recurrent_steps } " )
261+ if args .use_q_act : overrides .append ("Q-ACT" )
262+ override_str = f" [{ ', ' .join (overrides )} ]" if overrides else ""
263+ print (f"Model: { args .model_config } { override_str } ({ n_params / 1e6 :.1f} M params)" )
231264 if distributed :
232265 print (f"Distributed: { world_size } GPUs (DDP)" )
233266 if stages :
@@ -262,7 +295,7 @@ def main():
262295 max_chunks = args .max_chunks ,
263296 )
264297
265- trainer = Trainer (model_cfg , trainer_cfg )
298+ trainer = Trainer (model_cfg , trainer_cfg , model_kwargs = model_kwargs )
266299 num_steps = args .num_recurrent_steps or model_cfg .max_recurrent_steps
267300
268301 if args .gradient_checkpointing :
0 commit comments