# Kernodeck Reprise v1 — контрольна точка, яку справді відновлено

Ця оригінальна вправа вчить невеликому числовому співвідношенню на 24 синтетичних рядках. Її мета — **перевірити відновлення тренування**, а не отримати найкращу модель чи виміряти GPU. Обчислення явно примусово виконується на **CPU**, у `float64`, з одним потоком PyTorch.

Перевірка порівнює 10 безперервних кроків із 5 кроками, контрольною точкою, а потім 5 новими кроками в **іншому процесі Python**. Четвертий процес навмисно пропускає відновлення генераторів випадкових чисел: його дрейф має бути виявлено. Жодних віддалених ресурсів, клієнтських даних чи попередньо натренованих ваг не завантажується.

## Передумови

- Середовище Python із уже встановленими PyTorch і NumPy. Наданий доказ було виконано з **Python 3.14.6, PyTorch 2.11.0+cu128 і NumPy 2.4.4**.
- Приблизно 1 МБ вільного місця для чотирьох невеликих вихідних тек. Залежності Python займають власний простір.
- Виконуйте команди з розпакованої теки `kernodeck-reprise-v1`.

Суфікс `+cu128` описує пакунок, наявний під час тесту; він не означає, що ця вправа використовувала CUDA. **Жодних обчислень CUDA, ROCm, AMP, багатокарткових чи розподілених не перевіряється цим ресурсом.** Він не використовує воркери DataLoader. Інше середовище має надати власний доказ; рівність не гарантується між версіями чи платформами.

## Команда перевірки

```console
python -B verify_resume.py --output runs/preuve-cpu
```

`-B` запобігає кешам байткоду в теці проєкту. Вихідний каталог має бути новим: жоден наявний запуск не перезаписується. Щоб почати заново, скористайтеся, наприклад, `runs/preuve-cpu-2`.

Програма виконує чотири команди тим самим інтерпретатором Python, а потім записує `runs/preuve-cpu/verification.json`. Повний запуск очікує:

```json
{"device":"cpu","all_checks_passed":true,"positive":true,"negative_divergence_detected":true,"report":"verification.json"}
```

Код виходу дорівнює **0**, якщо протокол успішний, **1**, якщо порівняння не вдалося, **2**, якщо перевірку не вдалося завершити. Успіх вимагає як позитивного відновлення, так і спостережуваного провалу негативного контролю. Просто наявного файлу контрольної точки недостатньо.

## Виконання трьох кроків вручну

```console
python -B train.py --steps 10 --output runs/continu
python -B train.py --steps 5 --output runs/coupure
python -B train.py --steps 5 --resume runs/coupure/checkpoint.pt --output runs/reprise
```

Кожен рядок запускає окремий процес. `--steps` означає **додаткові кроки**, тому третя команда завершується на кроці 10. Кожна тека містить `checkpoint.pt`, його відбиток `checkpoint.pt.sha256` і читабельний підсумок `summary.json`. Контрольні точки створюються вправою під час виконання; вони не постачаються в архіві.

Щоб побачити неповний випадок, скористайтеся новою текою:

```console
python -B train.py --steps 5 --resume runs/coupure/checkpoint.pt --omit-rng-restore --output runs/reprise-incomplete
```

Ця остання команда може завершитися без помилки Python. **Це не доводить правильного відновлення.** Команда `verify_resume.py` порівнює результати й виявляє різницю.

## Що модель насправді робить

`data.csv` містить сітку двох змінних і синтетичну ціль: `target = 0.7*x1 - 0.4*x2 + 0.15*x1*x2 + 0.1`. Вона не імітує жодних клієнтських вимірювань. Мережа має два входи, шар із восьми нейронів, `Tanh`, dropout 0,25 і вихід, тобто 33 параметри.

Тренування використовує Adam із початковою швидкістю 0,03. StepLR ділить цю швидкість навпіл кожні три кроки. Кожен батч містить чотири рядки: тому 10 кроків споживають 40 спостережень, знову проходячи деякі рядки після першої епохи. Перестановка, епоха, курсор і кількість спожитих спостережень зберігаються. На момент зупинки після п'яти кроків курсор дорівнює 20 із 24: відновлення відбувається **всередині проходу даними**.

Три джерела випадковості впливають на роботу: Python задає легкий приріст на входах, генератор NumPy PCG64 продукує шум і перестановки, PyTorch продукує dropout. Повторне встановлення початкового seed не відтворює стани, досягнуті на момент зупинки.

## Що контрольна точка зберігає і в якому порядку це зчитується

