# Kernodeck Reprise v1 — реально возобновлённый checkpoint

Это оригинальное упражнение обучает небольшому числовому отношению на 24 синтетических строках. Его цель — **проверить возобновление обучения**, а не получить лучшую модель или измерить GPU. Вычисление явно принудительно выполняется на **CPU**, в `float64`, с одним потоком PyTorch.

Проверка сравнивает 10 непрерывных шагов с 5 шагами, checkpoint, а затем 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**, если проверку не удалось завершить. Успех требует одновременно положительного возобновления и наблюдаемого провала отрицательного контроля. Просто наличие файла checkpoint недостаточно.

## Выполнение трёх шагов вручную

```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`. Checkpoint'ы создаются упражнением во время выполнения; они не распространяются в архиве.

Чтобы наблюдать неполный случай, используйте новую папку:

```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 не восстанавливает состояния, достигнутые к моменту остановки.

## Что checkpoint сохраняет и в каком порядке он считывается заново

Словарь содержит веса, состояние Adam, состояние StepLR, прогресс по данным, три RNG, историю потерь и скоростей обучения, а также отпечатки кода и 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 и следующую скорость обучения, используемую после прерывания.

Сравнение требует одинакового порядка строк, одинакового прогресса и одинакового состояния планировщика. Максимальное принимаемое абсолютное отклонение для весов, состояния оптимизатора, потерь, MSE и скоростей обучения составляет **1e-12**, без относительного допуска (`rtol=0`). Отчёт сохраняет измеренные отклонения, даже когда они равны нулю. Он также проверяет следующую выборку RNG в конце обоих проходов.

Негативный контроль должен показать, что забывание RNG меняет результат. Его MSE может быть ниже или выше: этот тест проверяет траекторию возобновления, а не ранжирование качества. Поэтому ожидаемое расхождение даёт `passed: false` в этом подтесте и `divergence_detected: true`; общий протокол при этом может пройти успешно.

## Загружать только свой собственный checkpoint

Загрузчик явно использует `torch.load(..., map_location="cpu", weights_only=True)` и не предлагает никакого отката к `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 не перезапускались для этого переиздания.
