From 241333c213c6a5a0e8385727a8e1433e128aa382 Mon Sep 17 00:00:00 2001 From: cbb <2625274797@qq.com> Date: Sun, 18 Oct 2026 13:50:12 +0800 Subject: [PATCH] =?UTF-8?q?fix(pstate):=20=E6=94=B9=20TARGET=5FSAMPLES=20?= =?UTF-8?q?=E4=B8=8D=E5=86=8D=E4=BD=9C=E5=BA=9F=20gen=20=E7=9A=84=E5=B7=B2?= =?UTF-8?q?=E6=9C=89=E5=88=86=E7=89=87=E2=80=94=E2=80=94=E5=8F=AA=E9=87=8D?= =?UTF-8?q?=E8=B7=91=20gen=20=E8=A1=A5=E9=87=8F=EF=BC=88run=5Fparallel=20?= =?UTF-8?q?=E8=B7=B3=E8=BF=87=E5=86=99=E5=AE=8C=E7=9A=84=20shard=E3=80=81?= =?UTF-8?q?=E6=8C=89=E5=B7=AE=E9=A2=9D=E8=A1=A5=E9=87=8F=EF=BC=89=EF=BC=8C?= =?UTF-8?q?prep=20=E5=8F=8A=E4=B9=8B=E5=90=8E=E4=BB=8D=E4=BD=9C=E5=BA=9F?= =?UTF-8?q?=EF=BC=9B=E6=AD=A4=E5=89=8D=E6=8A=8A=E5=AE=83=E5=BD=93"?= =?UTF-8?q?=E4=BB=8E=20gen=20=E4=BD=9C=E5=BA=9F"=E4=BC=9A=E8=AE=A9=205=20?= =?UTF-8?q?=E5=B0=8F=E6=97=B6=E7=94=9F=E6=88=90=E7=9A=84=205=20=E4=B8=87?= =?UTF-8?q?=E6=9D=A1=E5=88=86=E7=89=87=E8=A2=AB=E6=95=B4=E4=BD=93=E7=A7=BB?= =?UTF-8?q?=E8=BF=9B=20archive=EF=BC=8C=E7=94=A8=E6=88=B7=E6=94=B9?= =?UTF-8?q?=E7=9B=AE=E6=A0=87=E6=A0=B7=E6=9C=AC=E9=87=8F=E5=B0=B1=E5=BE=97?= =?UTF-8?q?=E4=BB=8E=E5=A4=B4=E8=B7=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ml/pstate.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/ml/pstate.py b/ml/pstate.py index 8395686..883dd39 100644 --- a/ml/pstate.py +++ b/ml/pstate.py @@ -34,7 +34,10 @@ TIMEOUT_H = {k: max(1.0, 3 * v) for k, v in EST_H.items()} TIMEOUT_H['m5'] = 3 * (EST_H['train'] + 2 * EST_H['m5']) # 参数 → 受它影响的阶段(这些阶段即使上次完成也要重跑,其产物先挪进 ml/archive/)。只改挖错轮数不会让 5 小时的生成作废。 _from = lambda st: ORDER[ORDER.index(st):] -AFFECTS = {**{k: _from('gen') for k in ('N_TASKS', 'NPROC', 'TARGET_SAMPLES', 'CONSENSUS', 'MIN_GAP_MM')}, +AFFECTS = {**{k: _from('gen') for k in ('N_TASKS', 'NPROC', 'CONSENSUS', 'MIN_GAP_MM')}, + # TARGET_SAMPLES 只决定"补量到多少":不作废 gen 的已有分片(重跑 gen 会跳过写完的 shard、按差额补量), + # 但样本集会变,所以 prep 及之后作废。2026-10-18 实测:把它当"从 gen 作废"会让 5 小时的 5 万条分片白跑。 + 'TARGET_SAMPLES': ['gen'] + _from('prep'), 'CFG': ['r4'] + _from('train'), **{k: _from('mine') for k in ('ROUNDS', 'APG_STEPS', 'MINE_N')}} PARAM_KEYS = list(AFFECTS) # 各阶段产物(相对仓库根,可含通配);作废 / 从头重跑时整体移到 ml/archive/<时间>/,不删除 @@ -179,6 +182,7 @@ def main(): if cmd == 'reset': plan = rest[0].split(',') if rest and rest[0] else [] pn = params_now(); prev = d.get('params') or {} + changed = [] if '--fresh' in rest: bad = set(ORDER) else: changed = [k for k in PARAM_KEYS if prev and prev.get(k) != pn[k]] @@ -186,8 +190,11 @@ def main(): if changed: print('参数与上次不同:' + json.dumps({k: (prev.get(k), pn[k]) for k in changed}, ensure_ascii=False) + ';受影响的阶段重跑:' + ' '.join(st for st in ORDER if st in bad), file=sys.stderr) keep = {k: v for k, v in d.get('stages', {}).items() if v.get('rc') == 0 and k not in bad} - # 受影响 / 未完成的阶段:旧产物挪走,免得续训、跳过 shard 时把旧参数的东西接上 - arc = archive([st for st in ORDER if st in bad]) if bad else None + # 受影响 / 未完成的阶段:旧产物挪走,免得续训、跳过 shard 时把旧参数的东西接上。 + # 例外:只改了目标样本量时,gen 要重跑补量,但已有分片必须留着(run_parallel 跳过写完的 shard、 + # 按差额补量),否则 5 小时的生成白跑。 + no_archive = {'gen'} if 'TARGET_SAMPLES' in changed else set() + arc = archive([st for st in ORDER if st in bad and st not in no_archive]) if bad else None if arc: print(f'旧产物已移到 {arc}/(未删除)', file=sys.stderr) d = {'started': now, 'plan': plan, 'stages': keep, 'current': None, 'params': pn} done = [s for s in plan if s in keep]