Словник містить ваги, стан Adam, стан StepLR, прогрес даних, три RNG, історію втрат і taux, а також відбитки коду та CSV. Режим `train()` відновлюється для продовження; фінальне вимірювання MSE використовує `eval()` і не споживає dropout.

Під час відновлення код спершу будує модель, оптимізатор і **планувальник**, а потім завантажує ваги, стан планувальника та стан оптимізатора. RNG відновлюються останніми, після конструкцій, що споживають випадковість. Цей вибір відповідає попередженню документації [Optimizer.load_state_dict](https://docs.pytorch.org/docs/2.11/generated/torch.optim.Optimizer.load_state_dict.html).

Стан Python — це структура примітивів. PCG64 надає словник цілих чисел і рядків; жоден об'єкт `ndarray` NumPy не серіалізується як стан RNG. Стан PyTorch CPU — це тензор байтів. Наступні вибірки контролюються без зміни збереженого стану.

## Читання доказу та допуск

`verification-cpu.json` — це публічний доказ, отриманий із реального виконання цієї версії. `source` містить SHA-256 скриптів і CSV. `protocol` описує чотири процеси, точність і допуск. `resume_boundary` перевіряє наступну вибірку кожного RNG і наступний taux, використаний після переривання.

Порівняння вимагає того самого порядку рядків, того самого прогресу та того самого стану планувальника. Максимально допустиме абсолютне відхилення для ваг, стану оптимізатора, втрат, MSE і taux становить **1e-12**, без відносного допуску (`rtol=0`). Звіт зберігає виміряні відхилення, навіть коли вони дорівнюють нулю. Він також перевіряє наступну вибірку RNG наприкінці обох проходжень.

Негативний контроль має показати, що забуття RNG змінює результат. Його MSE може бути нижчою або вищою: цей тест перевіряє траєкторію відновлення, а не рейтинг якості. Очікувана розбіжність дає тому `passed: false` у цьому підтесті та `divergence_detected: true`; глобальний протокол тоді може успішно завершитися.

## Завантажувати лише власний checkpoint

Завантажувач явно використовує `torch.load(..., map_location="cpu", weights_only=True)` і не пропонує жодного fallback до `weights_only=False`. Він спершу перевіряє пов'язаний відбиток, обмежує розмір і перевіряє схему, версії, код і дані. Він відхиляє неповний стан замість того, щоб мовчки повторно ініціалізувати частину навчання.

Використовуйте лише checkpoints, які **ви створили з цією вправою та зберігали під своїм контролем**. Відбиток слугує для виявлення зміни; він не автентифікує відправника. Обмежене завантаження не робить невідомий файл гідним довіри. Див. [torch.load](https://docs.pytorch.org/docs/2.11/generated/torch.load.html) і [серіалізацію PyTorch](https://docs.pytorch.org/docs/2.11/notes/serialization.html).

## Адаптувати вправу до вашого проєкту

Визначте стани, які ваше власне навчання реально споживає: sampler, аугментація, оптимізатор, планувальник і конкретні генератори. Якщо ви використовуєте AMP, додайте стан scaler на узгодженій межі; ця вправа цього не робить. Розподілене навчання також вимагає опрацювання своїх процесів і їхнього розподілу даних.

Не виводьте з цього маленького доказу тривалість оренди, пропускну здатність, відбиток VRAM або гарантію відновлення для іншої моделі. Відтворіть метод: короткий репрезентативний набір, переривання посеред роботи, інший процес, явне порівняння та негативний контроль.

## Вміст і ліцензії

- `train.py`, `verify_resume.py`, ця документація та маніфест: ліцензія MIT, див. `LICENSE-MIT.txt`.
- `data.csv`: оригінальні синтетичні дані, пропоновані за CC0 1.0, див. `DATA-LICENSE-CC0.txt`.
- `verification-cpu.json`: вимірювання цієї вправи, без персональних даних, повне середовище, шляхи на робочій станції, токени чи ідентифікатори сесій.
- `manifest.json`: точний перелік розповсюджуваних файлів та їхніх SHA-256. Маніфест не посилається сам на себе.
- `SOURCES.md`: офіційні посилання та документальні обмеження.

Залежності PyTorch, NumPy і Python зберігають власні ліцензії. Вони не розповсюджуються в ZIP-архіві.


## Презентація Kernodeck і сумісність проєкту

Це перевидання від 25 вересня 2026 року оновлює назву архіву, документацію та бренд. Скрипти `train.py` і `verify_resume.py`, CSV та `verification-cpu.json` залишаються ідентичними до постачання, виконаного 24 вересня 2026 року. Технічне поле `project` зберігає свій ідентифікатор для читачів наявних звітів. Жодних обчислень чи перевірок CPU/GPU для цього перевидання не перезапускалося.
