@@ -258,6 +258,62 @@ def test_pretrain_megatron_mimo_calls_setup_and_train(
258258 mock_finish .assert_called_once ()
259259
260260
261+ def test_pretrain_megatron_mimo_evaluates_terminal_weights_off_interval ():
262+ """MegatronMIMO should validate final weights when the last step is off interval."""
263+ from megatron .bridge .training .pretrain_megatron_mimo import pretrain_megatron_mimo
264+
265+ cfg = _make_cfg ()
266+ cfg .validation .eval_interval = 2
267+ cfg .validation .eval_iters = 1
268+
269+ setup_output = _make_setup_output (module_to_grid_map = {"language" : MagicMock ()})
270+ setup_output .valid_data_iterator = iter ([object ()])
271+ forward_step_func = MagicMock ()
272+ events = []
273+
274+ def run_training (** _kwargs ):
275+ events .append ("train" )
276+ setup_output .global_state .train_state .step = 1
277+
278+ with (
279+ patch ("megatron.bridge.training.pretrain_megatron_mimo.megatron_mimo_runtime_config_update" ),
280+ patch ("megatron.bridge.training.pretrain_megatron_mimo.setup_megatron_mimo" , return_value = setup_output ),
281+ patch ("megatron.bridge.training.pretrain_megatron_mimo.train_megatron_mimo" , side_effect = run_training ),
282+ patch (
283+ "megatron.bridge.training.pretrain_megatron_mimo.evaluate_and_print_results" , create = True
284+ ) as mock_evaluate ,
285+ patch (
286+ "megatron.bridge.training.pretrain_megatron_mimo._finish_train" ,
287+ side_effect = lambda * _args : events .append ("finish" ),
288+ ),
289+ patch ("megatron.bridge.training.pretrain_megatron_mimo.dist" ) as mock_dist ,
290+ ):
291+ mock_dist .get_rank .return_value = 0
292+ mock_dist .is_initialized .return_value = True
293+ mock_evaluate .side_effect = lambda ** _kwargs : events .append ("evaluate" )
294+
295+ pretrain_megatron_mimo (
296+ cfg = cfg ,
297+ forward_step_func = forward_step_func ,
298+ build_data_iterators_fn = MagicMock (),
299+ global_state = setup_output .global_state ,
300+ )
301+
302+ mock_evaluate .assert_called_once_with (
303+ state = setup_output .global_state ,
304+ prefix = "iteration 1 on validation set" ,
305+ forward_step_func = forward_step_func ,
306+ data_iterator = setup_output .valid_data_iterator ,
307+ model = [setup_output .model ],
308+ config = cfg ,
309+ verbose = True ,
310+ write_to_tensorboard = True ,
311+ p2p_communicator = setup_output .multimodule_communicator ,
312+ pg_collection = setup_output .multimodule_pg_collection ,
313+ )
314+ assert events == ["train" , "evaluate" , "finish" ]
315+
316+
261317def test_finish_train_calls_cleanup ():
262318 """_finish_train should finalize async saves, shut down NVRx/FT, and flush loggers."""
263319 from megatron .bridge .training .train import _finish_train
0 commit comments