Files
2026-09-30 13:18:18 +08:00

67 lines
3.3 KiB
Python

"""One registered AK action per fresh process; no changes to frozen runtimes."""
import argparse
import json
import os
import urllib.request
from context import ROOT, EXP, CFG, check, budget, read
import runtime_bridge as bridge
def preflight():
# Establish visibility before the lazy runtime/component Torch import.
os.environ['CUDA_VISIBLE_DEVICES'] = CFG['gpu_uuid']
os.environ['CUDA_HOME'] = '/usr/local/cuda'
os.environ['PATH'] = str(ROOT / 'models/male-cns-lif/.venv/bin') + ':/usr/local/cuda/bin:' + os.environ['PATH']
os.environ['MAX_JOBS'] = '2'
os.environ['TORCH_CUDA_ARCH_LIST'] = '8.9'
for port in (8188, 8189, 8190):
with urllib.request.urlopen(f'http://192.168.10.51:{port}/queue', timeout=5) as response:
queue = json.load(response)
bridge.require(not queue['queue_running'] and not queue['queue_pending'], 'ComfyUI busy: defer, never evict')
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('backend', choices=['gpu', 'oracle', 'component'])
parser.add_argument('group', choices=bridge.GROUPS)
parser.add_argument('case')
parser.add_argument('--repeat', type=int, default=0)
args = parser.parse_args()
check(); budget()
row = bridge.authorize_case(EXP, CFG, args.group, args.case, args.backend, args.repeat)
case = EXP / 'cases' / args.group / args.case
spec = bridge.case_spec(case)
bridge.require(spec['name'] == args.case and spec['budget_root'] == str(EXP) and
spec['output_budget_bytes'] == CFG['output_budget_bytes'], 'Case identity/new budget differs')
if args.group == 'controls':
bridge.control_inputs(case, row['source_case'])
else:
bridge.require(spec.get('kind') == 'fullgraph' and spec.get('validation_cohort') == args.group and
all(spec[key] == row[key] for key in ('mode', 'odor_id', 'odor_index', 'seed')),
'New fullgraph case differs from its registered cohort cell')
output = EXP / 'gpu' / args.group / f'{args.case}-r{args.repeat}'
if args.backend == 'component':
summary = read(output / 'summary.json')
bridge.require(summary.get('complete') is True and summary.get('pass_all') is True and
summary.get('case') == args.case and summary.get('apl_delay_steps') == 18,
'Component audit needs a complete matching D18 GPU run')
preflight()
def execute():
if args.backend == 'gpu':
result = bridge.run_gpu(case, output, EXP / 'extension-build')
elif args.backend == 'oracle':
result = bridge.run_oracle(case, EXP / 'oracle' / args.group / args.case)
else:
result = bridge.component(output, spec['apl_bundle_dir'], EXP / 'component-audit' / args.group / (args.case + '.json'))
budget()
bridge.require(result.get('pass_all') is True, 'Runtime/component evidence did not pass its own integrity checks')
return result
result = bridge.guarded_action(EXP, args.backend, args.group, args.case, args.repeat, execute)
print(json.dumps(dict(backend=args.backend, group=args.group, case=args.case, repeat=args.repeat,
complete=result.get('complete'), pass_all=result.get('pass_all')), allow_nan=False), flush=True)
if __name__ == '__main__':
main()