From 2b90de2fba3cb105f482d0a3bab6c90354ef56af Mon Sep 17 00:00:00 2001 From: Paul Huliganga Date: Sun, 19 Apr 2026 20:37:25 -0400 Subject: [PATCH] fix: import json, use make_env_base in phase switch, and run eval sequentially to avoid second concurrent sim car --- agent/experiments/exp14_finetune_v5.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/agent/experiments/exp14_finetune_v5.py b/agent/experiments/exp14_finetune_v5.py index d119497..734902b 100644 --- a/agent/experiments/exp14_finetune_v5.py +++ b/agent/experiments/exp14_finetune_v5.py @@ -11,7 +11,7 @@ Exp 14b: Fine-tune mountain champion (v5 reward) — throttle schedule. This script is intentionally conservative: small LR, frequent evals, and saves so we don't lose progress. """ -import sys, os, time +import sys, os, time, json sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..')) from datetime import datetime from stable_baselines3 import PPO @@ -197,7 +197,7 @@ try: env0.close() except Exception: pass - env0 = VecTransposeImage(DummyVecEnv([make_env(throttle_min)])) + env0 = VecTransposeImage(DummyVecEnv([make_env_base(0.2, throttle_floor=throttle_min)])) model.set_env(env0) remaining = phase_steps @@ -213,8 +213,17 @@ try: model.save(os.path.join(SAVE_DIR, 'model')) log(f'[{steps_done}/{TOTAL_STEPS}] Checkpoint saved: {ckpt}.zip') - # Eval + # Eval sequentially: close training env first so we do not create a + # second concurrent sim connection / second car during checkpoint eval. + try: + env0.close() + except Exception: + pass res = evaluate_model(model, throttle_min, sets=EVAL_EPISODES) + # Restore training env after eval + env0 = VecTransposeImage(DummyVecEnv([make_env_base(0.2, throttle_floor=throttle_min)])) + model.set_env(env0) + # compute mean lap time for episodes that completed at least 1 lap lap_times = [lt for r in res for lt in r['lap_times']] mean_lap = sum(lap_times)/len(lap_times) if lap_times else None