recoilme commited on
Commit
cb6884f
·
verified ·
1 Parent(s): ff2cf32

Ra fp16 (step 460000)

Browse files
Files changed (5) hide show
  1. src/export.py +18 -55
  2. src/publish.py +2 -1
  3. src/sample.py +1 -1
  4. src/train.py +5 -3
  5. transformer/config.json +29 -136
src/export.py CHANGED
@@ -37,8 +37,7 @@ def main():
37
  save_file(tensors, str(out / "diffusion_pytorch_model.safetensors"))
38
 
39
  ae_cfg = json.loads((ROOT / "vae" / "config.json").read_text())
40
- ta = ck.get("args") or {} # чекпойнт помнит свои аргументы — не сочиняем заново
41
- graft = dict((k.strip(), int(v)) for k, v in (kv.split("=") for kv in (ta.get("graft") or "").split(",") if "=" in kv))
42
  counts = {} # сколько блоков в каждом списке — по ключам тензоров
43
  for k in ck["body"]:
44
  g = k.split(".")[0]
@@ -47,76 +46,40 @@ def main():
47
  if idx.isdigit():
48
  counts.setdefault(g, set()).add(idx)
49
  nblk = {g: len(v) for g, v in counts.items()}
50
- training = {
51
- "dataset": ta.get("hf_dataset") or ta.get("data") or "~/dataset/butterflies_256x64",
52
- "parts": ta.get("parts"),
53
- "size": ta.get("size"),
54
- "steps": int(ck["step"]),
55
- "batch": ta.get("batch", 8),
56
- "accum": ta.get("accum", 1),
57
- "lr": ta.get("lr", 1e-4),
58
- "lr_tail": ta.get("lr_tail", 3e-5),
59
- "drop_text": ta.get("drop_text", 0.1),
60
- "init": ta.get("init"),
61
- "metrics": args.metrics,
62
- }
63
  cfg = {
64
  "_class_name": "UDiT",
65
- "name": "Ra",
66
  "format": "udm/v1",
67
- "step": int(ck["step"]),
68
- "latent": {
69
- "channels": ae_cfg["latent_channels"],
70
- "spatial_factor": ae_cfg["patch_size"],
71
- "mean": ae_cfg["latent_mean"],
72
- "std": ae_cfg["latent_std"],
73
- "source": "vae/ (Muinez/f8c32-ae)",
74
- },
75
- "text": {
76
- "encoder": "text_encoder/ (jhu-clsp/ettin-encoder-150m, 768-dim, 22 слоя)",
77
- "max_len": 192,
78
- "slices": [2, 5, 8, 11, 14, 17, 20],
79
- "slice_blocks": 2,
80
- "trainable": "text_mixer.*",
81
- },
82
  "body": {
83
  "kind": "пирамидальный U: ширина растёт к низу",
84
- "graft": graft or None, # чем привито сверх базовой архитектуры (zero-init блоки)
 
85
  "blocks": nblk,
86
  "levels": [
87
- {"level": 0, "tokens": "÷1", "width": 192, "blocks": "conv 6 enc / 4 dec + 2 self-attn на сторону",
88
- "text": "кросс-внимание в каждом conv-блоке и в self-attn"},
89
- {"level": 1, "tokens": "÷2", "width": 512, "blocks": "attn 5 enc / 4 dec", "text": "кросс-внимание"},
90
- {"level": 2, "tokens": "÷4", "width": 1024, "blocks": "attn 5 enc / 4 dec", "text": "кросс-внимание"},
91
- {"level": 3, "tokens": "÷8", "width": 1536, "blocks": "attn 4 (боттлнек)", "text": "кросс-внимание"},
92
  ],
93
  "skips": "аддитивные (SD-стиль): e0/e1/e2 прибавляются в декодере",
94
- "down": "mean-pool 2× + Linear",
95
- "up": "Linear + nearest 2×",
96
- "rope": "2D RoPE, base 100, фаза в латентных пикселях на каждом уровне",
 
97
  "parametrization": "x0 латента",
 
98
  },
99
- "tail": {
100
- "source": "декодер AE, 6 блоков @512, PixelShuffle ×3",
101
- "trained_as": "flow по пикселям, условие z0 + (ошибка тела).detach()",
102
- "sample_steps": ta.get("tail_steps", 4),
103
- },
104
- "params": {
105
- "body": round(sum(v.numel() for k, v in tensors.items() if k.startswith("body.")) / 1e6, 2),
106
- "text_mixer": round(sum(v.numel() for k, v in tensors.items()
107
- if k.startswith("text_mixer.")) / 1e6, 2),
108
- "tail": round(sum(v.numel() for k, v in tensors.items() if k.startswith("tail.")) / 1e6, 2),
109
- },
110
- "training": {k: v for k, v in training.items() if v is not None},
111
- "storage_dtype": "float16" if args.half else "float32",
112
  }
