2020
2121import os
2222import sys
23+ from collections .abc import Callable
2324from datetime import timedelta
2425from types import SimpleNamespace
2526from unittest .mock import MagicMock , patch
@@ -160,14 +161,31 @@ def test_forward_comparison_verdict(self, monkeypatch, fail_on_mismatch, hf_valu
160161 hf_logits = torch .tensor (hf_values , dtype = torch .float32 )
161162 megatron_output = torch .tensor (megatron_values , dtype = torch .float32 ).view (1 , 1 , - 1 )
162163 tokenizer = SimpleNamespace (decode = lambda ids : str (ids ))
164+ megatron_model = MagicMock (return_value = megatron_output )
165+
166+ def forward_backward (
167+ * ,
168+ forward_step_func : Callable [..., tuple [torch .Tensor , Callable [..., torch .Tensor ]]],
169+ data_iterator : SingleBatchIterator ,
170+ model : list [MagicMock ],
171+ ** kwargs : object ,
172+ ) -> list [torch .Tensor ]:
173+ assert not torch .is_grad_enabled ()
174+ output , collect_data = forward_step_func (data_iterator , model [0 ])
175+ return [collect_data (output , non_loss_data = True )]
176+
177+ # Scheduler selection requires real model-parallel groups. Keep the
178+ # inference wrapper, iterator, and forward step on their production path.
179+ scheduler = MagicMock (side_effect = forward_backward )
180+ get_scheduler = MagicMock (return_value = scheduler )
163181
164182 monkeypatch .setattr (torch .cuda , "is_available" , lambda : False )
165183 monkeypatch .setattr (torch .cuda , "empty_cache" , lambda : None )
166184 monkeypatch .setattr (torch .Tensor , "cuda" , lambda tensor : tensor )
167185 monkeypatch .setattr (torch .distributed , "is_initialized" , lambda : False )
168186 monkeypatch .setattr (compare , "is_vision_language_model" , lambda * args : False )
169187 monkeypatch .setattr (compare .AutoConfig , "from_pretrained" , lambda * args , ** kwargs : SimpleNamespace ())
170- monkeypatch .setattr (compare , "_load_megatron_model" , lambda args : ([MagicMock () ], MagicMock ()))
188+ monkeypatch .setattr (compare , "_load_megatron_model" , lambda args : ([megatron_model ], MagicMock ()))
171189 monkeypatch .setattr (compare , "_load_hf_model" , lambda * args : MagicMock ())
172190 monkeypatch .setattr (compare , "_setup_tokenizer_and_processor" , lambda * args : (tokenizer , None ))
173191 monkeypatch .setattr (compare , "process_inputs" , lambda * args : (input_ids , None , None , None , None ))
@@ -176,14 +194,36 @@ def test_forward_comparison_verdict(self, monkeypatch, fail_on_mismatch, hf_valu
176194 "_run_hf_inference" ,
177195 lambda * args , ** kwargs : (hf_logits , hf_logits .argmax (), {}, [], (1 , 2 , len (hf_values ))),
178196 )
179- monkeypatch .setattr (compare , "_run_megatron_forward " , lambda * args , ** kwargs : megatron_output )
197+ monkeypatch .setattr (compare , "get_forward_backward_func " , get_scheduler )
180198
181199 if fail_on_mismatch and not passes :
182200 with pytest .raises (ValueError , match = "HF/Megatron comparison failed" ):
183201 compare .compare_models_one_step (args )
184202 else :
185203 compare .compare_models_one_step (args )
186204
205+ get_scheduler .assert_called_once_with ()
206+ iterator = scheduler .call_args .kwargs ["data_iterator" ]
207+ assert isinstance (iterator , SingleBatchIterator )
208+ scheduler .assert_called_once_with (
209+ forward_step_func = inference_forward_step ,
210+ data_iterator = iterator ,
211+ model = [megatron_model ],
212+ num_microbatches = 1 ,
213+ forward_only = True ,
214+ seq_length = input_ids .size (1 ),
215+ micro_batch_size = 1 ,
216+ collect_non_loss_data = True ,
217+ )
218+ megatron_model .assert_called_once ()
219+ forward_args = megatron_model .call_args .kwargs
220+ assert forward_args ["input_ids" ] is input_ids
221+ torch .testing .assert_close (forward_args ["position_ids" ], torch .tensor ([[0 , 1 ]]))
222+ assert forward_args ["attention_mask" ] is None
223+ assert forward_args ["inference_context" ] is iterator .batch ["inference_context" ]
224+ assert forward_args ["inference_context" ] is not None
225+ assert forward_args ["runtime_gather_output" ] is True
226+
187227
188228@pytest .mark .unit
189229class TestCompareMaskHandling :
0 commit comments