File size: 2,880 Bytes
f6588d9 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | """Verify the exact Python/CUDA package surface used by the runtime."""
from __future__ import annotations
import hashlib
import importlib
import importlib.metadata
import json
import sys
from pathlib import Path
from typing import Any
EXPECTED_PYTHON = (3, 11)
EXPECTED_PACKAGES = {
"av": "18.1.0",
"decord": "0.6.0",
"ms-swift": "4.5.2",
"numpy": "2.3.5",
"opencv-python-headless": "5.0.0.93",
"Pillow": "10.4.0",
"qwen-vl-utils": "0.0.14",
"torch": "2.11.0+cu130",
"transformers": "5.15.1",
"vllm": "0.26.0",
}
IMPORT_NAMES = {
"av": "av",
"decord": "decord",
"ms-swift": "swift",
"numpy": "numpy",
"opencv-python-headless": "cv2",
"Pillow": "PIL",
"qwen-vl-utils": "qwen_vl_utils",
"torch": "torch",
"transformers": "transformers",
"vllm": "vllm",
}
def _sha256(path: Path) -> str:
digest = hashlib.sha256()
with path.open("rb") as handle:
for block in iter(lambda: handle.read(8 * 1024 * 1024), b""):
digest.update(block)
return digest.hexdigest()
def verify_runtime() -> dict[str, Any]:
"""Import every direct runtime dependency and bind native OpenCV bytes."""
if sys.version_info[:2] != EXPECTED_PYTHON:
raise RuntimeError(
f"Python version changed: {sys.version_info[:2]} != {EXPECTED_PYTHON}"
)
versions = {name: importlib.metadata.version(name) for name in EXPECTED_PACKAGES}
if versions != EXPECTED_PACKAGES:
raise RuntimeError(
f"direct package versions changed: {versions} != {EXPECTED_PACKAGES}"
)
modules = {
name: importlib.import_module(module_name)
for name, module_name in IMPORT_NAMES.items()
}
torch = modules["torch"]
if torch.version.cuda != "13.0":
raise RuntimeError(f"Torch CUDA build changed: {torch.version.cuda!r}")
cv2_root = (
Path(modules["opencv-python-headless"].__file__).resolve(strict=True).parent
)
native_candidates = sorted(cv2_root.glob("cv2*.so"))
if len(native_candidates) != 1 or not native_candidates[0].is_file():
raise RuntimeError(
f"expected one OpenCV native extension, found {native_candidates}"
)
native = native_candidates[0]
return {
"schema_version": "procedure.ep15_merged3225.runtime_verify.v1",
"status": "PASS",
"python": sys.version.split()[0],
"packages": versions,
"torch_cuda": torch.version.cuda,
"opencv": {
"module_root": str(cv2_root),
"native_path": str(native),
"native_bytes": native.stat().st_size,
"native_sha256": _sha256(native),
},
}
def main() -> int:
print(json.dumps(verify_runtime(), ensure_ascii=False, sort_keys=True))
return 0
if __name__ == "__main__":
raise SystemExit(main())
|