Skip to content

Commit 12a6ab7

Browse files
committed
test(conversion): exercise scheduler path in verdict tests
Mock scheduler selection instead of bypassing the Megatron forward helper. Drive the real inference wrapper, iterator, and forward-step callback with a single-microbatch test scheduler, then assert the scheduling and model input contracts. Preserve the existing offline AutoConfig fixture. Assisted-by: OpenAI Codex Signed-off-by: Yuchen Wang <eang333cms@gmail.com>
1 parent bb4937a commit 12a6ab7

1 file changed

Lines changed: 42 additions & 2 deletions

File tree

‎tests/unit_tests/test_compare_mask_handling.py‎

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import os
2222
import sys
23+
from collections.abc import Callable
2324
from datetime import timedelta
2425
from types import SimpleNamespace
2526
from 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
189229
class TestCompareMaskHandling:

0 commit comments

Comments
 (0)