Skip to content

Commit 1d273ea

Browse files
committed
remove deprecated hosted val config
1 parent 5715bca commit 1d273ea

6 files changed

Lines changed: 55 additions & 45 deletions

File tree

packages/prime/src/prime_cli/api/rl.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,6 @@ def create_run(
192192
secrets: Optional[Dict[str, str]] = None,
193193
team_id: Optional[str] = None,
194194
eval_config: Optional[Dict[str, Any]] = None,
195-
val_config: Optional[Dict[str, Any]] = None,
196195
buffer_config: Optional[Dict[str, Any]] = None,
197196
learning_rate: Optional[float] = None,
198197
lora_alpha: Optional[int] = None,
@@ -266,9 +265,6 @@ def create_run(
266265
if eval_config:
267266
payload["eval"] = eval_config
268267

269-
if val_config:
270-
payload["val"] = val_config
271-
272268
if buffer_config:
273269
payload["buffer"] = buffer_config
274270

packages/prime/src/prime_cli/commands/rl.py

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -258,12 +258,6 @@ def generate_rl_config_template(environment: str | None = None) -> str:
258258
# num_examples = 30
259259
# rollouts_per_example = 4
260260
261-
# Optional: validation during training
262-
# [val]
263-
# num_examples = 64
264-
# rollouts_per_example = 1
265-
# interval = 5
266-
267261
# Optional: buffer configuration for difficulty filtering
268262
# [buffer]
269263
# easy_threshold = 1.0
@@ -409,24 +403,6 @@ def to_api_dict(self) -> Dict[str, Any] | None:
409403
return result
410404

411405

412-
class ValConfig(BaseModel):
413-
model_config = ConfigDict(extra="forbid")
414-
415-
num_examples: int | None = None
416-
rollouts_per_example: int | None = None
417-
interval: int | None = None
418-
419-
def to_api_dict(self) -> Dict[str, Any] | None:
420-
result: Dict[str, Any] = {}
421-
if self.num_examples is not None:
422-
result["num_examples"] = self.num_examples
423-
if self.rollouts_per_example is not None:
424-
result["rollouts_per_example"] = self.rollouts_per_example
425-
if self.interval is not None:
426-
result["interval"] = self.interval
427-
return result if result else None
428-
429-
430406
class BufferConfig(BaseModel):
431407
model_config = ConfigDict(extra="forbid")
432408

@@ -602,7 +578,6 @@ class RLConfig(BaseModel):
602578
env: List[EnvConfig] = Field(default_factory=list)
603579
sampling: SamplingConfig = Field(default_factory=SamplingConfig)
604580
eval: EvalConfig = Field(default_factory=EvalConfig)
605-
val: ValConfig = Field(default_factory=ValConfig)
606581
buffer: BufferConfig = Field(default_factory=BufferConfig)
607582
wandb: WandbConfig = Field(default_factory=WandbConfig)
608583
checkpoints: CheckpointsConfig = Field(default_factory=CheckpointsConfig)
@@ -964,13 +939,6 @@ def _fetch_pricing() -> None:
964939
if cfg.eval.interval:
965940
console.print(f" Interval: {cfg.eval.interval}")
966941

967-
# Validation
968-
if cfg.val.num_examples is not None:
969-
console.print("\n[cyan]Validation[/cyan]")
970-
console.print(f" Num Examples: {cfg.val.num_examples}")
971-
if cfg.val.interval:
972-
console.print(f" Interval: {cfg.val.interval}")
973-
974942
# Infrastructure
975943
if cfg.infrastructure.compute_size:
976944
console.print("\n[cyan]Infrastructure[/cyan]")
@@ -1096,7 +1064,6 @@ def _format(list_p: Any, eff_p: Any) -> str:
10961064
secrets=secrets if secrets else None,
10971065
team_id=app_config.team_id,
10981066
eval_config=cfg.eval.to_api_dict(),
1099-
val_config=cfg.val.to_api_dict(),
11001067
buffer_config=cfg.buffer.to_api_dict(),
11011068
learning_rate=cfg.learning_rate,
11021069
lora_alpha=cfg.lora_alpha,

packages/prime/src/prime_lab_app/training_config.py

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,6 @@ def training_config_toml(raw: dict[str, Any]) -> str:
4646

4747
if isinstance(raw.get("eval_config"), dict):
4848
config["eval"] = _rl_eval_config(raw["eval_config"])
49-
if isinstance(raw.get("val_config"), dict):
50-
config["val"] = raw["val_config"]
5149
if isinstance(raw.get("buffer_config"), dict):
5250
config["buffer"] = raw["buffer_config"]
5351

@@ -76,12 +74,7 @@ def normalize_rl_config(config: dict[str, Any]) -> dict[str, Any]:
7674
updated["eval"] = _rl_eval_config(eval_config)
7775
else:
7876
updated.pop("eval_config", None)
79-
if "val_config" in updated and "val" not in updated:
80-
val_config = updated.pop("val_config")
81-
if isinstance(val_config, dict):
82-
updated["val"] = val_config
83-
else:
84-
updated.pop("val_config", None)
77+
updated.pop("val_config", None)
8578
if "buffer_config" in updated and "buffer" not in updated:
8679
buffer_config = updated.pop("buffer_config")
8780
if isinstance(buffer_config, dict):

packages/prime/tests/test_lab_view.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1760,6 +1760,37 @@ def test_lab_view_training_config_uses_sampling_for_max_tokens() -> None:
17601760
HostedRLConfig.model_validate(parsed)
17611761

17621762

1763+
def test_lab_view_training_config_drops_deprecated_val_config() -> None:
1764+
config = _training_config_toml(
1765+
{
1766+
"base_model": "Qwen/Qwen3.5-2B",
1767+
"environments": ["primeintellect/alphabet-sort"],
1768+
"val_config": {"interval": 5},
1769+
}
1770+
)
1771+
1772+
parsed = toml.loads(config)
1773+
assert "val" not in parsed
1774+
HostedRLConfig.model_validate(parsed)
1775+
1776+
1777+
def test_config_builder_preserves_deprecated_val_for_schema_error() -> None:
1778+
config = {
1779+
"model": "Qwen/Qwen3.5-2B",
1780+
"env": [{"id": "primeintellect/alphabet-sort"}],
1781+
"val": {"interval": 5},
1782+
}
1783+
values = {
1784+
"config-model": "Qwen/Qwen3.5-2B",
1785+
"config-envs": "primeintellect/alphabet-sort",
1786+
}
1787+
1788+
build = build_config_from_fields(config, "rl", lambda field_id: values.get(field_id, ""))
1789+
1790+
assert "[val]" in build.toml_text
1791+
assert build.errors == ("val: Extra inputs are not permitted",)
1792+
1793+
17631794
def test_lab_config_factory_renders_shared_eval_and_rl_templates() -> None:
17641795
eval_toml = format_lab_config(
17651796
evaluation_config(env_id="primeintellect/wordle", num_examples=-1, max_tokens=None)

packages/prime/tests/test_rl_config.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ def test_generate_rl_config_template_keeps_default_surface_minimal() -> None:
5555

5656
assert 'model = "Qwen/Qwen3.5-0.8B"' in template
5757
assert "# learning_rate = 3e-5 # optional; default is 1e-4" in template
58+
assert "# [val]" not in template
59+
assert "validation during training" not in template.lower()
5860

5961
hidden_fields = [
6062
"oversampling_factor",
@@ -91,6 +93,18 @@ def test_flatten_config_schema_preserves_optional_array_item_types() -> None:
9193
assert rows["buffer.env_ratios"] == "list[number]"
9294

9395

96+
def test_load_config_rejects_deprecated_val_section(tmp_path: Path) -> None:
97+
config_path = tmp_path / "rl.toml"
98+
config_path.write_text(
99+
'model = "dummy"\n'
100+
"[val]\n"
101+
"interval = 5\n"
102+
)
103+
104+
with pytest.raises(typer.Exit):
105+
load_config(str(config_path))
106+
107+
94108
def test_load_config_accepts_sampling_reasoning_effort(tmp_path: Path) -> None:
95109
config_path = tmp_path / "rl.toml"
96110
config_path.write_text('model = "openai/gpt-oss-20b"\n[sampling]\nreasoning_effort = "high"\n')

packages/prime/tests/test_train_cli.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,15 @@ def test_train_init_defaults_to_rl_toml() -> None:
6565
assert Path("rl.toml").exists()
6666

6767

68+
def test_train_configs_omits_deprecated_val_section() -> None:
69+
result = runner.invoke(app, ["train", "configs", "--output", "json"], env=TEST_ENV)
70+
71+
assert result.exit_code == 0, result.output
72+
data = json.loads(result.stdout)
73+
sections = {item["section"] for item in data["configs"]}
74+
assert "val" not in sections
75+
76+
6877
def test_train_request_submits_model_request(monkeypatch) -> None:
6978
captured: dict[str, Any] = {}
7079

0 commit comments

Comments
 (0)