113
- cfg["params"]["total"] = round(sum(cfg["params"].values()), 2)
114
  (out / "config.json").write_text(json.dumps(cfg, indent=2, ensure_ascii=False))
115
 
116
  print(f"сохранено: {out}/diffusion_pytorch_model.safetensors "
117
  f"({sum(v.numel() for v in tensors.values())/1e6:.1f}M параметров, "
118
  f"{(out / 'diffusion_pytorch_model.safetensors').stat().st_size/1e6:.0f} МБ)")
119
- print(f"части: {cfg['params']}")
120
 
121
 
122
  def load_exported(model, enc, ae, path, device=None):
 
37
  save_file(tensors, str(out / "diffusion_pytorch_model.safetensors"))
38
 
39
  ae_cfg = json.loads((ROOT / "vae" / "config.json").read_text())
40
+ ta = ck.get("args") or {}
 
41
  counts = {} # сколько блоков в каждом списке — по ключам тензоров
42
  for k in ck["body"]:
43
  g = k.split(".")[0]
 
46
  if idx.isdigit():
47
  counts.setdefault(g, set()).add(idx)
48
  nblk = {g: len(v) for g, v in counts.items()}
49
+ # конфиг описывает ТОЛЬКО тело; статистики латента — в vae/config.json, шаг — параметр запуска
 
 
 
 
 
 
 
 
 
 
 
 
50
  cfg = {
51
  "_class_name": "UDiT",
 
52
  "format": "udm/v1",
53
+ "storage_dtype": "float16" if args.half else "float32",
54
+ "latent_channels": ae_cfg["latent_channels"],
55
+ "text_dim": ta.get("text_dim", 768),
 
 
 
 
 
 
 
 
 
 
 
 
56
  "body": {
57
  "kind": "пирамидальный U: ширина растёт к низу",
58
+ "widths": [192, 512, 1024, 1536],
59
+ "heads": [6, 8, 8, 8],
60
  "blocks": nblk,
61
  "levels": [
62
+ {"level": 0, "tokens": "÷1", "width": 192,
63
+ "blocks": "conv 6 enc / 4 dec + 2 self-attn на сторону"},
64
+ {"level": 1, "tokens": "÷2", "width": 512, "blocks": "attn 5 enc / 4 dec"},
65
+ {"level": 2, "tokens": "÷4", "width": 1024, "blocks": "attn 5 enc / 4 dec"},
66
+ {"level": 3, "tokens": "÷8", "width": 1536, "blocks": "attn 4 (боттлнек)"},
67
  ],
68
  "skips": "аддитивные (SD-стиль): e0/e1/e2 прибавляются в декодере",
69
+ "down": "mean-pool 2x + Linear",
70
+ "up": "Linear + nearest 2x",
71
+ "rope": {"kind": "2d", "base": 100, "phase": "в латентных пикселях на каждом уровне"},
72
+ "text": "кросс-внимание на всех уровнях",
73
  "parametrization": "x0 латента",
74
+ "params": round(sum(v.numel() for k, v in tensors.items() if k.startswith("body.")) / 1e6, 2),
75
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
76
  }
 
77
  (out / "config.json").write_text(json.dumps(cfg, indent=2, ensure_ascii=False))
78
 
79
  print(f"сохранено: {out}/diffusion_pytorch_model.safetensors "
80
  f"({sum(v.numel() for v in tensors.values())/1e6:.1f}M параметров, "
81
  f"{(out / 'diffusion_pytorch_model.safetensors').stat().st_size/1e6:.0f} МБ)")
82
+ print(f"тело {cfg['body']['params']}M, блоки {nblk}")
83
 
84
 
85
  def load_exported(model, enc, ae, path, device=None):
src/publish.py CHANGED
@@ -50,6 +50,7 @@ def main():
50
  ap.add_argument("--out", default=str(ROOT / "tmp" / "publish"))
51
  ap.add_argument("--repo", default=REPO_ID)
52
  ap.add_argument("--push", action="store_true", help="залить собранное на Hub (публичный репозиторий)")
 
53
  args = ap.parse_args()
54
  out = Path(args.out)
55
  if out.exists():
@@ -90,7 +91,7 @@ def main():
90
  api = HfApi()
91
  api.create_repo(args.repo, repo_type="model", private=False, exist_ok=True)
92
  api.upload_folder(folder_path=str(out), repo_id=args.repo, repo_type="model",
93
- commit_message=f"Ra fp16 (step {cfg['step']})")
94
  print(f"[push] https://huggingface.co/{args.repo}", flush=True)
95
 
96
 
 
50
  ap.add_argument("--out", default=str(ROOT / "tmp" / "publish"))
51
  ap.add_argument("--repo", default=REPO_ID)
52
  ap.add_argument("--push", action="store_true", help="залить собранное на Hub (публичный репозиторий)")
53
+ ap.add_argument("--step", type=int, default=None, help="шаг чекпойнта — только для сообщения коммита")
54
  args = ap.parse_args()
55
  out = Path(args.out)
56
  if out.exists():
 
91
  api = HfApi()
92
  api.create_repo(args.repo, repo_type="model", private=False, exist_ok=True)
93
  api.upload_folder(folder_path=str(out), repo_id=args.repo, repo_type="model",
94
+ commit_message=(f"Ra fp16 (step {args.step})" if args.step else "Ra fp16 (weights)"))
95
  print(f"[push] https://huggingface.co/{args.repo}", flush=True)
96
 
97
 
src/sample.py CHANGED
@@ -51,7 +51,7 @@ def main():
51
  ae.decoder.load_state_dict(sd["decoder"])
52
  step = sd.get("step")
53
  m.eval()
54
- print(f"[model] {src}, шаг {step}", flush=True)
55
 
56
  null_hs, null_mk = enc.slices([""], pad_to_len=args.text_len)
57
  null_t = enc.mix(null_hs.float())
 
51
  ae.decoder.load_state_dict(sd["decoder"])
52
  step = sd.get("step")
53
  m.eval()
54
+ print(f"[model] {src}" + (f", шаг {step}" if step else ""), flush=True)
55
 
56
  null_hs, null_mk = enc.slices([""], pad_to_len=args.text_len)
57
  null_t = enc.mix(null_hs.float())
src/train.py CHANGED
@@ -174,6 +174,8 @@ def main():
174
  ap.add_argument("--steps", type=int, default=None, help="бюджет в шагах (по умолчанию — до --target)")
175
  ap.add_argument("--target", type=int, default=708000,
176
  help="абсолютный шаг финиша, если не заданы --steps/--epochs")
 
 
177
  ap.add_argument("--batch", type=int, default=16)
178
  ap.add_argument("--accum", type=int, default=1, help="накопление: эффективный батч = batch*accum")
179
  ap.add_argument("--probe", action="store_true", help="подобрать максимальный батч под память и выйти")
@@ -273,9 +275,9 @@ def main():
273
  p = Path(args.init)
274
  if p.is_dir():
275
  from export import load_exported
276
- cfg = load_exported(m, enc, ae, p, DEV)
277
- start = int(cfg.get("step", 0) or 0) # счётчик продолжается с шага экспорта
278
- print(f"[init] папка {p}, шаг {start}", flush=True)
279
  else:
280
  sd = torch.load(p, map_location=DEV)
281
  n_take = load_body(sd["body"]); enc.mixer.load_state_dict(sd["mixer"])
 
174
  ap.add_argument("--steps", type=int, default=None, help="бюджет в шагах (по умолчанию — до --target)")
175
  ap.add_argument("--target", type=int, default=708000,
176
  help="абсолютный шаг финиша, если не заданы --steps/--epochs")
177
+ ap.add_argument("--step", type=int, default=0,
178
+ help="стартовый шаг: от него считается остаток и расписание lr")
179
  ap.add_argument("--batch", type=int, default=16)
180
  ap.add_argument("--accum", type=int, default=1, help="накопление: эффективный батч = batch*accum")
181
  ap.add_argument("--probe", action="store_true", help="подобрать максимальный батч под память и выйти")
 
275
  p = Path(args.init)
276
  if p.is_dir():
277
  from export import load_exported
278
+ load_exported(m, enc, ae, p, DEV)
279
+ start = args.step # шаг — параметр запуска, не поле конфига
280
+ print(f"[init] папка {p}; старт шага {start} (--step)", flush=True)
281
  else:
282
  sd = torch.load(p, map_location=DEV)
283
  n_take = load_body(sd["body"]); enc.mixer.load_state_dict(sd["mixer"])
transformer/config.json CHANGED
@@ -1,107 +1,23 @@
1
  {
2
  "_class_name": "UDiT",
3
- "name": "Ra",
4
  "format": "udm/v1",
5
- "step": 460000,
6
- "latent": {
7
- "channels": 32,
8
- "spatial_factor": 8,
9
- "mean": [
10
- -4.137261,
11
- 2.725146,
12
- -1.435803,
13
- -2.187023,
14
- -4.161275,
15
- -1.58918,
16
- -2.527523,
17
- 3.002302,
18
- 2.793705,
19
- -2.091501,
20
- -2.632896,
21
- -3.59589,
22
- -3.069669,
23
- -4.568713,
24
- 3.26668,
25
- -0.897648,
26
- 2.072541,
27
- 5.451158,
28
- 1.747871,
29
- -2.113284,
30
- 2.03444,
31
- -1.379274,
32
- 0.66369,
33
- 2.712183,
34
- -0.111181,
35
- 6.054838,
36
- 1.235881,
37
- -2.02777,
38
- 3.663243,
39
- -2.454632,
40
- 1.141335,
41
- 1.786136
42
- ],
43
- "std": [
44
- 1.030738,
45
- 0.951682,
46
- 1.079687,
47
- 0.957871,
48
- 1.198266,
49
- 1.102266,
50
- 1.213605,
51
- 0.947544,
52
- 1.085991,
53
- 1.093223,
54
- 0.9027,
55
- 1.010205,
56
- 0.920466,
57
- 1.044107,
58
- 1.023179,
59
- 0.992978,
60
- 0.991627,
61
- 1.073585,
62
- 1.114629,
63
- 1.056403,
64
- 1.093012,
65
- 1.015109,
66
- 1.007069,
67
- 0.976026,
68
- 0.982324,
69
- 1.093805,
70
- 1.036086,
71
- 1.005727,
72
- 1.104078,
73
- 1.042298,
74
- 1.095522,
75
- 0.960255
76
  ],
77
- "source": "vae/ (Muinez/f8c32-ae)"
78
- },
79
- "text": {
80
- "encoder": "text_encoder/ (jhu-clsp/ettin-encoder-150m, 768-dim, 22 слоя)",
81
- "max_len": 192,
82
- "slices": [
83
- 2,
84
- 5,
85
  8,
86
- 11,
87
- 14,
88
- 17,
89
- 20
90
  ],
91
- "slice_blocks": 2,
92
- "trainable": "text_mixer.*"
93
- },
94
- "body": {
95
- "kind": "пирамидальный U: ширина растёт к низу",
96
- "graft": {
97
- "e0x": 1,
98
- "d0x": 1,
99
- "e1": 1,
100
- "d1": 1,
101
- "e2": 2,
102
- "d2": 2,
103
- "e3": 2
104
- },
105
  "blocks": {
106
  "e0": 6,
107
  "e0x": 1,
@@ -118,60 +34,37 @@
118
  "level": 0,
119
  "tokens": "÷1",
120
  "width": 192,
121
- "blocks": "conv 6 enc / 4 dec + 2 self-attn на сторону",
122
- "text": "кросс-внимание в каждом conv-блоке и в self-attn"
123
  },
124
  {
125
  "level": 1,
126
  "tokens": "÷2",
127
  "width": 512,
128
- "blocks": "attn 5 enc / 4 dec",
129
- "text": "кросс-внимание"
130
  },
131
  {
132
  "level": 2,
133
  "tokens": "÷4",
134
  "width": 1024,
135
- "blocks": "attn 5 enc / 4 dec",
136
- "text": "кросс-внимание"
137
  },
138
  {
139
  "level": 3,
140
  "tokens": "÷8",
141
  "width": 1536,
142
- "blocks": "attn 4 (боттлнек)",
143
- "text": "кросс-внимание"
144
  }
145
  ],
146
  "skips": "аддитивные (SD-стиль): e0/e1/e2 прибавляются в декодере",
147
- "down": "mean-pool 2× + Linear",
148
- "up": "Linear + nearest 2×",
149
- "rope": "2D RoPE, base 100, фаза в латентных пикселях на каждом уровне",
150
- "parametrization": "x0 латента"
151
- },
152
- "tail": {
153
- "source": "декодер AE, 6 блоков @512, PixelShuffle ×3",
154
- "trained_as": "flow по пикселям, условие z0 + (ошибка тела).detach()",
155
- "sample_steps": 8
156
- },
157
- "params": {
158
- "body": 238.54,
159
- "text_mixer": 10.04,
160
- "tail": 23.87,
161
- "total": 272.45
162
- },
163
- "training": {
164
- "dataset": "LucasFang/FLUX-Reason-6M",
165
- "parts": "Aesthetics-Part01,Aesthetics-Part02,Imaginative,Text",
166
- "size": 256,
167
- "steps": 460000,
168
- "batch": 24,
169
- "accum": 1,
170
- "lr": 5e-05,
171
- "lr_tail": 3e-05,
172
- "drop_text": 0.1,
173
- "init": "tmp/run/ckpt/step_0404000.pt",
174
- "metrics": ""
175
- },
176
- "storage_dtype": "float16"
177
  }
 
