Make the proof suite say what it actually ran
The suite had fifteen checks that could not lose. The visual HashHop arena painted a cyan line and a white ring on the answer slot, then asked the model to find the answer by looking; the collector re-rolled puzzles until the running rate crossed its target; the cache check passed if any layer had ever recorded an entry; the repository check passed on a call graph built in memory without touching the store; the research-module check asserted non-empty lists of SHA256-derived placeholder vectors and so could not fail. Each check now answers for one claim and reports a verdict the reader can act on: passed, failed, deferred, or removed. A deferred row names what is missing and the command that would settle it; a removed row says why the old claim was withdrawn. The suite verdict is failed > deferred > passed, so a claim that never ran holds the whole report back from saying "proven". - evals.py (2427 lines) becomes the proofs/ package; largest module 445 lines. - proofs/__main__.py deleted: it duplicated PRDProofSuite.latest() with a different glob. proofs/table.py renders; latest-proof-suite is the one face and exits 1 on a failed verdict. - The arena paints nothing. The puzzle id is printed on its tile instead, because removing the ink without it removes the question. - HashHop runs a fixed 8 puzzles per depth instead of re-rolling to target. - The contradiction corpus moves from code to contradiction_scenarios.json; the check stays deferred while the corpus is the one this repo authored. - The cache check compiles a nonce question over a real atom twice and reads the miss to hit movement; an empty store fails instead of agreeing by luck. - The repository check requires rows in the store; the research-module check is removed. Two product bugs surfaced on the way: - text_index.fts_query joined Latin terms with a space, which FTS5 reads as AND, so a question longer than its answer retrieved nothing. Terms are ORed and bm25 rank orders the candidates. - profiles.windows_path_to_wsl prefixed /mnt/ onto an already-POSIX path with an empty drive, producing /mnt//home/... and failing every launcher probe. Verification: 168 passed (pytest backend/tests bench/tests); ruff clean on the proofs package, cli.py, text_index.py, profiles.py, and both test files; mypy clean on 16 files with a fresh cache; pyright reports 0 errors on proofs/ and the test file. Ruff debt elsewhere is unchanged: 19 errors in seven files this commit does not touch, measured against the same files at HEAD.
This commit is contained in:
1 parent
dfc6cd4c28
commit
4ab36cd5eb
27 files changed
+4284
-2453
No files matched your search
@@ -0,0 +1,358 @@
|
||||
"""Check that an adapter's training artifacts tell a consistent story.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import math
|
||||
from pathlib import Path
|
||||
from typing import Any
|
||||
|
||||
from ..schemas import (
|
||||
AdapterManifest,
|
||||
TrainingAdapterKind,
|
||||
)
|
||||
from ..training import (
|
||||
AUTOCAST_DTYPE,
|
||||
GRADIENT_CHECKPOINTING_MODE,
|
||||
TRAINING_FRAMEWORK,
|
||||
TRAINING_METHOD,
|
||||
TRAINING_PRECISION,
|
||||
TRAINING_PROOF_VERSION,
|
||||
safetensor_weight_stats,
|
||||
sha256_file,
|
||||
)
|
||||
|
||||
|
||||
def count_safetensor_keys(path: Path) -> int:
|
||||
return int(safetensor_weight_stats(path)["tensor_count"])
|
||||
|
||||
|
||||
def peft_config_loads(path: Path) -> bool:
|
||||
try:
|
||||
from peft import PeftConfig
|
||||
|
||||
PeftConfig.from_pretrained(str(path))
|
||||
return True
|
||||
except Exception: # noqa: BLE001 # a probe records its failure instead of crashing the proof run
|
||||
return False
|
||||
|
||||
|
||||
def validate_training_contract(manifest: AdapterManifest) -> dict[str, Any]:
|
||||
target_modules_ok = training_target_modules_ok(manifest.kind, manifest.target_modules)
|
||||
report = {
|
||||
"proof_version_ok": manifest.proof_version >= TRAINING_PROOF_VERSION,
|
||||
"method_ok": manifest.training_method == TRAINING_METHOD,
|
||||
"precision_ok": manifest.precision == TRAINING_PRECISION and manifest.bf16,
|
||||
"framework_ok": manifest.framework == TRAINING_FRAMEWORK,
|
||||
"optimizer_ok": manifest.optimizer == "paged_adamw_8bit",
|
||||
"optimizer_family_ok": manifest.optimizer_family == "8-bit AdamW / paged optimizer",
|
||||
"gradient_checkpointing_ok": (
|
||||
manifest.gradient_checkpointing
|
||||
and manifest.gradient_checkpointing_mode == GRADIENT_CHECKPOINTING_MODE
|
||||
),
|
||||
"autocast_dtype_ok": manifest.autocast_dtype == AUTOCAST_DTYPE,
|
||||
"unsloth_version_ok": bool(manifest.unsloth_version),
|
||||
"triton_version_ok": bool(manifest.triton_version),
|
||||
"xformers_version_ok": bool(manifest.xformers_version),
|
||||
"unsloth_model_type_ok": bool(manifest.unsloth_model_type),
|
||||
"max_length_ok": manifest.max_length >= 8192,
|
||||
"target_modules_ok": target_modules_ok,
|
||||
}
|
||||
report["valid"] = all(report.values())
|
||||
return report
|
||||
|
||||
|
||||
def training_target_modules_ok(kind: TrainingAdapterKind, target_modules: list[str]) -> bool:
|
||||
targets = set(target_modules)
|
||||
core = {"q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"}
|
||||
if kind == TrainingAdapterKind.hme_core_lora:
|
||||
return core.issubset(targets)
|
||||
if kind == TrainingAdapterKind.hme_vision_lora:
|
||||
return bool(targets) and any("visual" in target or "vision" in target for target in targets)
|
||||
if kind == TrainingAdapterKind.hme_ttt_vl:
|
||||
has_visual = any("visual" in target or "vision" in target for target in targets)
|
||||
has_mlp = bool({"gate_proj", "up_proj", "down_proj"} & targets)
|
||||
return has_visual and has_mlp
|
||||
if kind == TrainingAdapterKind.hme_visual_mtp:
|
||||
return any("mtp" in target or "draft" in target or target == "lm_head" for target in targets)
|
||||
if kind in {TrainingAdapterKind.hme_router, TrainingAdapterKind.hme_retrieval}:
|
||||
return core.issubset(targets)
|
||||
return False
|
||||
|
||||
|
||||
def training_payload_contract_ok(payload: dict[str, Any], manifest: AdapterManifest) -> bool:
|
||||
return (
|
||||
int(payload.get("proof_version") or 0) >= TRAINING_PROOF_VERSION
|
||||
and payload.get("training_method") == TRAINING_METHOD
|
||||
and payload.get("precision") == TRAINING_PRECISION
|
||||
and payload.get("framework") == TRAINING_FRAMEWORK
|
||||
and payload.get("optimizer_family") == manifest.optimizer_family
|
||||
and bool(payload.get("gradient_checkpointing"))
|
||||
and payload.get("gradient_checkpointing_mode") == GRADIENT_CHECKPOINTING_MODE
|
||||
and payload.get("autocast_dtype") == AUTOCAST_DTYPE
|
||||
and payload.get("unsloth_version") == manifest.unsloth_version
|
||||
and payload.get("triton_version") == manifest.triton_version
|
||||
and payload.get("xformers_version") == manifest.xformers_version
|
||||
and payload.get("unsloth_model_type") == manifest.unsloth_model_type
|
||||
)
|
||||
|
||||
|
||||
def validate_training_trace(manifest: AdapterManifest, adapter_root: Path) -> dict[str, Any]:
|
||||
trace_path = adapter_root / "training_trace.jsonl"
|
||||
summary_path = adapter_root / "training_summary.json"
|
||||
report: dict[str, Any] = {
|
||||
"trace_path": str(trace_path),
|
||||
"summary_path": str(summary_path),
|
||||
"trace_exists": trace_path.exists(),
|
||||
"summary_exists": summary_path.exists(),
|
||||
"trace_sha256_ok": False,
|
||||
"summary_sha256_ok": False,
|
||||
"step_records": 0,
|
||||
"loss_history_records": len(manifest.loss_history),
|
||||
"loss_history_ok": False,
|
||||
"summary_matches_manifest": False,
|
||||
"summary_contract_ok": False,
|
||||
"run_start_contract_ok": False,
|
||||
"run_finish_contract_ok": False,
|
||||
"cuda_training": False,
|
||||
"bf16_supported": False,
|
||||
"bf16": manifest.bf16,
|
||||
"valid": False,
|
||||
}
|
||||
if not trace_path.exists() or not summary_path.exists():
|
||||
return report
|
||||
try:
|
||||
trace_rows = [
|
||||
json.loads(line)
|
||||
for line in trace_path.read_text(encoding="utf-8").splitlines()
|
||||
if line.strip()
|
||||
]
|
||||
summary = json.loads(summary_path.read_text(encoding="utf-8"))
|
||||
except json.JSONDecodeError:
|
||||
return report
|
||||
|
||||
step_rows = [row for row in trace_rows if row.get("event") == "step"]
|
||||
start_row: dict[str, Any] = next((row for row in trace_rows if row.get("event") == "run_start"), {})
|
||||
finish_row: dict[str, Any] = next(
|
||||
(row for row in reversed(trace_rows) if row.get("event") == "run_finish"), {}
|
||||
)
|
||||
losses = [row.get("loss") for row in step_rows]
|
||||
finite_losses = all(isinstance(loss, (int, float)) and math.isfinite(float(loss)) for loss in losses)
|
||||
final_loss_ok = (
|
||||
manifest.final_loss is not None
|
||||
and bool(losses)
|
||||
and abs(float(losses[-1]) - float(manifest.final_loss)) < 1e-6
|
||||
)
|
||||
report.update(
|
||||
{
|
||||
"trace_sha256_ok": (
|
||||
manifest.training_trace_sha256 is not None
|
||||
and sha256_file(trace_path) == manifest.training_trace_sha256
|
||||
),
|
||||
"summary_sha256_ok": (
|
||||
manifest.training_summary_sha256 is not None
|
||||
and sha256_file(summary_path) == manifest.training_summary_sha256
|
||||
),
|
||||
"step_records": len(step_rows),
|
||||
"loss_history_ok": (
|
||||
len(manifest.loss_history) == manifest.max_steps
|
||||
and finite_losses
|
||||
and final_loss_ok
|
||||
),
|
||||
"summary_matches_manifest": (
|
||||
summary.get("adapter_kind") == manifest.kind.value
|
||||
and summary.get("base_model") == manifest.base_model
|
||||
and summary.get("dataset_sha256") == manifest.dataset_sha256
|
||||
and int(summary.get("max_steps") or -1) == manifest.max_steps
|
||||
and int(summary.get("trainable_params") or -1) == manifest.trainable_params
|
||||
),
|
||||
"summary_contract_ok": training_payload_contract_ok(summary, manifest),
|
||||
"run_start_contract_ok": training_payload_contract_ok(start_row, manifest),
|
||||
"run_finish_contract_ok": training_payload_contract_ok(finish_row, manifest),
|
||||
}
|
||||
)
|
||||
environment = summary.get("environment") if isinstance(summary.get("environment"), dict) else {}
|
||||
device_name = str(environment.get("device_name") or "")
|
||||
report["cuda_training"] = bool(environment.get("cuda_available")) and "RTX 4090" in device_name
|
||||
report["bf16_supported"] = bool(environment.get("bf16_supported"))
|
||||
report["valid"] = (
|
||||
report["trace_sha256_ok"]
|
||||
and report["summary_sha256_ok"]
|
||||
and report["step_records"] == manifest.max_steps
|
||||
and report["loss_history_ok"]
|
||||
and report["summary_matches_manifest"]
|
||||
and report["summary_contract_ok"]
|
||||
and report["run_start_contract_ok"]
|
||||
and report["run_finish_contract_ok"]
|
||||
and report["cuda_training"]
|
||||
and report["bf16_supported"]
|
||||
and manifest.bf16
|
||||
)
|
||||
return report
|
||||
|
||||
|
||||
def validate_training_proof(manifest: AdapterManifest, adapter_root: Path) -> dict[str, Any]:
|
||||
proof_path = adapter_root / "training_proof.json"
|
||||
report: dict[str, Any] = {
|
||||
"proof_path": str(proof_path),
|
||||
"proof_exists": proof_path.exists(),
|
||||
"proof_sha256_ok": False,
|
||||
"hash_changed": False,
|
||||
"optimizer_update_count": manifest.optimizer_update_count,
|
||||
"optimizer_update_count_ok": False,
|
||||
"max_optimizer_update_l2": manifest.max_optimizer_update_l2,
|
||||
"max_optimizer_update_l2_ok": False,
|
||||
"loss_delta": manifest.loss_delta,
|
||||
"loss_delta_finite": False,
|
||||
"updates_have_gradients": False,
|
||||
"updates_have_weight_delta": False,
|
||||
"proof_weight_sha256_ok": False,
|
||||
"proof_weight_stats_ok": False,
|
||||
"proof_cuda_bf16": False,
|
||||
"proof_bf16_supported": False,
|
||||
"proof_contract_ok": False,
|
||||
"proof_optimizer_ok": False,
|
||||
"proof_max_length_ok": False,
|
||||
"proof_target_modules_ok": False,
|
||||
"proof_unsloth_runtime_ok": False,
|
||||
"proof_matches_manifest": False,
|
||||
"valid": False,
|
||||
}
|
||||
if not proof_path.exists():
|
||||
return report
|
||||
try:
|
||||
proof = json.loads(proof_path.read_text(encoding="utf-8"))
|
||||
except json.JSONDecodeError:
|
||||
return report
|
||||
|
||||
updates = proof.get("optimizer_updates") if isinstance(proof.get("optimizer_updates"), list) else []
|
||||
update_l2_values = [
|
||||
float(value)
|
||||
for item in updates
|
||||
if isinstance(item, dict) and isinstance(value := item.get("update_l2"), (int, float))
|
||||
]
|
||||
gradient_l2_values = [
|
||||
float(value)
|
||||
for item in updates
|
||||
if isinstance(item, dict) and isinstance(value := item.get("gradient_l2"), (int, float))
|
||||
]
|
||||
weight_report = safetensor_weight_stats(adapter_root / "adapter_model.safetensors")
|
||||
proof_weight_stats = proof.get("adapter_weight_stats") if isinstance(proof.get("adapter_weight_stats"), dict) else {}
|
||||
proof_environment = proof.get("environment") if isinstance(proof.get("environment"), dict) else {}
|
||||
report.update(
|
||||
{
|
||||
"proof_sha256_ok": (
|
||||
manifest.training_proof_sha256 is not None
|
||||
and sha256_file(proof_path) == manifest.training_proof_sha256
|
||||
),
|
||||
"hash_changed": (
|
||||
bool(manifest.initial_trainable_sha256)
|
||||
and bool(manifest.final_trainable_sha256)
|
||||
and manifest.initial_trainable_sha256 != manifest.final_trainable_sha256
|
||||
),
|
||||
"optimizer_update_count_ok": (
|
||||
manifest.optimizer_update_count > 0
|
||||
and len(updates) == manifest.optimizer_update_count
|
||||
),
|
||||
"max_optimizer_update_l2_ok": (
|
||||
manifest.max_optimizer_update_l2 is not None
|
||||
and math.isfinite(float(manifest.max_optimizer_update_l2))
|
||||
and float(manifest.max_optimizer_update_l2) > 0.0
|
||||
),
|
||||
"loss_delta_finite": (
|
||||
manifest.loss_delta is not None
|
||||
and math.isfinite(float(manifest.loss_delta))
|
||||
),
|
||||
"updates_have_gradients": bool(gradient_l2_values)
|
||||
and all(math.isfinite(value) and value > 0.0 for value in gradient_l2_values),
|
||||
"updates_have_weight_delta": bool(update_l2_values)
|
||||
and all(math.isfinite(value) and value > 0.0 for value in update_l2_values),
|
||||
"proof_weight_sha256_ok": (
|
||||
isinstance(proof.get("adapter_weight_sha256"), str)
|
||||
and proof.get("adapter_weight_sha256") == weight_report["sha256"]
|
||||
),
|
||||
"proof_weight_stats_ok": (
|
||||
proof_weight_stats.get("sha256") == weight_report["sha256"]
|
||||
and proof_weight_stats.get("tensor_count") == weight_report["tensor_count"]
|
||||
and proof_weight_stats.get("lora_tensor_count") == weight_report["lora_tensor_count"]
|
||||
and proof_weight_stats.get("total_elements") == weight_report["total_elements"]
|
||||
and proof_weight_stats.get("nonzero_elements") == weight_report["nonzero_elements"]
|
||||
and int(proof_weight_stats.get("lora_tensor_count") or 0) > 0
|
||||
and int(proof_weight_stats.get("nonzero_elements") or 0) > 0
|
||||
and bool(proof_weight_stats.get("all_finite"))
|
||||
),
|
||||
"proof_cuda_bf16": (
|
||||
bool(proof.get("bf16"))
|
||||
and bool(proof_environment.get("cuda_available"))
|
||||
and "RTX 4090" in str(proof_environment.get("device_name") or "")
|
||||
),
|
||||
"proof_bf16_supported": bool(proof_environment.get("bf16_supported")),
|
||||
"proof_contract_ok": training_payload_contract_ok(proof, manifest),
|
||||
"proof_optimizer_ok": proof.get("optimizer") == "paged_adamw_8bit",
|
||||
"proof_max_length_ok": int(proof.get("max_length") or 0) >= 8192,
|
||||
"proof_target_modules_ok": training_target_modules_ok(
|
||||
manifest.kind,
|
||||
proof.get("target_modules") if isinstance(proof.get("target_modules"), list) else [],
|
||||
),
|
||||
"proof_unsloth_runtime_ok": (
|
||||
bool(proof.get("unsloth_version"))
|
||||
and bool(proof.get("triton_version"))
|
||||
and bool(proof.get("xformers_version"))
|
||||
and bool(proof.get("unsloth_model_type"))
|
||||
),
|
||||
"proof_matches_manifest": (
|
||||
proof.get("adapter_kind") == manifest.kind.value
|
||||
and proof.get("proof_version") == manifest.proof_version
|
||||
and proof.get("training_method") == manifest.training_method
|
||||
and proof.get("precision") == manifest.precision
|
||||
and proof.get("framework") == manifest.framework
|
||||
and proof.get("base_model") == manifest.base_model
|
||||
and proof.get("dataset_sha256") == manifest.dataset_sha256
|
||||
and proof.get("sample_count") == manifest.sample_count
|
||||
and proof.get("max_steps") == manifest.max_steps
|
||||
and proof.get("max_length") == manifest.max_length
|
||||
and proof.get("rank") == manifest.rank
|
||||
and proof.get("alpha") == manifest.alpha
|
||||
and proof.get("target_modules") == manifest.target_modules
|
||||
and proof.get("optimizer") == manifest.optimizer
|
||||
and proof.get("optimizer_family") == manifest.optimizer_family
|
||||
and proof.get("learning_rate") == manifest.learning_rate
|
||||
and proof.get("gradient_accumulation_steps") == manifest.gradient_accumulation_steps
|
||||
and proof.get("gradient_checkpointing") == manifest.gradient_checkpointing
|
||||
and proof.get("gradient_checkpointing_mode") == manifest.gradient_checkpointing_mode
|
||||
and proof.get("autocast_dtype") == manifest.autocast_dtype
|
||||
and proof.get("unsloth_version") == manifest.unsloth_version
|
||||
and proof.get("triton_version") == manifest.triton_version
|
||||
and proof.get("xformers_version") == manifest.xformers_version
|
||||
and proof.get("unsloth_model_type") == manifest.unsloth_model_type
|
||||
and proof.get("bf16") == manifest.bf16
|
||||
and proof.get("trainable_params") == manifest.trainable_params
|
||||
and proof.get("total_params") == manifest.total_params
|
||||
and proof.get("initial_trainable_sha256") == manifest.initial_trainable_sha256
|
||||
and proof.get("final_trainable_sha256") == manifest.final_trainable_sha256
|
||||
and proof.get("optimizer_update_count") == manifest.optimizer_update_count
|
||||
and proof.get("max_optimizer_update_l2") == manifest.max_optimizer_update_l2
|
||||
),
|
||||
}
|
||||
)
|
||||
report["valid"] = (
|
||||
report["proof_sha256_ok"]
|
||||
and report["hash_changed"]
|
||||
and report["optimizer_update_count_ok"]
|
||||
and report["max_optimizer_update_l2_ok"]
|
||||
and report["loss_delta_finite"]
|
||||
and report["updates_have_gradients"]
|
||||
and report["updates_have_weight_delta"]
|
||||
and report["proof_weight_sha256_ok"]
|
||||
and report["proof_weight_stats_ok"]
|
||||
and report["proof_cuda_bf16"]
|
||||
and report["proof_bf16_supported"]
|
||||
and report["proof_contract_ok"]
|
||||
and report["proof_optimizer_ok"]
|
||||
and report["proof_max_length_ok"]
|
||||
and report["proof_target_modules_ok"]
|
||||
and report["proof_unsloth_runtime_ok"]
|
||||
and report["proof_matches_manifest"]
|
||||
)
|
||||
return report
|
||||
Reference in new issue
Block a user