Isolate semantic planner environment and report preparation-inclusive latency

This commit is contained in:
firestar5683
2026-09-19 13:59:33 -07:00
parent 2b6fd43fa4
commit e5f344a04f
4 changed files with 35 additions and 2 deletions
+9 -1
View File
@@ -21,7 +21,15 @@ def start_planner(launch, env, out, roadscore, bench, native=False):
if not python.is_file():raise RuntimeError('Existing Mac ACE preparation environment missing: '+str(python))
env['ROADSCORE_PLANNER_TOKEN']=secrets.token_urlsafe(32)
ready=out/'planner_ready.json'
planner=launch([str(python),str(roadscore/'prototype/hook_service.py'),'--assets-root',str(assets),'--cache',str(assets/'cache/hook-plans-v2'),'--ready',str(ready)],'semantic_planner')
previous={key:env.get(key) for key in ('PYTHONPATH','PYTORCH_ENABLE_MPS_FALLBACK')}
try:
env['PYTHONPATH']=os.pathsep.join(str(roadscore/path) for path in ('prototype','experiments/ace_chestnut_20260916'))
env['PYTORCH_ENABLE_MPS_FALLBACK']='1'
planner=launch([str(python),str(roadscore/'prototype/hook_service.py'),'--assets-root',str(assets),'--cache',str(assets/'cache/hook-plans-v2'),'--ready',str(ready)],'semantic_planner')
finally:
for key,value in previous.items():
if value is None:env.pop(key,None)
else:env[key]=value
deadline=time.monotonic()+300
while not ready.exists():
if planner.poll() is not None or time.monotonic()>deadline:raise RuntimeError('Host semantic planner failed; see semantic_planner.log')
@@ -43,6 +43,8 @@ class PlannedComposition:
if len(committed)!=frames*1920 or z.shape[1]!=frames:raise ValueError('Native sampler returned incomplete planned window')
model_duration=stats['duration'];duration=frames/25;new=duration-stats['prefix_seconds']
if new<=0 or not np.isfinite(committed).all():raise ValueError('Invalid committed planned audio')
end_to_end=self.pending['host_preparation_seconds']+stats.get('wall_seconds',stats['generation_seconds']+stats['decode_seconds'])
stats.update(end_to_end_seconds=end_to_end,end_to_end_rtf_new_audio=end_to_end/new)
stats.update(self.pending,case=role,prepared_profile=self.profile,model_duration=model_duration,duration=duration,new_seconds=new,discarded_lookahead_seconds=model_duration-duration,endpoint=endpoint,composition_policy='hook-v2',preparation_host='authenticated host semantic planner',warm_rtf_new_audio=(stats['generation_seconds']+stats['decode_seconds'])/new)
return committed,z,stats
def accept(self,wave,latent):
+22 -1
View File
@@ -1,9 +1,30 @@
import unittest
from hook_launch import enabled
import tempfile
import json
from pathlib import Path
from types import SimpleNamespace
from hook_launch import enabled,start_planner
from prepared_session import verify
from session_seed import select_session
class LaunchTests(unittest.TestCase):
def test_planner_environment_isolated_and_caller_restored(self):
with tempfile.TemporaryDirectory() as directory:
root=Path(directory);python=root/'python';python.touch()
env={'ROADSCORE_PLANNER_PYTHON':str(python),'PYTHONPATH':'unrelated-runtime:analysis/site-packages','PYTORCH_ENABLE_MPS_FALLBACK':'0'}
observed=[]
def launch(command,name,**kwargs):
observed.append((name,env.copy()))
if name=='semantic_planner':(root/'planner_ready.json').write_text(json.dumps({'port':12345}))
else:(root/'semantic_tunnel.log').write_text('PLANNER_TUNNEL_READY')
return SimpleNamespace(poll=lambda:None)
start_planner(launch,env,root,root/'roadscore','fake-no-connection')
self.assertEqual(observed[0][1]['PYTHONPATH'],str(root/'roadscore/prototype')+':'+str(root/'roadscore/experiments/ace_chestnut_20260916'))
self.assertEqual(observed[0][1]['PYTORCH_ENABLE_MPS_FALLBACK'],'1')
self.assertEqual(env['PYTHONPATH'],'unrelated-runtime:analysis/site-packages')
self.assertEqual(env['PYTORCH_ENABLE_MPS_FALLBACK'],'0')
self.assertEqual(observed[1][1]['PYTHONPATH'],env['PYTHONPATH'])
def test_fresh_and_explicit_but_not_judging_or_replay(self):
self.assertTrue(enabled(select_session(123),False,'ace'))
self.assertTrue(enabled(select_session(random_bits=lambda _:234),False,'ace'))
@@ -43,6 +43,8 @@ class IntegrationTests(unittest.TestCase):
self.assertEqual(run.begin(None),'initial')
wave,latent,stats=run.generate(sampler,11,None,retain)
self.assertEqual(len(wave),28*48000);self.assertEqual(latent.shape,(1,700,64))
self.assertAlmostEqual(stats['end_to_end_seconds'],stats['host_preparation_seconds']+1.1)
self.assertAlmostEqual(stats['end_to_end_rtf_new_audio'],stats['end_to_end_seconds']/28)
initial_key=stats['plan_key'];run.accept(wave,latent)
committed=latent.copy()
self.assertEqual(run.begin(committed),'verse')