1
  {
2
  "_class_name": "UDiT",
 
3
  "format": "udm/v1",
4
+ "storage_dtype": "float16",
5
+ "latent_channels": 32,
6
+ "text_dim": 768,
7
+ "body": {
8
+ "kind": "пирамидальный U: ширина растёт к низу",
9
+ "widths": [
10
+ 192,
11
+ 512,
12
+ 1024,
13
+ 1536
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  ],
15
+ "heads": [
16
+ 6,
 
 
 
 
 
 
17
  8,
18
+ 8,
19
+ 8
 
 
20
  ],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  "blocks": {
22
  "e0": 6,
23
  "e0x": 1,
 
34
  "level": 0,
35
  "tokens": "÷1",
36
  "width": 192,
37
+ "blocks": "conv 6 enc / 4 dec + 2 self-attn на сторону"
 
38
  },
39
  {
40
  "level": 1,
41
  "tokens": "÷2",
42
  "width": 512,
43
+ "blocks": "attn 5 enc / 4 dec"
 
44
  },
45
  {
46
  "level": 2,
47
  "tokens": "÷4",
48
  "width": 1024,
49
+ "blocks": "attn 5 enc / 4 dec"
 
50
  },
51
  {
52
  "level": 3,
53
  "tokens": "÷8",
54
  "width": 1536,
55
+ "blocks": "attn 4 (боттлнек)"
 
56
  }
57
  ],
58
  "skips": "аддитивные (SD-стиль): e0/e1/e2 прибавляются в декодере",
59
+ "down": "mean-pool 2x + Linear",
60
+ "up": "Linear + nearest 2x",
61
+ "rope": {
62
+ "kind": "2d",
63
+ "base": 100,
64
+ "phase": "в латентных пикселях на каждом уровне"
65
+ },
66
+ "text": "кросс-внимание на всех уровнях",
67
+ "parametrization": "x0 латента",
68
+ "params": 238.54
69
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
70
  }