mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-10-04 13:24:13 +08:00
Isolate semantic planner environment and report preparation-inclusive latency
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user