第八轮:monitor 状态三项被注释吞掉的 bug;R9 改判稳态 planWarmP99 + 运动中饥饿 + 认证超时占比;APG steps 8000(batch 48 保持总任务量);r4 不再静默退回 CDN;自检副本含未跟踪文件;显存文案按 19–20 GB;审查文档精简为实测/判据/待数据/三段训练
This commit is contained in:
+16
-6
@@ -21,12 +21,19 @@ import argparse, http.server, json, os, shutil, socket, subprocess, sys, tempfil
|
||||
ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
LIMIT_MS = 15.0
|
||||
PLAN_LIMIT_MS = 45.0 # R9:整次规划 P99(60 ms 周期留 15 ms 给渲染与 tick)
|
||||
STARVE_LIMIT = 0.01 # R9:饥饿节拍占比上限
|
||||
STARVE_LIMIT = 0.01 # R9:饥饿节拍占比上限(只计运动中,冷启动不计)
|
||||
TIME_LIMIT = 0.05 # R9:认证因墙钟截止判不过的占比上限——防止靠拒绝候选、刹停换来 planP99 达标(第八轮,viewer_ref 随机模型 time 占失败 70%)
|
||||
# 2026-10-18 第八轮:R9 判稳态 planWarmP99(剔除每题首次冷启动规划)。冷启动发生在静止起步,只是起步延迟,单独报 planColdP99 不设闸;
|
||||
# 否则 30 题 = 30 次冷启动,planP99 测的是题数而不是稳态。
|
||||
|
||||
|
||||
def ort_local():
|
||||
if os.environ.get('ORT_LOCAL') in ('0', '1'): return os.environ['ORT_LOCAL'] == '1'
|
||||
return os.path.exists(os.path.join(ROOT, 'webapp', 'vendor', 'ort', 'ort.min.js'))
|
||||
# 2026-10-18 第八轮:ort 已入库(webapp/vendor/ort),默认只用本地;本地缺失直接报错,不再静默退回 CDN
|
||||
# (第七轮本机:npm pack 失败 → 退回 CDN → jsDelivr 不通 → 四种配置全是「加载 ort 失败」却显示跑完)。确要用 CDN 设 ORT_LOCAL=0。
|
||||
if os.environ.get('ORT_LOCAL') == '0': return False
|
||||
if not os.path.exists(os.path.join(ROOT, 'webapp', 'vendor', 'ort', 'ort.min.js')):
|
||||
sys.exit('webapp/vendor/ort/ort.min.js 不存在:git pull 拿入库的 ort,或 bash ml/prep/vendor_ort.sh;确要用 CDN 设 ORT_LOCAL=0')
|
||||
return True
|
||||
|
||||
|
||||
def find_browser():
|
||||
@@ -105,7 +112,10 @@ def viewer(srv, browser, model_url, n, probe):
|
||||
if r.get('planP99') is not None:
|
||||
sr = (r.get('starve') or 0) / max(1, r.get('ticks') or 1)
|
||||
r['starve_rate'] = round(sr, 4)
|
||||
r['r9_pass'] = r['planP99'] < PLAN_LIMIT_MS and sr < STARVE_LIMIT
|
||||
pl = max(1, r.get('plans') or 1); why = r.get('certFailWhy') or {}
|
||||
r['cert_time_rate'] = round((why.get('time') or 0) / pl, 4); r['brake_rate'] = round((r.get('brakes') or 0) / pl, 4)
|
||||
w = r.get('planWarmP99') if r.get('planWarmP99') is not None else r['planP99']
|
||||
r['r9_pass'] = w < PLAN_LIMIT_MS and sr < STARVE_LIMIT and r['cert_time_rate'] < TIME_LIMIT
|
||||
print('viewer', json.dumps({k: v for k, v in r.items() if k != 'per'}, ensure_ascii=False), flush=True)
|
||||
return r
|
||||
|
||||
@@ -152,7 +162,7 @@ def main():
|
||||
|
||||
def main_viewer(a):
|
||||
meta = json.load(open(a.model.replace('.onnx', '.meta.json'), encoding='utf-8'))
|
||||
out = {'rule': f'R9:查看器整次规划 planMs P99 < {PLAN_LIMIT_MS:g} ms 且饥饿节拍 < {STARVE_LIMIT:.0%}', 'model': a.model, 'pass': None}
|
||||
out = {'rule': f'R9:查看器稳态规划 planWarmP99 < {PLAN_LIMIT_MS:g} ms、运动中饥饿节拍 < {STARVE_LIMIT:.0%}、认证超时占比 < {TIME_LIMIT:.0%}(planColdP99 / brake_rate / tickGapMax 只报不判)', 'model': a.model, 'pass': None}
|
||||
br = find_browser()
|
||||
if not br: out['note'] = '没找到 Edge / Chrome(可设 R4_BROWSER=浏览器路径)'
|
||||
else:
|
||||
@@ -164,7 +174,7 @@ def main_viewer(a):
|
||||
os.makedirs(os.path.dirname(a.out) or '.', exist_ok=True)
|
||||
json.dump(out, open(a.out, 'w', encoding='utf-8'), indent=1, ensure_ascii=False)
|
||||
r = out.get('result') or {}
|
||||
print(f"R9:{ {True: '通过', False: '未通过', None: '未判定'}[out['pass']] } planMs P99 {r.get('planP99')} ms(推理 {r.get('inferP99')} / 安全层 {r.get('safetyP99')}),饥饿 {r.get('starve_rate')}")
|
||||
print(f"R9:{ {True: '通过', False: '未通过', None: '未判定'}[out['pass']] } 稳态 planMs P99 {r.get('planWarmP99')} ms(冷启动 {r.get('planColdP99')};推理 {r.get('inferP99')} / 安全层 {r.get('safetyP99')}),饥饿 {r.get('starve_rate')},认证超时 {r.get('cert_time_rate')},刹停 {r.get('brake_rate')},tickGapMax {r.get('tickGapMax')}")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
Reference in New Issue
Block a user