Omibranch commited on
Commit
65ffe47
·
verified ·
1 Parent(s): d97a187

clean: remove old v11 checkpoints

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
best_checkpoint_v11.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:19a469d8ed889e660357b329cff6b854f7109c73b60432147833580f05507f71
3
- size 106321288
 
 
 
 
train_kaggle_v11.py DELETED
@@ -1,939 +0,0 @@
1
- import subprocess, sys
2
- subprocess.run([sys.executable, "-m", "pip", "install", "-q",
3
- "tiktoken", "datasets", "huggingface_hub"], check=True)
4
-
5
- # Kaggle T4 validation run - SEQ=128, HIDDEN=128, 5M chars, 10 epochs, warm-start+freeze h1/h2, ANTI=0.15
6
- import math
7
- import os
8
- import time
9
- from dataclasses import dataclass, field
10
-
11
- import torch
12
- import torch.nn as nn
13
- import torch.nn.functional as F
14
- from torch.utils.data import Dataset, DataLoader, random_split, Subset
15
-
16
- # ---------------------------------------------------------------------------
17
- # Конфиг
18
- # ---------------------------------------------------------------------------
19
-
20
- SEQ_LEN = 128
21
- HIDDEN_DIM = 128
22
- TAUS = (4.0, 32.0, 128.0)
23
- HORIZONS = (1, 4, 32)
24
- BATCH_SIZE = 32
25
- EPOCHS = 15
26
- LR = 3e-4
27
- EARLY_STOP = 3
28
- MAX_EPOCH_SECONDS = 600
29
- JACOBI_K = 2
30
- SEED = 42
31
- MAX_SEQS = 6_000
32
- TARGET_CHARS = 5_000_000
33
-
34
- A_RANGES = ((0.55, 0.88), (0.90, 0.975), (0.980, 0.999))
35
-
36
- TRAIN_HEAD_WEIGHTS = (0.2, 0.3, 0.5)
37
-
38
- # v8+: предсказательное кодирование
39
- PRED_LAMBDA = 0.1
40
-
41
- # v11 Change B: anti-task loss — h3 штрафуется за предсказание t+1
42
- # total_loss -= ANTI_LAMBDA * CE(head3, t+1)
43
- # Цель: h3 вынужден активно избегать t+1-полезных признаков
44
- ANTI_LAMBDA = 0.15
45
-
46
- WARM_START = True
47
- WARM_START_HF = "v11_last_checkpoint.pt"
48
-
49
- # v11 Change D: slow-tick для h3 — h3 получает новый h2_error только раз в N токенов.
50
- # Между обновлениями h3 видит то же самое h2_error (hold).
51
- # Принуждает h3 интегрировать информацию крупными блоками, а не гнаться за каждым токеном.
52
- H3_SLOW_TICK = 8
53
-
54
- # v10+: h3 landmark attention ВНУТРИ цикла Якоби
55
- LANDMARK_STRIDE = 32
56
- LANDMARK_HEADS = 4
57
-
58
- CE_CHUNK = 128
59
- LR_WARMUP_EPOCHS = 1
60
- DROPOUT = 0.10
61
-
62
- CKPT_DIR = os.environ.get("CHECKPOINT_DIR", "/kaggle/working")
63
- HF_TOKEN = "__HF_TOKEN_PLACEHOLDER__"
64
- HF_REPO_ID = "Omibranch/harmonic-checkpoints"
65
- LOG_FILE = "/tmp/v11_train.log"
66
-
67
-
68
- class _Tee:
69
- def __init__(self, path):
70
- self._f = open(path, "w")
71
- self._orig = sys.__stdout__
72
- def write(self, s):
73
- self._orig.write(s)
74
- self._f.write(s)
75
- self._f.flush()
76
- def flush(self):
77
- self._orig.flush()
78
- self._f.flush()
79
- def fileno(self):
80
- return self._orig.fileno()
81
-
82
-
83
- # ---------------------------------------------------------------------------
84
- # HF Hub
85
- # ---------------------------------------------------------------------------
86
-
87
- def _silence_hf():
88
- try:
89
- from huggingface_hub.utils import disable_progress_bars
90
- disable_progress_bars()
91
- except Exception:
92
- pass
93
- try:
94
- import datasets as _ds
95
- _ds.disable_progress_bar()
96
- except Exception:
97
- pass
98
- import logging
99
- logging.getLogger("huggingface_hub").setLevel(logging.ERROR)
100
- logging.getLogger("fsspec").setLevel(logging.ERROR)
101
- logging.getLogger("datasets").setLevel(logging.ERROR)
102
- logging.getLogger("urllib3").setLevel(logging.ERROR)
103
-
104
- _silence_hf()
105
-
106
-
107
- def _hf_repo_id():
108
- global HF_REPO_ID
109
- if HF_REPO_ID is None:
110
- from huggingface_hub import HfApi
111
- api = HfApi(token=HF_TOKEN)
112
- username = api.whoami()["name"]
113
- repo_id = f"{username}/harmonic-checkpoints"
114
- api.create_repo(repo_id=repo_id, exist_ok=True, private=True)
115
- HF_REPO_ID = repo_id
116
- return HF_REPO_ID
117
-
118
-
119
- def upload_to_hf(local_path, filename):
120
- try:
121
- from huggingface_hub import upload_file
122
- rid = _hf_repo_id()
123
- t0 = time.perf_counter()
124
- upload_file(
125
- path_or_fileobj=local_path,
126
- path_in_repo=filename,
127
- repo_id=rid,
128
- repo_type="model",
129
- token=HF_TOKEN,
130
- )
131
- mb = os.path.getsize(local_path) / 1024 / 1024
132
- print(f" HF: {filename} -> {rid} ({mb:.0f} MB, {time.perf_counter()-t0:.1f}s)",
133
- flush=True)
134
- except Exception as e:
135
- print(f" HF upload error: {e}", flush=True)
136
-
137
-
138
- def upload_to_hf_epoch(model_only_path, epoch, val_far):
139
- filename = f"v11_e{epoch:02d}_{val_far:.4f}.pt"
140
- upload_to_hf(model_only_path, filename)
141
- return filename
142
-
143
-
144
- # ---------------------------------------------------------------------------
145
- # AMP dtype
146
- # ---------------------------------------------------------------------------
147
-
148
- def get_amp_dtype(device):
149
- if device.type != "cuda":
150
- return None
151
- props = torch.cuda.get_device_properties(0)
152
- if props.major >= 8:
153
- return torch.bfloat16
154
- return torch.float16
155
-
156
-
157
- # ---------------------------------------------------------------------------
158
- # Chunked cross-entropy
159
- # ---------------------------------------------------------------------------
160
-
161
- class _ChunkedCE(torch.autograd.Function):
162
- @staticmethod
163
- def forward(ctx, logits, flat_targets, chunk_size, label_smoothing):
164
- B, T, V = logits.shape
165
- tgt = flat_targets.reshape(B, T)
166
- acc = torch.zeros((), device=logits.device, dtype=torch.float32)
167
- with torch.no_grad():
168
- for t0 in range(0, T, chunk_size):
169
- t1 = min(t0 + chunk_size, T)
170
- lg = logits[:, t0:t1].float()
171
- lg.clamp_(-50, 50)
172
- acc.add_(F.cross_entropy(
173
- lg.view(-1, V), tgt[:, t0:t1].reshape(-1),
174
- reduction="sum", label_smoothing=label_smoothing,
175
- ))
176
- del lg
177
- ctx.save_for_backward(logits, tgt)
178
- ctx.chunk_size = chunk_size
179
- ctx.label_smoothing = label_smoothing
180
- return acc.div_(B * T)
181
-
182
- @staticmethod
183
- def backward(ctx, g):
184
- logits, tgt = ctx.saved_tensors
185
- B, T, V = logits.shape
186
- chunk_size = ctx.chunk_size
187
- ls = ctx.label_smoothing
188
- scale = g.item() / (B * T)
189
- grad = torch.zeros_like(logits)
190
- with torch.no_grad():
191
- for t0 in range(0, T, chunk_size):
192
- t1 = min(t0 + chunk_size, T)
193
- C = t1 - t0
194
- lg = logits[:, t0:t1].float()
195
- lg.clamp_(-50, 50)
196
- probs = F.softmax(lg.view(-1, V), dim=-1)
197
- del lg
198
- idx = tgt[:, t0:t1].reshape(-1)
199
- probs[torch.arange(B * C, device=probs.device), idx] -= (1.0 - ls)
200
- probs -= ls / V
201
- grad[:, t0:t1].add_(probs.view(B, C, V).to(grad.dtype), alpha=scale)
202
- del probs, idx
203
- return grad, None, None, None
204
-
205
-
206
- def chunked_ce(logits, targets, label_smoothing=0.0):
207
- return _ChunkedCE.apply(logits, targets.reshape(-1), CE_CHUNK, label_smoothing)
208
-
209
-
210
- # ---------------------------------------------------------------------------
211
- # Label smoothing curriculum
212
- # ---------------------------------------------------------------------------
213
-
214
- def get_label_smoothing(epoch: int) -> float:
215
- if epoch <= 5:
216
- return 0.10
217
- if epoch <= 15:
218
- return 0.05
219
- return 0.02
220
-
221
-
222
- # ---------------------------------------------------------------------------
223
- # Loss функции v11
224
- #
225
- # Change B: total_loss -= ANTI_LAMBDA * CE(head3, t+1)
226
- # h3 получает отрицательный градиент на задаче t+1 — вынужден избегать
227
- # признаков, полезных для предсказания следующего токена.
228
- # ---------------------------------------------------------------------------
229
-
230
- def train_loss_fn_v11(l1, l2, l3, pred_loss, batch, epoch):
231
- w1, w2, w3 = TRAIN_HEAD_WEIGHTS
232
- ls = get_label_smoothing(epoch)
233
- H1, H2, H3 = HORIZONS
234
- T_eff = l1.shape[1]
235
-
236
- n1 = T_eff - H1 + 1
237
- n2 = T_eff - H2 + 1
238
- n3 = T_eff - H3 + 1
239
-
240
- ce1 = chunked_ce(l1[:, :n1, :], batch[:, H1:H1 + n1], ls)
241
- ce2 = chunked_ce(l2[:, :n2, :], batch[:, H2:H2 + n2], ls)
242
- ce3 = chunked_ce(l3[:, :n3, :], batch[:, H3:H3 + n3], ls)
243
-
244
- # Change B: минимальный anti-task — лёгкий намёк, не убивает h3
245
- anti3 = chunked_ce(l3[:, :n1, :], batch[:, H1:H1 + n1], 0.0)
246
-
247
- return w1 * ce1 + w2 * ce2 + w3 * ce3 + PRED_LAMBDA * pred_loss - ANTI_LAMBDA * anti3
248
-
249
-
250
- def val_h1_loss_fn(l1, batch):
251
- return chunked_ce(l1, batch[:, 1:], label_smoothing=0.0)
252
-
253
-
254
- def val_ce3_loss_fn(l3, batch):
255
- return chunked_ce(l3, batch[:, 1:], label_smoothing=0.0)
256
-
257
-
258
- def val_far_loss_fn(l3, batch):
259
- H3 = HORIZONS[2]
260
- T_eff = l3.shape[1]
261
- n3 = T_eff - H3 + 1
262
- return chunked_ce(l3[:, :n3, :], batch[:, H3:H3 + n3], label_smoothing=0.0)
263
-
264
-
265
- # ---------------------------------------------------------------------------
266
- # BPEDataset
267
- # ---------------------------------------------------------------------------
268
-
269
- _SHAKESPEARE = """First Citizen:
270
- Before we proceed any further, hear me speak.
271
-
272
- All:
273
- Speak, speak.
274
-
275
- First Citizen:
276
- You are all resolved rather to die than to famish?
277
-
278
- All:
279
- Resolved. resolved.
280
-
281
- First Citizen:
282
- First, you know Caius Marcius is chief enemy to the people.
283
-
284
- All:
285
- We know't, we know't.
286
-
287
- First Citizen:
288
- Let us kill him, and we'll have corn at our own price.
289
-
290
- VOLUMNIA:
291
- O, he is wounded; I thank the gods for't.
292
-
293
- MENENIUS:
294
- So do I too, if it be not too much: brings a' victory in his pocket?
295
- the wounds become him.
296
-
297
- VOLUMNIA:
298
- On's brows: Menenius, he comes the third time home with the oaken garland.
299
-
300
- MENENIUS:
301
- Has he disciplined Aufidius soundly?
302
-
303
- VOLUMNIA:
304
- Titus Lartius writes, they fought together, but Aufidius got off.
305
-
306
- MENENIUS:
307
- And 'twas time for him too, I'll warrant him that: an he had stayed
308
- by him, I would not have been so fidiussed for all the chests in Corioli,
309
- and the gold that's in them.
310
-
311
- CORIOLANUS:
312
- Thanks. What's the matter, you dissentious rogues,
313
- That, rubbing the poor itch of your opinion,
314
- Make yourselves scabs?
315
- """ * 2000
316
-
317
-
318
- class BPEDataset(Dataset):
319
- BPE_VOCAB_SIZE = 50257
320
-
321
- def __init__(self, tokens: torch.Tensor, seq_len: int):
322
- self.data = tokens
323
- self.seq_len = seq_len
324
- self.vocab_size = self.BPE_VOCAB_SIZE
325
-
326
- def __len__(self):
327
- return max(0, (len(self.data) - 1) // self.seq_len)
328
-
329
- def __getitem__(self, idx):
330
- start = idx * self.seq_len
331
- return self.data[start : start + self.seq_len + 1]
332
-
333
- @classmethod
334
- def from_text(cls, text: str, seq_len: int) -> "BPEDataset":
335
- import tiktoken
336
- enc = tiktoken.get_encoding("gpt2")
337
- token_ids = enc.encode(text)
338
- tokens = torch.tensor(token_ids, dtype=torch.long)
339
- print(f"BPE токенов: {len(tokens):,} vocab_size={cls.BPE_VOCAB_SIZE}", flush=True)
340
- return cls(tokens, seq_len)
341
-
342
-
343
- def load_data():
344
- try:
345
- from datasets import load_dataset
346
- print(f"Загружаю Wikipedia (target={TARGET_CHARS:,} символов)...", flush=True)
347
- ds = load_dataset("wikimedia/wikipedia", "20231101.en", streaming=True, split="train")
348
- buf = []
349
- total = 0
350
- for ex in ds:
351
- chunk = ex["text"].strip()
352
- if not chunk:
353
- continue
354
- buf.append(chunk)
355
- total += len(chunk)
356
- if total >= TARGET_CHARS:
357
- break
358
- text = "\n\n".join(buf)[:TARGET_CHARS]
359
- print(f"Wikipedia загружена: {len(text):,} символов", flush=True)
360
- return text
361
- except Exception as e:
362
- print(f"Wikipedia недоступна ({e}), переключаюсь на Shakespeare", flush=True)
363
- return _SHAKESPEARE
364
-
365
-
366
- # ---------------------------------------------------------------------------
367
- # Parallel prefix scan
368
- # ---------------------------------------------------------------------------
369
-
370
- def parallel_scan_chunk(A, b, h_init):
371
- orig_dtype = b.dtype
372
- p = A.float().clone()
373
- q = b.float().clone()
374
- h = h_init.float()
375
- stride = 1
376
- while stride < p.shape[1]:
377
- i = torch.arange(stride, p.shape[1], device=A.device)
378
- j = i - stride
379
- pi = p[:, i, :]
380
- pj = p[:, j, :]
381
- qi = q[:, i, :]
382
- qj = q[:, j, :]
383
- p = p.clone()
384
- q = q.clone()
385
- p[:, i, :] = pj * pi
386
- q[:, i, :] = pi * qj + qi
387
- stride *= 2
388
- result = p * h.unsqueeze(1) + q
389
- return result.to(orig_dtype)
390
-
391
-
392
- # ---------------------------------------------------------------------------
393
- # Уровень v11
394
- #
395
- # Change C: level3 создаётся с inp_dim=0.
396
- # forward_chunk проверяет inp_dim: если 0 — не конкатенирует x_chunk.
397
- # Все остальные уровни (level1, level2) работают как прежде.
398
- # ---------------------------------------------------------------------------
399
-
400
- class MambaLevelV11(nn.Module):
401
- def __init__(self, hidden_dim, inp_dim, cross_dim, tau, a_min, a_max, dropout=0.0):
402
- super().__init__()
403
- D = hidden_dim
404
- self.inp_dim = inp_dim
405
- total = inp_dim + cross_dim
406
-
407
- self.a_min = a_min
408
- self.a_range = a_max - a_min
409
-
410
- self.net_A = nn.Sequential(
411
- nn.Linear(total, D * 2),
412
- nn.SiLU(),
413
- nn.Dropout(dropout),
414
- nn.Linear(D * 2, D),
415
- )
416
- self.net_B = nn.Sequential(
417
- nn.Linear(total, D * 2),
418
- nn.SiLU(),
419
- nn.Dropout(dropout),
420
- nn.Linear(D * 2, D),
421
- )
422
- self.norm = nn.LayerNorm(D)
423
-
424
- target_A = 1.0 - 1.0 / tau
425
- x = max(0.01, min(0.99, (target_A - a_min) / self.a_range))
426
- logit_A = math.log(x / (1.0 - x))
427
- with torch.no_grad():
428
- self.net_A[-1].bias.fill_(logit_A)
429
-
430
- def forward_chunk(self, x_chunk, h_cross_chunk, h_init):
431
- # Change C: level3 имеет inp_dim=0 — x_chunk игнорируется
432
- if self.inp_dim == 0:
433
- inp = h_cross_chunk
434
- else:
435
- inp = torch.cat([x_chunk, h_cross_chunk], dim=-1)
436
- A = self.a_min + self.a_range * torch.sigmoid(self.net_A(inp))
437
- b = (1.0 - A) * torch.tanh(self.net_B(inp))
438
- return self.norm(parallel_scan_chunk(A, b, h_init))
439
-
440
-
441
- # ---------------------------------------------------------------------------
442
- # Конфиг v11
443
- # ---------------------------------------------------------------------------
444
-
445
- @dataclass
446
- class V11Config:
447
- vocab_size: int
448
- hidden_dim: int = 256
449
- taus: tuple = (4.0, 32.0, 128.0)
450
- a_ranges: tuple = field(default_factory=lambda: ((0.55, 0.88), (0.90, 0.975), (0.980, 0.999)))
451
- jacobi_k: int = 2
452
- dropout: float = 0.1
453
- horizons: tuple = (1, 4, 32)
454
- pred_lambda: float = 0.1
455
- anti_lambda: float = 0.15
456
- h3_slow_tick: int = 32
457
- landmark_stride: int = 32
458
- landmark_heads: int = 4
459
-
460
-
461
- # ---------------------------------------------------------------------------
462
- # Модель v11
463
- #
464
- # v11 = v10 + Change B + Change C + Change D
465
- #
466
- # Change B (anti-task):
467
- # total_loss -= ANTI_LAMBDA * CE(head3, t+1)
468
- # h3 получает отрицательный градиент на задаче t+1.
469
- # Вынужден активно избегать признаков, полезных для предсказания следующего токена.
470
- # ANTI_LAMBDA=0.15 (было 0.03 — слишком слабо при w3=0.5).
471
- #
472
- # Change C (no-X for h3):
473
- # level3 создан с inp_dim=0.
474
- # level3 видит только h2_error (cross_dim=D), не имеет прямого доступа к X.
475
- # Убирает "шорткат" через локальный контекст токена.
476
- #
477
- # Change D (slow-tick):
478
- # h3 получает новый h2_error только раз в H3_SLOW_TICK=32 токенов.
479
- # Между обновлениями h3 видит то же самое h2_error (hold-pattern).
480
- # Принуждает h3 интегрировать информацию крупными блоками.
481
- #
482
- # Архитектура (Jacobi K=2):
483
- # iter k:
484
- # h1 = scan1(X, h2.detach())
485
- # h1_error = (h1 - pred12(h2.detach())).detach()
486
- # h2 = scan2(X, cat[h1_error, h3.detach()])
487
- # h2_error = (h2 - pred23(h3.detach())).detach()
488
- # h2_error_slow = repeat_interleave(h2_error[:,::32,:], 32) ← Change D
489
- # h3 = scan3(h2_error_slow) ← Change C: нет X
490
- # h3 = h3 + LN(landmark_attn(h3, ...)) ← из v10, внутри цикла
491
- #
492
- # Grad isolation сохранён: все cross-соединения через .detach().
493
- # ---------------------------------------------------------------------------
494
-
495
- class HarmonicV11(nn.Module):
496
- def __init__(self, cfg: V11Config):
497
- super().__init__()
498
- self.cfg = cfg
499
- D = cfg.hidden_dim
500
- drop = cfg.dropout
501
-
502
- self.embed = nn.Embedding(cfg.vocab_size, D)
503
- nn.init.normal_(self.embed.weight, std=1.0 / math.sqrt(D))
504
-
505
- self.drop_in = nn.Dropout(drop)
506
- self.drop_out = nn.Dropout(drop)
507
-
508
- ar = cfg.a_ranges
509
- self.level1 = MambaLevelV11(D, D, D, tau=cfg.taus[0],
510
- a_min=ar[0][0], a_max=ar[0][1], dropout=drop)
511
- self.level2 = MambaLevelV11(D, D, D * 2, tau=cfg.taus[1],
512
- a_min=ar[1][0], a_max=ar[1][1], dropout=drop)
513
- # Change C: inp_dim=0 — level3 не видит X напрямую
514
- self.level3 = MambaLevelV11(D, inp_dim=0, cross_dim=D, tau=cfg.taus[2],
515
- a_min=ar[2][0], a_max=ar[2][1], dropout=drop)
516
-
517
- self.pred12 = nn.Linear(D, D)
518
- self.pred23 = nn.Linear(D, D)
519
-
520
- # h3 landmark attention — из v10, применяется ВНУТРИ цикла Якоби
521
- self.h3_landmark_attn = nn.MultiheadAttention(
522
- D, num_heads=cfg.landmark_heads, batch_first=True, dropout=drop
523
- )
524
- self.h3_landmark_norm = nn.LayerNorm(D)
525
-
526
- self.ln1 = nn.LayerNorm(D)
527
- self.ln2 = nn.LayerNorm(D)
528
- self.ln3 = nn.LayerNorm(D)
529
-
530
- self.head1 = nn.Linear(D, cfg.vocab_size)
531
- self.head2 = nn.Linear(D, cfg.vocab_size)
532
- self.head3 = nn.Linear(D, cfg.vocab_size)
533
-
534
- def _scan_level(self, level, X, cross, chunk_size):
535
- B, T, D = X.shape
536
- parts = []
537
- h = torch.zeros(B, D, device=X.device, dtype=X.dtype)
538
- for i in range(0, T, chunk_size):
539
- j = min(i + chunk_size, T)
540
- h_traj = level.forward_chunk(X[:, i:j], cross[:, i:j], h)
541
- parts.append(h_traj)
542
- h = h_traj[:, -1, :]
543
- return torch.cat(parts, dim=1)
544
-
545
- def _apply_landmark_attn(self, h3_all):
546
- B, T, D = h3_all.shape
547
- stride = self.cfg.landmark_stride
548
- device = h3_all.device
549
-
550
- h3_landmarks = h3_all[:, ::stride, :]
551
- N = h3_landmarks.shape[1]
552
-
553
- landmark_positions = torch.arange(N, device=device) * stride
554
- query_positions = torch.arange(T, device=device)
555
- attn_mask = torch.zeros(T, N, device=device, dtype=h3_all.dtype)
556
- blocked = landmark_positions.unsqueeze(0) > query_positions.unsqueeze(1)
557
- attn_mask.masked_fill_(blocked, float("-inf"))
558
-
559
- attn_out, _ = self.h3_landmark_attn(
560
- query=h3_all,
561
- key=h3_landmarks,
562
- value=h3_landmarks,
563
- attn_mask=attn_mask,
564
- need_weights=False,
565
- )
566
- return h3_all + self.h3_landmark_norm(attn_out)
567
-
568
- def forward(self, tokens):
569
- B, T = tokens.shape
570
- device = tokens.device
571
- D = self.cfg.hidden_dim
572
- K = self.cfg.jacobi_k
573
-
574
- X = self.drop_in(self.embed(tokens[:, :-1]))
575
- T_eff = T - 1
576
-
577
- c1 = int(self.cfg.taus[0])
578
- c2 = int(self.cfg.taus[1])
579
- c3 = int(self.cfg.taus[2])
580
-
581
- h1_all = torch.zeros(B, T_eff, D, device=device, dtype=X.dtype)
582
- h2_all = torch.zeros(B, T_eff, D, device=device, dtype=X.dtype)
583
- h3_all = torch.zeros(B, T_eff, D, device=device, dtype=X.dtype)
584
-
585
- for _ in range(K):
586
- h1_all = self._scan_level(self.level1, X, h2_all.detach(), c1)
587
-
588
- h1_pred = self.pred12(h2_all.detach())
589
- h1_error = (h1_all - h1_pred).detach()
590
- h2_all = self._scan_level(self.level2, X,
591
- torch.cat([h1_error, h3_all.detach()], dim=-1), c2)
592
-
593
- h2_pred = self.pred23(h3_all.detach())
594
- h2_error = (h2_all - h2_pred).detach()
595
- # Change C+D: true state-hold — скан только по tick-позициям,
596
- # state держится константным между тиками (вместо soft input-hold)
597
- _T = h2_error.shape[1]
598
- h3_ticks = self._scan_level(
599
- self.level3,
600
- X[:, ::H3_SLOW_TICK, :],
601
- h2_error[:, ::H3_SLOW_TICK, :],
602
- c3,
603
- )
604
- h3_all = h3_ticks.repeat_interleave(H3_SLOW_TICK, dim=1)[:, :_T, :]
605
-
606
- # landmark attention внутри цикла (из v10)
607
- h3_all = self._apply_landmark_attn(h3_all)
608
-
609
- pred_loss = (
610
- F.mse_loss(self.pred12(h2_all.detach()), h1_all.detach()) +
611
- F.mse_loss(self.pred23(h3_all.detach()), h2_all.detach())
612
- )
613
-
614
- l1 = self.head1(self.drop_out(self.ln1(h1_all)))
615
- l2 = self.head2(self.drop_out(self.ln2(h2_all)))
616
- l3 = self.head3(self.drop_out(self.ln3(h3_all)))
617
- return l1, l2, l3, pred_loss
618
-
619
-
620
- # ---------------------------------------------------------------------------
621
- # Утилиты
622
- # ---------------------------------------------------------------------------
623
-
624
- def count_params(model):
625
- return sum(p.numel() for p in model.parameters())
626
-
627
-
628
- def measure_A_means(raw_model, device):
629
- D = raw_model.cfg.hidden_dim
630
- param_dtype = next(raw_model.parameters()).dtype
631
- x = torch.zeros(1, 4, D, device=device, dtype=param_dtype)
632
- z1 = torch.zeros(1, 4, D, device=device, dtype=param_dtype)
633
- z2 = torch.zeros(1, 4, D * 2, device=device, dtype=param_dtype)
634
-
635
- def bounded_A(level, inp):
636
- return (level.a_min + level.a_range * torch.sigmoid(level.net_A(inp))).mean().item()
637
-
638
- with torch.no_grad():
639
- a1 = bounded_A(raw_model.level1, torch.cat([x, z1], dim=-1))
640
- a2 = bounded_A(raw_model.level2, torch.cat([x, z2], dim=-1))
641
- # Change C: level3.inp_dim=0, принимает только cross (D-мерный)
642
- a3 = bounded_A(raw_model.level3, z1)
643
- return a1, a2, a3
644
-
645
-
646
- # ---------------------------------------------------------------------------
647
- # Основной цикл обучения
648
- # ---------------------------------------------------------------------------
649
-
650
- def run_training(model, train_loader, val_loader, device, amp_dtype):
651
- n_gpus = torch.cuda.device_count() if device.type == "cuda" else 0
652
- if n_gpus > 1:
653
- print(f"DataParallel: {n_gpus} GPU", flush=True)
654
- model = nn.DataParallel(model)
655
- raw_model = model.module if isinstance(model, nn.DataParallel) else model
656
- _ckpt_val_far = float("inf")
657
-
658
- _warm_ck = None
659
- if WARM_START:
660
- from huggingface_hub import hf_hub_download
661
- rid = _hf_repo_id()
662
- print(f"Warm-start: скачиваем {WARM_START_HF} из {rid} ...", flush=True)
663
- local_ckpt = hf_hub_download(repo_id=rid, filename=WARM_START_HF, token=HF_TOKEN)
664
- import sys as _sys
665
- _sys.modules.setdefault("train_gpu_v11", _sys.modules["__main__"])
666
- _warm_ck = torch.load(local_ckpt, map_location=device, weights_only=False)
667
- raw_model.load_state_dict(_warm_ck["model_state"])
668
- _ckpt_val_far = _warm_ck.get("val_far", float("inf"))
669
- print(f" Чекпоинт загружен (epoch={_warm_ck.get('epoch','?')}, val_far={_ckpt_val_far:.4f})",
670
- flush=True)
671
- has_opt = "optimizer_state" in _warm_ck
672
- print(f" optimizer_state: {'есть' if has_opt else 'нет (только model_state)'}",
673
- flush=True)
674
-
675
- optimizer = torch.optim.AdamW(
676
- [p for p in model.parameters() if p.requires_grad], lr=LR, weight_decay=0.01
677
- )
678
- use_amp = (device.type == "cuda" and amp_dtype is not None)
679
- scaler = torch.amp.GradScaler("cuda", enabled=(amp_dtype == torch.float16))
680
-
681
- def lr_lambda(epoch_idx):
682
- if epoch_idx < LR_WARMUP_EPOCHS:
683
- return float(epoch_idx + 1) / LR_WARMUP_EPOCHS
684
- progress = (epoch_idx - LR_WARMUP_EPOCHS) / max(1, EPOCHS - LR_WARMUP_EPOCHS)
685
- return 0.1 + 0.9 * 0.5 * (1.0 + math.cos(math.pi * progress))
686
-
687
- scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda)
688
-
689
- best_val = _ckpt_val_far if WARM_START else float("inf")
690
- no_improve = 0
691
- start_epoch = 1
692
-
693
- if WARM_START and _warm_ck is not None and "optimizer_state" in _warm_ck:
694
- optimizer.load_state_dict(_warm_ck["optimizer_state"])
695
- if "scheduler_state" in _warm_ck:
696
- scheduler.load_state_dict(_warm_ck["scheduler_state"])
697
- start_epoch = _warm_ck.get("epoch", 0) + 1
698
- no_improve = _warm_ck.get("no_improve", 0)
699
- best_val = _warm_ck.get("best_val", _ckpt_val_far)
700
- print(f" Продолжаем с эпохи {start_epoch} best_val={best_val:.4f} no_improve={no_improve}",
701
- flush=True)
702
-
703
- if not WARM_START:
704
- last_ckpt = os.path.join(CKPT_DIR, "last_checkpoint_v11.pt")
705
- if os.path.exists(last_ckpt):
706
- ck = torch.load(last_ckpt, map_location=device, weights_only=False)
707
- raw_model.load_state_dict(ck["model_state"])
708
- optimizer.load_state_dict(ck["optimizer_state"])
709
- if "scheduler_state" in ck:
710
- scheduler.load_state_dict(ck["scheduler_state"])
711
- start_epoch = ck["epoch"] + 1
712
- best_val = ck["best_val"]
713
- no_improve = ck["no_improve"]
714
- print(f" Resume: epoch {start_epoch} best_val={best_val:.4f} no_improve={no_improve}",
715
- flush=True)
716
-
717
- amp_name = str(amp_dtype).replace("torch.", "") if amp_dtype else "fp32"
718
- V = raw_model.cfg.vocab_size
719
- H1, H2, H3 = raw_model.cfg.horizons
720
- print(f"\nпараметры: {count_params(model):,} jacobi_k={JACOBI_K}"
721
- f" hidden={raw_model.cfg.hidden_dim} vocab={V} AMP={amp_name} GPUs={max(n_gpus,1)}",
722
- flush=True)
723
- print(f"head_weights={TRAIN_HEAD_WEIGHTS} horizons=({H1},{H2},{H3})"
724
- f" dropout={DROPOUT} pred_lambda={PRED_LAMBDA}", flush=True)
725
- print(f"anti_lambda={ANTI_LAMBDA} (Change B: h3 штрафуется за t+1)", flush=True)
726
- print(f"level3.inp_dim=0 (Change C: нет прямого доступа к X)", flush=True)
727
- print(f"h3_slow_tick={H3_SLOW_TICK} (Change D: h3 обновляется раз в {H3_SLOW_TICK} токенов)", flush=True)
728
- print(f"A_ranges={A_RANGES}", flush=True)
729
- print(f"landmark_stride={LANDMARK_STRIDE} landmark_heads={LANDMARK_HEADS}", flush=True)
730
- print(f"seq_len={SEQ_LEN} batch={BATCH_SIZE} tokens/batch={SEQ_LEN*BATCH_SIZE}",
731
- flush=True)
732
-
733
- header = (f"{'epoch':>5} {'tr_loss':>8} {'val_h1':>7} {'val_ce3':>8}"
734
- f" {'val_far':>8} {'pred_l':>7} {'A1':>6} {'A2':>6} {'A3':>6}"
735
- f" {'lr':>8} {'t/ep':>7}")
736
- print(f"\n{header}", flush=True)
737
- print("-" * len(header), flush=True)
738
-
739
- A1_mean = A2_mean = A3_mean = float("nan")
740
-
741
- for epoch in range(start_epoch, EPOCHS + 1):
742
- model.train()
743
- t0 = time.perf_counter()
744
- train_loss_acc = 0.0
745
- pred_loss_acc = 0.0
746
- n_batches = 0
747
- nan_batches = 0
748
-
749
- for batch in train_loader:
750
- batch = batch.to(device, non_blocking=True)
751
- optimizer.zero_grad()
752
- with torch.amp.autocast("cuda", dtype=amp_dtype, enabled=use_amp):
753
- l1, l2, l3, pred_loss = model(batch)
754
- loss = train_loss_fn_v11(l1, l2, l3, pred_loss, batch, epoch)
755
- l = loss.item()
756
- if math.isnan(l) or math.isinf(l):
757
- nan_batches += 1
758
- optimizer.zero_grad()
759
- continue
760
- scaler.scale(loss).backward()
761
- scaler.unscale_(optimizer)
762
- torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
763
- scaler.step(optimizer)
764
- scaler.update()
765
- train_loss_acc += l
766
- pred_loss_acc += pred_loss.item()
767
- n_batches += 1
768
- if n_batches % 200 == 0:
769
- avg = train_loss_acc / n_batches
770
- elapsed_so_far = time.perf_counter() - t0
771
- print(f" epoch {epoch} batch {n_batches} loss {avg:.4f} {elapsed_so_far:.1f}s",
772
- flush=True)
773
-
774
- model.eval()
775
- val_h1_acc = 0.0
776
- val_ce3_acc = 0.0
777
- val_far_acc = 0.0
778
- with torch.no_grad():
779
- for batch in val_loader:
780
- batch = batch.to(device, non_blocking=True)
781
- with torch.amp.autocast("cuda", dtype=amp_dtype, enabled=use_amp):
782
- l1, l2, l3, _ = model(batch)
783
- val_h1_acc += val_h1_loss_fn(l1, batch).item()
784
- val_ce3_acc += val_ce3_loss_fn(l3, batch).item()
785
- val_far_acc += val_far_loss_fn(l3, batch).item()
786
-
787
- tr_loss = train_loss_acc / n_batches if n_batches > 0 else float("nan")
788
- pred_avg = pred_loss_acc / n_batches if n_batches > 0 else float("nan")
789
- val_h1 = val_h1_acc / len(val_loader)
790
- val_ce3 = val_ce3_acc / len(val_loader)
791
- val_far = val_far_acc / len(val_loader)
792
- elapsed = time.perf_counter() - t0
793
- cur_lr = optimizer.param_groups[0]["lr"]
794
-
795
- A1_mean, A2_mean, A3_mean = measure_A_means(raw_model, device)
796
-
797
- far_marker = " [FAR<CE3]" if val_far < val_ce3 else ""
798
- nan_str = f" [NaN:{nan_batches}]" if nan_batches > 0 else ""
799
- print(f" {epoch:>3} {tr_loss:.4f} {val_h1:.4f} {val_ce3:.4f}"
800
- f" {val_far:.4f} {pred_avg:.4f} {A1_mean:.3f} {A2_mean:.3f} {A3_mean:.3f}"
801
- f" {cur_lr:.2e} {elapsed:.0f}s{far_marker}{nan_str}", flush=True)
802
-
803
- scheduler.step()
804
-
805
- if elapsed > MAX_EPOCH_SECONDS:
806
- print(f" ABORT: эпоха {epoch} заняла {elapsed:.0f}s > {MAX_EPOCH_SECONDS}s",
807
- flush=True)
808
- break
809
-
810
- epoch_model_path = os.path.join(CKPT_DIR, f"v11_epoch_{epoch:02d}_model.pt")
811
- torch.save(
812
- {"epoch": epoch, "val_h1": val_h1, "val_ce3": val_ce3, "val_far": val_far,
813
- "pred_loss": pred_avg,
814
- "model_state": raw_model.state_dict(),
815
- "cfg": raw_model.cfg},
816
- epoch_model_path
817
- )
818
- upload_to_hf_epoch(epoch_model_path, epoch, val_far)
819
-
820
- if val_far < best_val:
821
- best_val = val_far
822
- no_improve = 0
823
- best_path = os.path.join(CKPT_DIR, "best_checkpoint_v11.pt")
824
- torch.save(
825
- {"epoch": epoch, "val_h1": val_h1, "val_ce3": val_ce3, "val_far": val_far,
826
- "pred_loss": pred_avg,
827
- "model_state": raw_model.state_dict(),
828
- "cfg": raw_model.cfg},
829
- best_path
830
- )
831
- upload_to_hf(best_path, "best_checkpoint_v11.pt")
832
- else:
833
- no_improve += 1
834
- if no_improve >= EARLY_STOP:
835
- print(f" Ранняя остановка на эпохе {epoch} (нет улучшения val_far {EARLY_STOP} эпох)",
836
- flush=True)
837
- break
838
-
839
- last_path = os.path.join(CKPT_DIR, "last_checkpoint_v11.pt")
840
- torch.save(
841
- {"epoch": epoch, "val_h1": val_h1, "val_ce3": val_ce3, "val_far": val_far,
842
- "pred_loss": pred_avg,
843
- "best_val": best_val, "no_improve": no_improve,
844
- "model_state": raw_model.state_dict(),
845
- "optimizer_state": optimizer.state_dict(),
846
- "scheduler_state": scheduler.state_dict(),
847
- "cfg": raw_model.cfg},
848
- last_path
849
- )
850
- upload_to_hf(last_path, "v11_last_checkpoint.pt")
851
- if os.path.exists(LOG_FILE):
852
- upload_to_hf(LOG_FILE, "v11_training_log.txt")
853
-
854
- return best_val, A1_mean, A2_mean, A3_mean
855
-
856
-
857
- def main():
858
- sys.stdout = _Tee(LOG_FILE)
859
- os.makedirs(CKPT_DIR, exist_ok=True)
860
- torch.manual_seed(SEED)
861
- device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
862
- amp_dtype = get_amp_dtype(device)
863
- print(f"device: {device}", flush=True)
864
- if device.type == "cuda":
865
- p = torch.cuda.get_device_properties(0)
866
- amp_name = str(amp_dtype).replace("torch.", "") if amp_dtype else "fp32"
867
- print(f"GPU: {p.name} VRAM: {p.total_memory // 1024 ** 2} MB AMP: {amp_name}",
868
- flush=True)
869
-
870
- text = load_data()
871
- full_ds = BPEDataset.from_text(text, seq_len=SEQ_LEN)
872
- V = full_ds.vocab_size
873
- n_total = min(len(full_ds), MAX_SEQS)
874
- indices = torch.randperm(len(full_ds),
875
- generator=torch.Generator().manual_seed(SEED))[:n_total]
876
- dataset = Subset(full_ds, indices.tolist())
877
- n_val = max(1, n_total // 10)
878
- n_train = n_total - n_val
879
- train_ds, val_ds = random_split(
880
- dataset, [n_train, n_val],
881
- generator=torch.Generator().manual_seed(SEED)
882
- )
883
- pin = (device.type == "cuda")
884
- nw = 4 if device.type == "cuda" else 0
885
- train_loader = DataLoader(train_ds, batch_size=BATCH_SIZE, shuffle=True,
886
- pin_memory=pin, num_workers=nw,
887
- persistent_workers=(nw > 0))
888
- val_loader = DataLoader(val_ds, batch_size=BATCH_SIZE,
889
- pin_memory=pin, num_workers=nw,
890
- persistent_workers=(nw > 0))
891
-
892
- print(f"используем={n_total:,} последовательностей seq_len={SEQ_LEN} vocab={V}",
893
- flush=True)
894
-
895
- cfg = V11Config(
896
- vocab_size=V,
897
- hidden_dim=HIDDEN_DIM,
898
- taus=TAUS,
899
- a_ranges=A_RANGES,
900
- jacobi_k=JACOBI_K,
901
- dropout=DROPOUT,
902
- horizons=HORIZONS,
903
- pred_lambda=PRED_LAMBDA,
904
- anti_lambda=ANTI_LAMBDA,
905
- landmark_stride=LANDMARK_STRIDE,
906
- landmark_heads=LANDMARK_HEADS,
907
- )
908
- model = HarmonicV11(cfg).to(device)
909
-
910
- print("\n" + "=" * 64, flush=True)
911
- print("ОБУЧЕНИЕ — Harmonic v11", flush=True)
912
- print(" bounded-A + Jacobi K=2 + predictive coding + landmark attn", flush=True)
913
- print(" Change B: total_loss -= ANTI_LAMBDA * CE(head3, t+1)", flush=True)
914
- print(" h3 получает отрицательный градиент на предсказании t+1", flush=True)
915
- print(" Change C: level3.inp_dim=0, level3 не видит X нап��ямую", flush=True)
916
- print(" level3 видит только h2_error (ошибку предсказания h2)", flush=True)
917
- print(" цель: val_far < val_ce3 (h3 специализируется на t+32)", flush=True)
918
- print(f" anti_lambda={ANTI_LAMBDA} pred_lambda={PRED_LAMBDA}", flush=True)
919
- print(f" epochs={EPOCHS} early_stop={EARLY_STOP} lr={LR}", flush=True)
920
- print(f" train={n_train} val={n_val} seq_len={SEQ_LEN}", flush=True)
921
- print("=" * 64, flush=True)
922
-
923
- best_val, A1, A2, A3 = run_training(model, train_loader, val_loader, device, amp_dtype)
924
-
925
- print("\n" + "=" * 64, flush=True)
926
- print("ИТОГ — Harmonic v11", flush=True)
927
- print("=" * 64, flush=True)
928
- print(f" val_far лучший: {best_val:.4f}", flush=True)
929
- print(f" vocab_size: {V}", flush=True)
930
- hierarchy_ok = (A1 < A2 < A3)
931
- print(f"\n Иерархия A1={A1:.3f} A2={A2:.3f} A3={A3:.3f}", flush=True)
932
- if hierarchy_ok:
933
- print(" [OK] A1 < A2 < A3 — иерархия подтверждена", flush=True)
934
- else:
935
- print(" [WARN] Иерархия A нарушена", flush=True)
936
-
937
-
938
- if __name__ == "__main__":
939
- main()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
v11_e01_5.7054.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:42b98782046213ea1b468b13f6f84feea728013ce9cf05502b78eecccf670beb
3
- size 106321229
 
 
 
 
v11_e01_7.6276.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:5052c908cccf1f3d0ec8d6f57aaf046bd9f6acaffa9a14faa377eeea99ddfcb4
3
- size 106321229
 
 
 
 
v11_e01_7.6320.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:4d7c9b77fe6330406840f3e1dfbdeb4c451e937f7ba9526b5f9b3f4744130ce5
3
- size 106321229
 
 
 
 
v11_e01_7.6413.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:60c06e6a05895e8c32bf313d8bd811adf57a40fb2bf959627e4b403bf99362fa
3
- size 106321229
 
 
 
 
v11_e01_7.6450.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:b0f534fdb0ba77a4cdc073707b40698f3657577d45a7949f8f0abc4a1d495f70
3
- size 106321229
 
 
 
 
v11_e01_7.6961.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:f66b05e966ebde5fdd703c81fb1d4795c344b59fed68a58494cd8a862f7c1021
3
- size 106321229
 
 
 
 
v11_e02_4.8399.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:8671309d39b985cc1c057cec179e49d4b0ec1607c463264168715e6fc9840a02
3
- size 106321229
 
 
 
 
v11_e02_7.6341.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:86bead10890cef72e60bce1a0458cce86852b5fb74b98e1e7dfef2a6d727ffc0
3
- size 106321229
 
 
 
 
v11_e02_7.6347.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:940e7963218ba22a97f0729acf920278ae6984b128fc22a6da36aa0e14913b79
3
- size 106321229
 
 
 
 
v11_e02_7.6381.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:fe686787306cecb30d9999d5dd8d6c1329e5c48adf1d65536f34b0cef8760d17
3
- size 106321229
 
 
 
 
v11_e02_7.6439.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:db89d3f2eaca4af4850ead22c230cb3211e5f4200963077d4242e879dedaaecc
3
- size 106321229
 
 
 
 
v11_e02_7.6467.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:2d45c7221751c7cc522498cce9284bc9983133ade6638a2b3ac4a79a51602ad4
3
- size 106321229
 
 
 
 
v11_e03_4.6867.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:35b3bc35a989f4b23591571138a63346d57b8ae23837865b9b54fc327bc1b43a
3
- size 106321229
 
 
 
 
v11_e03_7.6298.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:83c60351ccd23096d9924bed26155fa02def09eaec7767359ac45ecdfea4a5ae
3
- size 106321229
 
 
 
 
v11_e03_7.6331.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:67890774e19631f12aa4c7a8899e401ac35035338d054cb1893c200b93e306e2
3
- size 106321229
 
 
 
 
v11_e03_7.6398.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:0626a1c5f3b0642eb275f30e0ebbc5e16dc75b0483a1a19e126bd3b1f1c6da0f
3
- size 106321229
 
 
 
 
v11_e03_7.6448.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:0efc7f20de965fc4cfdfb1d833c8d685e63bed4348784bcf455cb6107e6e36f8
3
- size 106321229
 
 
 
 
v11_e03_7.6460.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:615ed2e02927f1d7897feea4559acb46cb915a0570af88430f4744db57ffe169
3
- size 106321229
 
 
 
 
v11_e03_7.6986.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:dfa08e14a7b6cde8bfe06ec20885fc56ad7913cb0d4321f5569dc74d0f2f985f
3
- size 106321229
 
 
 
 
v11_e04_4.6482.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:9c592ab53caf2ba6caadb495e8f25bf82576572f444cadb73c2cd327f29da916
3
- size 106321229
 
 
 
 
v11_e04_7.6298.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:25aa3d34dfb68ff2c78d564c9ddeb3d0c9f32535035118430e2d2517b976348d
3
- size 106321229
 
 
 
 
v11_e04_7.6346.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:a466044f4dd56fa0031415c597f1e720bd4363a0408ffead66bb686f06239e9d
3
- size 106321229
 
 
 
 
v11_e04_7.6441.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:8da39dd7d3beba258f7a4951131c80c6391ee2ba2c5a481cbeffd0cf2db61dc3
3
- size 106321229
 
 
 
 
v11_e04_7.6480.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:ca4849eb1baee43fa406e7a019ff5973ff7dbfcde674e1a21f0a9cb9c7306d7a
3
- size 106321229
 
 
 
 
v11_e04_7.6508.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:faa482e3b93deb1a23c152026dbccec0a4af6a8411b22c3edb778241a53b9989
3
- size 106321229
 
 
 
 
v11_e05_4.6245.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:975b84b79d5d9dc816f6c2d1fe8698c40332963324a321fb2aafe765e0c5b964
3
- size 106321229
 
 
 
 
v11_e05_7.6313.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:6909d0f1fc92025623fac7d1a040b4cd196ce8731d44749b86da102e5e565462
3
- size 106321229
 
 
 
 
v11_e05_7.6325.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:e508fb42b5d80486a265d396f47fbda8afa289ba0c81adb66bdfd0f1880724c0
3
- size 106321229
 
 
 
 
v11_e05_7.6487.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:ab34f5eb73be8efc372faa5a1f7f123f3aa59191abf2176fc164d58163d8bc3a
3
- size 106321229
 
 
 
 
v11_e05_7.6530.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:e339bcd35b1038023a11b8bc4c5ad7e00b689fcfb64e2c73c658af6ee5409b6e
3
- size 106321229
 
 
 
 
v11_e05_7.6534.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:0b5cf6ec7a3cb68b074e387e4c05f9b9e0d18736857e9f14888b24059de97ca3
3
- size 106321229
 
 
 
 
v11_e06_4.4890.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:5d41b500d0487aac9e8d43efeabba2e0d540498e13d5200ef946065cd449d216
3
- size 106321229
 
 
 
 
v11_e06_7.5951.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:be0fd174894fb58cfc54c15b1bb6ed0018fbdeffd2ce6161ae385953b9dec0c8
3
- size 106321229
 
 
 
 
v11_e06_7.6048.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:0aae88ac63998525fc91d65e091c000da8d33483de8a277cd3405c0edb96882c
3
- size 106321229
 
 
 
 
v11_e06_7.6115.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:7b1863380d2596b87331ac8c388a50d11a0e2f7ddfb1ed253653eb5d3bfd4b9e
3
- size 106321229
 
 
 
 
v11_e06_7.6158.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:bb6e9a97bc188f9714d7d0abdf85bd541ecc429ae185c47043e098e4a9ccbdd7
3
- size 106321229
 
 
 
 
v11_e07_4.4619.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:025ac9cd332bc89a7d446f2acfab16866e5e4abe4e86aae9681737bdd0e024d3
3
- size 106321229
 
 
 
 
v11_e07_7.5943.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:fa306ff2bda5f0dbf4ffd415edeca73d37711f198492db87ae88bcb5055eebb6
3
- size 106321229
 
 
 
 
v11_e07_7.6080.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:d30f5b0b2cdfa2cf2fd23d6d8142d6635b1a6562b10975078631cc141a8a1f66
3
- size 106321229
 
 
 
 
v11_e07_7.6106.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:4d0ed7a57e98446c691ea6919dea517790009f502e2561ecda7c2436d4b30200
3
- size 106321229
 
 
 
 
v11_e07_7.6168.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:3aef8ea4719d24b6b36a39b683b21269737077e5c290f5eea142368c029e279a
3
- size 106321229
 
 
 
 
v11_e08_4.4406.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:34d43df468d7909e5c2459b5afffde06a64ad416d35fa9ea933b134d4966c72d
3
- size 106321229
 
 
 
 
v11_e08_7.5941.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:de92a079e631d9b63c661fd288bf1793ab0954076a0be0fc4a1f6638c19d7636
3
- size 106321229
 
 
 
 
v11_e08_7.6061.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:ef6c16d99d918fbcdd58a85319bf624be8e654b2c430c2c1440cef1fc26f6276
3
- size 106321229
 
 
 
 
v11_e08_7.6097.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:33131856ebeb0c354ef9fb2ad5e0360a810eed983edc7cdb723701606fd9d5c0
3
- size 106321229
 
 
 
 
v11_e08_7.6160.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:b2fc8fd1126b864edbb5e40784b2ed9db41ea43a12d77c4cd9a4f39f5af01651
3
- size 106321229
 
 
 
 
v11_e09_4.4265.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:3e18c4ad61658c69a673cbc5696c7f86bb1ff73f146893c4b1e0a1dfd2ce4cde
3
- size 106321229
 
 
 
 
v11_e09_7.5946.pt DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:c32c1038c14cacb1c74d642660d048d7e5cb6720baeb9d78bfad3ed79a1505e9
3
- size 106321229