"""Event file -> loss_curves.png (diff/repa/lr + fid). watcher가 매 사이클 갱신.""" import glob, os import matplotlib matplotlib.use("Agg") import matplotlib.pyplot as plt from tensorboard.backend.event_processing.event_accumulator import EventAccumulator BASE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "output/tokenizer/models_l_spatial_phase2") LOGDIR = os.path.join(BASE, "logs/semanticist") OUT = os.path.join(BASE, "loss_curves.png") def load(): ea = EventAccumulator(sorted(glob.glob(os.path.join(LOGDIR, "events*")))[-1]) ea.Reload() d = {} for t in ea.Tags()["scalars"]: s = ea.Scalars(t) d[t] = ([x.step for x in s], [x.value for x in s]) return d def main(): d = load() fig, ax = plt.subplots(2, 2, figsize=(13, 8)) if "diff_loss" in d: ax[0, 0].plot(*d["diff_loss"], lw=0.7, color="C0") ax[0, 0].set_title(f"diff_loss (last {d['diff_loss'][1][-1]:.4f})") ax[0, 0].set_xlabel("step"); ax[0, 0].grid(alpha=.3) if "repa_loss" in d: ax[0, 1].plot(*d["repa_loss"], lw=0.7, color="C3") ax[0, 1].set_title(f"repa_loss (last {d['repa_loss'][1][-1]:.4f})") ax[0, 1].set_xlabel("step"); ax[0, 1].grid(alpha=.3) if "lr" in d: ax[1, 0].plot(*d["lr"], lw=0.9, color="C2") ax[1, 0].set_title("lr (warmup)") ax[1, 0].set_xlabel("step"); ax[1, 0].grid(alpha=.3) if "fid" in d and len(d["fid"][0]) > 0: ax[1, 1].plot(*d["fid"], "o-", color="C1", label="fid") ax[1, 1].set_title(f"eval fid (last {d['fid'][1][-1]:.2f} @{d['fid'][0][-1]})") ax[1, 1].set_xlabel("step"); ax[1, 1].grid(alpha=.3) last_step = d.get("diff_loss", ([0], [0]))[0][-1] fig.suptitle(f"SpatialDiffuseSlot-L Phase2 — step {last_step}", fontsize=13) fig.tight_layout() fig.savefig(OUT, dpi=110) print("wrote", OUT, "@step", last_step) if __name__ == "__main__": main()