diff --git a/src/megatron/bridge/recipes/ministral3/h100/ministral3.py b/src/megatron/bridge/recipes/ministral3/h100/ministral3.py index 559df92d51..d7f5383eb3 100644 --- a/src/megatron/bridge/recipes/ministral3/h100/ministral3.py +++ b/src/megatron/bridge/recipes/ministral3/h100/ministral3.py @@ -110,6 +110,7 @@ def ministral3_3b_sft_1gpu_h100_bf16_config() -> ConfigContainer: # Dataset configuration cfg.dataset.seq_length = 4096 cfg.dataset.hf_processor_path = hf_path + cfg.dataset.enable_in_batch_packing = False # DDP settings cfg.ddp.overlap_grad_reduce = False @@ -225,6 +226,7 @@ def ministral3_8b_sft_2gpu_h100_bf16_config() -> ConfigContainer: # Dataset configuration cfg.dataset.seq_length = 4096 cfg.dataset.hf_processor_path = hf_path + cfg.dataset.enable_in_batch_packing = False # DDP settings cfg.ddp.overlap_grad_reduce = False @@ -340,6 +342,7 @@ def ministral3_14b_sft_4gpu_h100_bf16_config() -> ConfigContainer: # Dataset configuration cfg.dataset.seq_length = 4096 cfg.dataset.hf_processor_path = hf_path + cfg.dataset.enable_in_batch_packing = False # DDP settings cfg.ddp.overlap_grad_reduce = False @@ -464,6 +467,7 @@ def ministral3_3b_peft_1gpu_h100_bf16_config(peft_scheme: str | PEFT = "lora") - # Dataset configuration cfg.dataset.seq_length = 4096 cfg.dataset.hf_processor_path = hf_path + cfg.dataset.enable_in_batch_packing = False # DDP settings cfg.ddp.overlap_grad_reduce = False @@ -588,6 +592,7 @@ def ministral3_8b_peft_1gpu_h100_bf16_config(peft_scheme: str | PEFT = "lora") - # Dataset configuration cfg.dataset.seq_length = 4096 cfg.dataset.hf_processor_path = hf_path + cfg.dataset.enable_in_batch_packing = False # DDP settings cfg.ddp.overlap_grad_reduce = False @@ -712,6 +717,7 @@ def ministral3_14b_peft_2gpu_h100_bf16_config(peft_scheme: str | PEFT = "lora") # Dataset configuration cfg.dataset.seq_length = 4096 cfg.dataset.hf_processor_path = hf_path + cfg.dataset.enable_in_batch_packing = False # DDP settings cfg.ddp.overlap_grad_reduce = False diff --git a/tests/unit_tests/recipes/test_ministral3_recipes.py b/tests/unit_tests/recipes/test_ministral3_recipes.py index 019c7c00a0..2f10314154 100644 --- a/tests/unit_tests/recipes/test_ministral3_recipes.py +++ b/tests/unit_tests/recipes/test_ministral3_recipes.py @@ -44,6 +44,8 @@ _ministral3_module.ministral3_14b_peft_config, ] +_MINISTRAL3_FUNCS = _MINISTRAL3_SFT_FUNCS + _MINISTRAL3_PEFT_FUNCS + class _FakeModelCfg: """Fake model configuration for testing.""" @@ -138,6 +140,16 @@ def test_each_ministral3_sft_recipe_uses_recommended_learning_rate( assert cfg.optimizer.min_lr == pytest.approx(5e-7) +@pytest.mark.parametrize("recipe_func", _MINISTRAL3_FUNCS) +def test_each_ministral3_recipe_defaults_validate(recipe_func: Callable, monkeypatch: pytest.MonkeyPatch): + """Test that every Ministral3 recipe has runnable default batch settings.""" + patch_recipe_module_global(monkeypatch, _ministral3_module, "AutoBridge", _FakeAutoBridge) + + cfg = recipe_func() + + assert not cfg.dataset.enable_in_batch_packing or cfg.train.micro_batch_size > 1 + + @pytest.mark.parametrize("recipe_func", _MINISTRAL3_PEFT_FUNCS) def test_each_ministral3_peft_recipe_builds_config(recipe_func: Callable, monkeypatch: pytest.MonkeyPatch): """Test that each Ministral3 PEFT recipe function builds a valid configuration."""