vidaio-subnet / scripts /real_validator_score_test.py
silvanus930
Session: AV1/HEVC CQ table fixes, VBR NVENC tuning, secant-based adaptive search, dashboard reset mechanism
bc6f62c
Raw History Blame Contribute Delete
5.28 kB
#!/usr/bin/env python3
"""Score our own compressed outputs using the REAL validator-side scoring
code (services/scoring/server.py's score_compression_synthetics), not a
hand-ported estimate. This repo already contains that code -- it's not
exclusive to validator infrastructure -- so we can call the literal
function directly instead of guessing whether our own port matches it.
This catches things a hand-ported formula never could: the real pipeline
also runs encoding-settings validation (codec profile, pixel format, SAR,
container, color tags) and frame-count/color/chroma checks *before* VMAF is
even computed. Any of those failing zeroes the score regardless of how good
the compression/VMAF tradeoff is -- and we've never verified locally that
our own outputs pass them.
`pieapp_metric` (only used for upscaling scoring) isn't installed in this
environment, so a stub is put on sys.path -- server.py imports it
unconditionally at module load even though compression scoring never calls
it.
Usage:
python3 scripts/real_validator_score_test.py --limit 3
"""
import argparse
import asyncio
import json
import subprocess
import sys
import time
from pathlib import Path
REPO = Path("/root/vidaio-subnet")
SHIM_DIR = Path("/tmp/vidaio-real-scoring-shim")
LIBRARY_PATH = Path("/root/vidaio-real-content-library")
sys.path.insert(0, str(SHIM_DIR))
sys.path.insert(0, str(REPO))
sys.path.insert(0, str(REPO / "services" / "scoring"))
from services.scoring.server import ( # noqa: E402
CompressionScoringRequest,
score_compression_synthetics,
)
def compress_via_service(
service_url: str, container_mp4_path: str, meta: dict
) -> dict | None:
"""Runs the clip through the real production /compress path (adaptive
CQ search included -- no explicit cq override), exactly like a live
validator request would."""
payload = {
"video_paths": [container_mp4_path],
"codec": meta["codec"].upper(),
"codec_mode": meta.get("codec_mode") or "CRF",
"vmaf_threshold": meta["vmaf_threshold"],
"target_bitrate": int(float(meta.get("target_bitrate") or 5) * 1_000_000),
}
result = subprocess.run(
["curl", "-s", "-X", "POST", f"{service_url}/compress",
"-H", "Content-Type: application/json", "-d", json.dumps(payload)],
capture_output=True, text=True, timeout=240,
)
try:
resp = json.loads(result.stdout)
except json.JSONDecodeError:
print(f" bad response: {result.stdout[:200]}")
return None
if not resp.get("success"):
print(f" compress failed: {resp.get('errors') or resp.get('detail')}")
return None
return resp
async def score_one(
host_output_dir: Path,
container_output_prefix: str,
mp4_path: Path,
meta: dict,
resp: dict,
) -> None:
container_out = resp["output_paths"][0]
output_path = host_output_dir / Path(container_out).relative_to(container_output_prefix)
if not output_path.exists():
print(f" output missing on host: {output_path}")
return
request = CompressionScoringRequest(
distorted_file_paths=[str(output_path)],
reference_paths=[str(mp4_path)],
uids=[21],
video_ids=[meta["task_id"]],
uploaded_object_names=[""],
vmaf_thresholds=[meta["vmaf_threshold"]],
target_codec=meta["codec"],
codec_mode=meta.get("codec_mode") or "CRF",
target_bitrate=float(meta.get("target_bitrate") or 5),
)
result = await score_compression_synthetics(request)
r = result.model_dump() if hasattr(result, "model_dump") else result.dict()
print(
f" REAL SCORE vmaf={r['vmaf_scores'][0]:.2f} "
f"ratio={r['compression_rates'][0]:.4f} "
f"score={r['final_scores'][0]:.4f} "
f"reason={r['reasons'][0]}"
)
async def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--service-url", default="http://localhost:8004")
parser.add_argument("--container-output-prefix", default="/tmp/organic-proxy")
parser.add_argument("--host-output-dir", default="/tmp/vidaio-miner-video-tmp")
parser.add_argument("--container-library-path", default="/tmp/organic-proxy/calib-library")
parser.add_argument("--library-path", default=str(LIBRARY_PATH))
parser.add_argument("--limit", type=int, default=3)
args = parser.parse_args()
clips = []
for mp4_path in sorted(Path(args.library_path).glob("*.mp4")):
meta_path = Path(f"{mp4_path}.json")
if not meta_path.exists():
continue
meta = json.loads(meta_path.read_text())
clips.append((mp4_path, meta))
clips = clips[: args.limit]
host_output_dir = Path(args.host_output_dir)
for mp4_path, meta in clips:
print(f"[{meta['task_id']}] codec={meta['codec']} thr={meta['vmaf_threshold']}")
container_mp4_path = f"{args.container_library_path}/{mp4_path.name}"
resp = compress_via_service(args.service_url, container_mp4_path, meta)
if resp is None:
continue
await score_one(
host_output_dir, args.container_output_prefix, mp4_path, meta, resp
)
return 0
if __name__ == "__main__":
sys.exit(asyncio.run(main()))