temp_step_pre_test
This commit is contained in:
@@ -1,125 +0,0 @@
|
|||||||
"""Tests for config_loader.load_all_configs with _common/ + preset structure."""
|
|
||||||
|
|
||||||
from __future__ import annotations
|
|
||||||
from pathlib import Path
|
|
||||||
import pytest
|
|
||||||
from src.conf.config_loader import load_all_configs
|
|
||||||
|
|
||||||
|
|
||||||
def _make_minimal_preset_layout(root: Path) -> None:
|
|
||||||
"""Create _common/ + base files matching the production layout."""
|
|
||||||
common = root / "_common"
|
|
||||||
common.mkdir()
|
|
||||||
(common / "training.gin").write_text("TrainingConfig.tau_init = 0.07\n")
|
|
||||||
(common / "hardware_default.gin").write_text("HardwareConfig.batch_size = 8\n")
|
|
||||||
(common / "hardware_no_gradckpt.gin").write_text(
|
|
||||||
"HardwareConfig.batch_size = 8\n"
|
|
||||||
"HardwareConfig.gradient_checkpointing = False\n",
|
|
||||||
)
|
|
||||||
(common / "tracking.gin").write_text("TrackingConfig.use_tb = True\n")
|
|
||||||
|
|
||||||
|
|
||||||
def _make_preset(root: Path, name: str, models_body: str, output_dir: str) -> None:
|
|
||||||
"""Create a preset directory with required pipeline.gin + models.gin."""
|
|
||||||
preset = root / name
|
|
||||||
preset.mkdir()
|
|
||||||
(preset / "pipeline.gin").write_text(
|
|
||||||
f"PipelineConfig.output_dir = '{output_dir}'\n",
|
|
||||||
)
|
|
||||||
(preset / "models.gin").write_text(models_body)
|
|
||||||
|
|
||||||
|
|
||||||
def test_load_returns_six_keys(tmp_path: Path) -> None:
|
|
||||||
"""load_all_configs returns the 6 expected keys."""
|
|
||||||
_make_minimal_preset_layout(tmp_path)
|
|
||||||
_make_preset(
|
|
||||||
tmp_path, "test_dinov3",
|
|
||||||
models_body="ModelsCommonConfig.backbone = 'dinov3'\n",
|
|
||||||
output_dir="out/test_dinov3",
|
|
||||||
)
|
|
||||||
|
|
||||||
cfgs = load_all_configs("test_dinov3", str(tmp_path))
|
|
||||||
assert set(cfgs.keys()) == {
|
|
||||||
"pipeline", "hardware", "training", "tracking", "models_common", "models",
|
|
||||||
}
|
|
||||||
assert cfgs["pipeline"].output_dir == "out/test_dinov3"
|
|
||||||
assert cfgs["models_common"].backbone == "dinov3"
|
|
||||||
|
|
||||||
|
|
||||||
def test_sofia_uses_no_gradckpt_hardware(tmp_path: Path) -> None:
|
|
||||||
"""Sofia backbones get hardware_no_gradckpt.gin (gradient_checkpointing=False)."""
|
|
||||||
_make_minimal_preset_layout(tmp_path)
|
|
||||||
_make_preset(
|
|
||||||
tmp_path, "test_sofia",
|
|
||||||
models_body="ModelsCommonConfig.backbone = 'sofia_v71'\n",
|
|
||||||
output_dir="out/test_sofia",
|
|
||||||
)
|
|
||||||
|
|
||||||
cfgs = load_all_configs("test_sofia", str(tmp_path))
|
|
||||||
assert cfgs["hardware"].gradient_checkpointing is False
|
|
||||||
|
|
||||||
|
|
||||||
def test_dinov3_uses_default_hardware(tmp_path: Path) -> None:
|
|
||||||
"""DINOv3/StripNet backbones get hardware_default.gin (gradient_checkpointing=True default)."""
|
|
||||||
_make_minimal_preset_layout(tmp_path)
|
|
||||||
# Override gradient_checkpointing=True in default profile to test routing.
|
|
||||||
(tmp_path / "_common" / "hardware_default.gin").write_text(
|
|
||||||
"HardwareConfig.batch_size = 8\n"
|
|
||||||
"HardwareConfig.gradient_checkpointing = True\n",
|
|
||||||
)
|
|
||||||
_make_preset(
|
|
||||||
tmp_path, "test_dinov3_hw",
|
|
||||||
models_body="ModelsCommonConfig.backbone = 'dinov3'\n",
|
|
||||||
output_dir="out/test_dinov3_hw",
|
|
||||||
)
|
|
||||||
cfgs = load_all_configs("test_dinov3_hw", str(tmp_path))
|
|
||||||
assert cfgs["hardware"].gradient_checkpointing is True
|
|
||||||
|
|
||||||
|
|
||||||
def test_local_override_wins(tmp_path: Path) -> None:
|
|
||||||
"""Local training.gin in preset dir overrides _common/training.gin."""
|
|
||||||
_make_minimal_preset_layout(tmp_path)
|
|
||||||
_make_preset(
|
|
||||||
tmp_path, "test_override",
|
|
||||||
models_body="ModelsCommonConfig.backbone = 'dinov3'\n",
|
|
||||||
output_dir="out/test_override",
|
|
||||||
)
|
|
||||||
# Drop a local training.gin that overrides tau_init.
|
|
||||||
(tmp_path / "test_override" / "training.gin").write_text(
|
|
||||||
"TrainingConfig.tau_init = 0.123\n",
|
|
||||||
)
|
|
||||||
|
|
||||||
cfgs = load_all_configs("test_override", str(tmp_path))
|
|
||||||
assert cfgs["training"].tau_init == 0.123
|
|
||||||
|
|
||||||
|
|
||||||
def test_unknown_backbone_raises(tmp_path: Path) -> None:
|
|
||||||
"""Invalid backbone string in models.gin → ValueError."""
|
|
||||||
_make_minimal_preset_layout(tmp_path)
|
|
||||||
_make_preset(
|
|
||||||
tmp_path, "test_bad",
|
|
||||||
models_body="ModelsCommonConfig.backbone = 'mistral_42b'\n",
|
|
||||||
output_dir="out/bad",
|
|
||||||
)
|
|
||||||
|
|
||||||
with pytest.raises(ValueError, match="Unknown backbone"):
|
|
||||||
load_all_configs("test_bad", str(tmp_path))
|
|
||||||
|
|
||||||
|
|
||||||
def test_missing_preset_raises(tmp_path: Path) -> None:
|
|
||||||
"""Non-existent preset directory → FileNotFoundError."""
|
|
||||||
_make_minimal_preset_layout(tmp_path)
|
|
||||||
with pytest.raises(FileNotFoundError, match="Preset directory not found"):
|
|
||||||
load_all_configs("nonexistent", str(tmp_path))
|
|
||||||
|
|
||||||
|
|
||||||
def test_missing_required_file_raises(tmp_path: Path) -> None:
|
|
||||||
"""Preset missing pipeline.gin → FileNotFoundError."""
|
|
||||||
_make_minimal_preset_layout(tmp_path)
|
|
||||||
bad_preset = tmp_path / "test_bad_preset"
|
|
||||||
bad_preset.mkdir()
|
|
||||||
(bad_preset / "models.gin").write_text("ModelsCommonConfig.backbone = 'dinov3'\n")
|
|
||||||
|
|
||||||
with pytest.raises(FileNotFoundError, match="missing required file 'pipeline.gin'"):
|
|
||||||
load_all_configs("test_bad_preset", str(tmp_path))
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user