| |
| from __future__ import annotations |
|
|
| import argparse |
| import json |
| import os |
| import subprocess |
| from pathlib import Path |
|
|
|
|
| ROOT = Path(__file__).resolve().parents[1] |
|
|
|
|
| def require(path: Path, min_bytes: int = 1) -> None: |
| if not path.is_file() or path.stat().st_size < min_bytes: |
| raise FileNotFoundError(f"missing or truncated: {path}") |
|
|
|
|
| def main() -> None: |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--checksums", action="store_true") |
| parser.add_argument("--materialized", action="store_true") |
| args = parser.parse_args() |
|
|
| required = { |
| ROOT / "data/covt/data.json": 100_000_000, |
| ROOT / "checkpoints/stage1/checkpoint-32000.bin": 1_000_000_000, |
| ROOT / "models/base/Qwen3-VL-4B-Instruct/model-00001-of-00002.safetensors": 4_000_000_000, |
| ROOT / "models/base/Qwen3-VL-4B-Instruct/model-00002-of-00002.safetensors": 3_000_000_000, |
| ROOT / "models/teachers/sam_vit_h_4b8939.pth": 2_000_000_000, |
| ROOT / "models/teachers/VGGT-1B/model.pt": 4_000_000_000, |
| ROOT / "models/teachers/table5_baseline.pth": 1_000_000, |
| ROOT / "models/teachers/siglip2-large-patch16-256/model.safetensors": 3_000_000_000, |
| ROOT / "models/teachers/dinov2-large-processor/preprocessor_config.json": 100, |
| ROOT / "cache/torch/hub/checkpoints/dinov2_vitl14_pretrain.pth": 1_000_000_000, |
| ROOT / "cache/torch/hub/facebookresearch_dinov2_main/hubconf.py": 1_000, |
| ROOT / "environment/unvideo-conda.tar.gz": 1_000_000_000, |
| } |
| for path, size in required.items(): |
| require(path, size) |
|
|
| stats = json.loads((ROOT / "data/covt/stats.json").read_text(encoding="utf-8")) |
| shards = sorted((ROOT / "data/covt/shards").glob("images-*.tar")) |
| if len(shards) != stats["shard_count"]: |
| raise AssertionError(f"shard count {len(shards)} != {stats['shard_count']}") |
| for shard in shards: |
| require(Path(f"{shard}.sha256"), 64) |
| if args.materialized: |
| image_count = sum(1 for path in (ROOT / "data/covt/images").iterdir() if path.is_file()) |
| if image_count != stats["image_count"]: |
| raise AssertionError(f"image count {image_count} != {stats['image_count']}") |
| if args.checksums: |
| subprocess.run(["sha256sum", "-c", "MANIFEST.sha256"], cwd=ROOT, check=True) |
|
|
| config = ROOT / "configs/stage2_covt.yaml" |
| if not config.is_file(): |
| subprocess.run([str(ROOT / ".env/unvideo/bin/python"), str(ROOT / "scripts/render_config.py")], check=True) |
| env = os.environ.copy() |
| env["PYTHONPATH"] = ":".join( |
| [ |
| str(ROOT / "code/umm/runtime"), |
| str(ROOT / "code/umm"), |
| str(ROOT / "third_party/transformers/src"), |
| str(ROOT / "third_party/diffusers/src"), |
| ] |
| ) |
| env["UMM_STAGE2_CONFIG"] = str(config) |
| subprocess.run( |
| [str(ROOT / ".env/unvideo/bin/python"), str(ROOT / "code/umm/stage2_covt/validate_setup.py")], |
| cwd=ROOT, |
| env=env, |
| check=True, |
| ) |
| print("UMM Stage-2 bundle validation passed") |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|