"""Stasis 1 sixth tranche: 2-GPU DDP continuation from fifth recovery step 4,126. Launch: torchrun --standalone --nproc_per_node=2 train_sixth.py --config RUN_CONFIG.json Model code: frozen_stasis (unchanged sha pins). Never AutoModelForCausalLM.""" import argparse, json, math, os, sys, time import numpy as np, torch, torch.distributed as dist from torch.nn.parallel import DistributedDataParallel as DDP sys.path.insert(0,os.path.dirname(os.path.abspath(__file__))) from frozen_stasis.config import ModelConfig from frozen_stasis.model import StasisDecoder import sixth_ckpt as C W=2049; TARGETS=2048 def lr_at(u,c,N): if u=N: break if u>=max_updates: break # stop decision (rank0 time, broadcast) flag=torch.tensor([1 if time.time()>=stop_at else 0],device=dev); dist.broadcast(flag,0) if flag.item(): emit(event='time_stop',update=u); break lr=lr_at(u,c,N) for g in opt.param_groups: g['lr']=lr base_w=u*windows_per_update+rank*accum*micro tot=torch.zeros((),device=dev,dtype=torch.float64) for m in range(accum): x=torch.from_numpy(data[base_w+m*micro:base_w+(m+1)*micro].astype(np.int64)).to(dev,non_blocking=True) ctx=ddp.no_sync() if m=c.get('max_consecutive_skips',25): emit(event='abort_skips',update=u); save(u,'abort'); break # freeze N after calibration (warmup only so far, LR independent of N) if N is None and u==start+c['calibration_updates']: spu=torch.tensor([float(np.median(times[3:]))],device=dev); dist.broadcast(spu,0); spu=float(spu.item()) remaining=stop_at-time.time()-c['reserve_seconds_for_saves'] N=int(min(max_updates,u+math.floor(remaining/(spu*c['throughput_safety'])))) C.need(N>c['warmup_updates'],'not enough time for schedule') binding['frozen_updates']=N if rank==0: json.dump(dict(frozen_updates=N,seconds_per_update_median=spu,targets=N*windows_per_update*TARGETS,frozen_at_update=u, remaining_seconds=remaining,safety=c['throughput_safety'],utc=time.time()),open(os.path.join(out,'SCHEDULE_FROZEN.json'),'w'),indent=1) emit(event='schedule_frozen',N=N,spu=spu) sflag=torch.tensor([1 if time.time()-last_save>=save_every else 0],device=dev); dist.broadcast(sflag,0) if sflag.item(): save(u,'latest'); last_save=time.time() save(u,'final') if rank==0: mo=dict(schema='stasis.sixth_tranche.model_only.v1',model={k:v.detach().cpu().clone() for k,v in raw.state_dict().items()},cursor=cur(u),binding=binding) h=C.atomic_save(mo,os.path.join(out,'endpoint.model_only.pt')) json.dump(dict(completed_updates=u,frozen_updates=N,schedule_complete=(N is not None and u>=N),endpoint_sha256=h,cursor=cur(u)),open(os.path.join(out,'TRAIN_STATUS.json'),'w'),indent=1) emit(event='done',update=u) dist.barrier(); dist.destroy_process_group() if __name__=='__main__': main()