Files
CelerisLab/tests/validation/multigrid/local_stress_v1_evidence/run_once.py
T

85 lines
4.2 KiB
Python

"""Bounded execution recorder; refuses to overwrite evidence or repeat a run."""
import datetime
import hashlib
import importlib.metadata
import json
import os
from pathlib import Path
import platform
import resource
import shlex
import subprocess
import sys
import time
evidence = Path(__file__).resolve().parent
base = evidence.parent
script = base / "local_stress_observable_v1.py"
reference = base / "cpu_reference.py"
expected_env = {
"OPENBLAS_NUM_THREADS": "1",
"PYTHONDONTWRITEBYTECODE": "1",
"PYTHONNOUSERSITE": "1",
"PYTHONOPTIMIZE": "0",
"PYTHONPATH": str(base),
"CPU_REFERENCE_PATH": str(reference),
}
limits = {
"address_space_bytes": (resource.RLIMIT_AS, 268435456),
"output_file_bytes": (resource.RLIMIT_FSIZE, 2097152),
"core_bytes": (resource.RLIMIT_CORE, 0),
}
assert all(os.environ.get(k) == v for k, v in expected_env.items())
assert all(resource.getrlimit(key) == (value, value) for key, value in limits.values())
assert sys.executable == "/home/frank14f/anaconda3/envs/pycuda_3_10/bin/python"
assert hashlib.sha256(script.read_bytes()).hexdigest() == "0e2777990359a7cf2bb29884173b7b01de37c49bcf49e1f29fc59fe83d62b456"
assert hashlib.sha256(reference.read_bytes()).hexdigest() == "bba2a06a9f6517b32079ffff15e4060d8c3b7ed35f16ca134e1877226c9e4e1e"
input_hashes = {'local_stress_observable_v1.py': '0e2777990359a7cf2bb29884173b7b01de37c49bcf49e1f29fc59fe83d62b456', 'stdout_local_stress_observable_v1.txt': '6a826e5ad729ce45af6879a07a1c659d8b4a21403fde5b9c6d9696cc6a5b09d4', 'TABLE_local_stress_observable_v1.md': 'd8ff0568d9c473a4bb09396a8948ddc8dc5af2f0f3a23ac84d238814fc779501', 'source_manifest.json': 'd2cf90b73458f493c665c9a281d06aef0c190cf0d143639fb77ab838c78f020c'}
for name, digest in input_hashes.items():
path = (base if name.endswith(".py") else evidence) / name
assert hashlib.sha256(path.read_bytes()).hexdigest() == digest, name
archive_path = Path("/tmp/celerislab-local-stress-input-20261013-0e277799.tar")
archive_sha = "5834b23711496beb152188df5f47ff8175baf7e52543774401bd2c1183433eed"
assert hashlib.sha256(archive_path.read_bytes()).hexdigest() == archive_sha
log_path = evidence / "stdout_horsea.txt"
result_path = evidence / "results_horsea.json"
assert not log_path.exists() and not result_path.exists(), "Existing execution evidence; do not rerun"
prefix = ["/usr/bin/prlimit", "--as=268435456", "--fsize=2097152", "--core=0", "--", sys.executable, "-B"]
command = prefix + [str(script)]
report = {
"started_utc": datetime.datetime.now(datetime.timezone.utc).isoformat(),
"cwd": str(base),
"parent_command": ["env"] + [f"{k}={v}" for k, v in expected_env.items()] + prefix + [str(Path(__file__).resolve())],
"script_command": command,
"environment": expected_env,
"python_version": sys.version,
"numpy_version_from_installed_metadata": importlib.metadata.version("numpy"),
"platform": platform.platform(),
"hard_limits": {name: resource.getrlimit(key) for name, (key, _) in limits.items()},
"input_hashes_verified_before_execution": input_hashes,
"archive_sha256_verified_before_execution": archive_sha,
"reference_sha256_verified_before_execution": hashlib.sha256(reference.read_bytes()).hexdigest(),
"planned_runs": 7,
"coarse_steps_per_run": 32,
"attempt": 1,
}
with log_path.open("xb", buffering=0) as log:
log.write(("RECORDER " + json.dumps(report) + "\nCOMMAND " + shlex.join(command) + "\n").encode())
start = time.monotonic()
child = subprocess.run(command, cwd=base, stdout=log, stderr=subprocess.STDOUT, check=False)
report.update(
returncode=child.returncode,
elapsed_seconds=time.monotonic() - start,
child_peak_rss_MiB=resource.getrusage(resource.RUSAGE_CHILDREN).ru_maxrss / 1024,
parent_peak_rss_MiB=resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1024,
completed_utc=datetime.datetime.now(datetime.timezone.utc).isoformat(),
)
log.write(("\nRUN_RESULT " + json.dumps(report) + "\n").encode())
report["stdout_bytes"] = log_path.stat().st_size
with result_path.open("x") as result:
json.dump(report, result, indent=2)
result.write("\n")
print(json.dumps(report, indent=2))
assert report["stdout_bytes"] < 2097152
sys.exit(child.returncode if child.returncode >= 0 else 1)