our_knp/cats-dogs/HANDOFF.md
int 979aa90bb4 Add 2026-10-14 handoff materials, verify accelerated runs
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:29:08 +03:00

250 lines
43 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Передача проекта KNP / AltAI следующему чату
**Последнее решение пользователя:** отменить мониторинг/автоматический перенос и выдать ZIP. Монитор остановлен. Дальнейшие автоматические подключения не выполняются. В архиве все доступные локальные материалы; новых полных копий удалённого runtime нет. Старые разделы о мониторе описывают историю, а не действующий процесс.
Срез: 2026-10-14, после обсуждения CPU/GPU-ускорения и преимуществ чистого Linux. Это документ состояния, а не заявление, что все начатые изменения закончены. Для восстановления прочитать этот файл, `ACCELERATION.md`, `V2.md`, `README.md` данного эксперимента и ежедневный журнал. Фактический снимок стенда — `handoff-state/remote-inventory.txt`; он фиксирует состояние на момент сохранения и со временем устареет.
**СТАТУС СОХРАНЕНИЯ:** локальная передача создана. После успешного начального осмотра стенд перестал отвечать на SSH (тайм-аут подключения). Поэтому перечисленные ниже новые remote-runtime/prior-context архивы и новые копии передачи на станции пока являются **планируемыми**, а не подтверждённо сохранёнными. Ранее существовавшие source-snapshot/trained-weights и results/results-v2 уже есть локально. Истина о новом переносе — `preservation-status.json`; автоматическое завершение после восстановления связи: `python3 /opt/neiro/experiments/cats-dogs/save_handoff.py`. До успешного статуса этого скрипта не утверждать, что новый пакет находится на станции. remote-inventory/patch/flags также создаются этим скриптом при доступном SSH.
## 1. Запросы пользователя и принятые решения
- Постоянный стенд: `int@10.9.8.230`, WSL; основная папка `/mnt/c/KNP`. Подключаться только по запросу пользователя. Этот запрос разрешает сохранение и сверку на стенде; будущие учебные вопросы сами по себе не разрешают SSH.
- Пользователь хочет обучать **именно спайковую сеть KNP/AltAI**, даже при скромной точности. Не подменять её готовой CNN или предобученным классификатором.
- Задача первого объектного опыта — кошки против собак. Это бинарная классификация маленьких изображений, не детекция объектов с координатами и не универсальное распознавание фотографий.
- Следующие требования: улучшить распознавание; использовать несколько ядер и мощную GPU; реализовать backend, если возможно, иначе объяснить ограничения в отчёте. GPU-часть пока незавершена.
- Пользователь требует вести ежедневный журнал: коротко об обсуждении, подробно об изменениях/запусках. Не записывать пароли и приватные ключи.
- Последний вопрос: даст ли чистый Linux преимущество. Ответ: больше контроля над драйвером/ядром/CUDA и меньше некоторых ограничений WSL; выигрыш скорости не измерен. ОС и драйверы не менялись.
- Не рисовать на общей доске без просьбы пользователя. Соблюдать activity_start/list/update/finish текущего T3-инстанса при долгой работе. Проверять чужие claims перед редактированием.
## 2. Быстрая карта путей
| Назначение | Путь |
| --- | --- |
| Локальная учебная библиотека | `/opt/neiro` |
| Локальные правила | `/opt/neiro/AGENTS.md` |
| Точка входа для следующего чата | `/opt/neiro/HANDOFF.md` |
| Эта передача, скрипты и артефакты | `/opt/neiro/experiments/cats-dogs` |
| Ежедневный журнал | `/opt/neiro/changes-2026-10-14.md` |
| Снимок состояния и резервные архивы | `/opt/neiro/experiments/cats-dogs/handoff-state` |
| Постоянный SSH | `int@10.9.8.230` |
| Windows-папка проекта, видимая в WSL | `/mnt/c/KNP` (обычно `C:\KNP` на Windows) |
| Передача на рабочей станции | `/mnt/c/KNP/HANDOFF-2026-10-14.md` |
| Копия всей папки эксперимента на станции | `/mnt/c/KNP/cats-dogs` |
| Исходный репозиторий KNP с прежними правками | `/mnt/c/KNP/examples` |
| Отдельная копия MNIST-примера для кошек/собак | `/mnt/c/KNP/cats-dogs/source` |
| Основная рабочая сборка KNP | `/home/int/knp-build` |
| Внешние библиотеки | `/home/int/deps/lib` |
| Все данные/прогоны объектного опыта | `/home/int/run/cats-dogs` |
| Отдельный бинарник классификатора | `/home/int/run/cats-dogs/build/cats_dogs` |
| Старые MNIST-прогоны | `/home/int/run/exp` |
| Визуализатор цифр | `/mnt/c/KNP/viz` |
| Старые отчёты | `/mnt/c/KNP/Отчёт_*.md` |
| Память предыдущего Claude Code | `/home/int/.claude/projects/-mnt-c-knp/memory` и `/home/int/.claude/projects/-mnt-c-KNP/memory` |
SSH с текущей машины работает с явным ключом:
```bash
ssh -i ~/.ssh/id_ed25519_snw -o IdentitiesOnly=yes -o BatchMode=yes int@10.9.8.230
```
Обычный SSH без `-i` прежде давал отказ. `ssh-copy-id` проверялся: публичный ключ уже был установлен, повторно добавлять не потребовалось. Ключи не входят в резервные архивы.
## 3. Окружение и состояние процессов
- KNP в `/mnt/c/KNP/examples/VERSION`: `2.0.0`. HEAD на момент передачи: `55470ed622cb29efd0c04fcad1b12e6bac9da00d`. Используется сборка с экспериментальными правками, не чистый релизный пример.
- Машина WSL `1220WS2`, Ubuntu 26.04; ядро при проверке `6.18.54.1-microsoft-standard-WSL2`.
- Intel i7-13700KF, `nproc` показывал 24 логических CPU.
- GPU: NVIDIA GeForce RTX 4070 Ti SUPER, compute capability 8.9, `nvidia-smi` показывает 16376 MiB и драйвер 610.88. Это снимок, не требование к другой машине.
- CUDA Toolkit `/home/int/cuda-12.9`; nvcc `/home/int/cuda-12.9/bin/nvcc`. Для nvcc использовался совместимый host compiler `/home/int/mamba/envs/gcc14/bin/x86_64-conda-linux-gnu-g++`. CPU-сборка использует `/usr/bin/c++`; путь для сохранения реальных флагов — `handoff-state/compiler-flags.txt`.
- Python-среда обработки изображений `/home/int/anvenv/bin/python`: Python 3.14.4, numpy 2.5.4, Pillow 12.3.0. Pip 25.1.1 установлен через ensurepip. torch/torchvision для этих опытов не требуются.
- GPU-инструмент WSL: `/usr/lib/wsl/lib/nvidia-smi`. CUDA-тест `/home/int/scratch-cu/t2` при `LD_LIBRARY_PATH=/home/int/cuda-12.9/lib64:/usr/lib/wsl/lib` выдавал `no error h=42`.
- На момент передачи **нет запущенных обучений/сборок cats_dogs**. Единственный обнаруженный процесс из этой работы — HTTP-сервер визуализатора, PID 3671; PID не считать постоянным.
- Автозапуск обучения или HTTP-сервера не создавался. Перезапуск WSL может остановить визуализатор.
## 4. Прежняя работа и визуализатор MNIST
При первом осмотре уже были изменения в шести файлах исходного KNP. Их сегодня не редактировали и не откатывали:
```text
examples/mnist-learn/models/altai/construct_network.cpp
examples/mnist-learn/models/altai/hyperparameters.h
examples/mnist-learn/models/altai/prepare_network_for_inference.cpp
examples/mnist-learn/models/blifat/prepare_network_for_inference.cpp
knp/backends/gpu/cuda-backend/CMakeLists.txt
knp/base-framework/impl/model_loader.cpp
```
После успешного save_handoff.py незакоммиченный diff и HEAD будут сохранены в `handoff-state/original-knp-changes.patch` и `original-knp-status.txt`. После восстановления связи старые отчёты и обе папки памяти Claude будут сохранены в `prior-context-and-source.tar.gz`. Они содержат предыдущий контекст и не заменяют новые проверки. Из прежних отчётов известны изменения колонок/торможения и исправление каналов ModelLoader; повторно весь старый MNIST-бенчмарк не воспроизводился. У старых `sz80_30k_s1`, `sz80_30k_s42`, `sz80_60k_s42`, `sz40_60k_s42` в `/home/int/run/exp` при первом осмотре были пустые `result.csv`; не выдавать их за успешные результаты.
По просьбе пользователя запущен визуализатор:
```bash
nohup python3 -m http.server 8080 --bind 0.0.0.0 \
--directory /mnt/c/KNP/viz \
> /tmp/knp-viz-http.log 2>&1 < /dev/null &
```
URL `http://10.9.8.230:8080/altai_viz.html`; в браузере Windows пользователь открывал `http://127.0.0.1:8080/altai_viz.html`. Перед повторным запуском проверить существующий сервер/порт, не создавать второй процесс. При передаче HTTP вернул 200.
Исправлена кириллица: добавлен `<meta charset="utf-8">` в `/mnt/c/KNP/viz/altai_viz.html` и `app.html`. Сервер отдаёт `text/html` без charset, но объявление есть в документе. Результат визуально виден на следующем скриншоте пользователя. HTML и diff включены в план резервирования; см. статус сохранения в начале файла.
Наблюдение пользователя: нарисованная 4 на шаге 9/14 давала ответ 5 с подписью «пока лидирует». Это **промежуточный результат**, финальные шаги не проверены. Скриншот локально `/opt/neiro/reports/observations/2026-10-14-drawn-4-leading-5.png`; копия для передачи — `handoff-state/observations/`. По этому наблюдению сеть цифр не переобучали. Объектный визуализатор кошек/собак не создавался.
В `viz` обнаружены также untracked `.python-version`, `README.md`, `pyproject.toml`, `uv.lock`, `s -lntp`; их происхождение в этой работе не установлено. Не приписывать их своим изменениям и не удалять. Snapshot status включён в план резервирования; архив контекста сохраняет только нужные два HTML, не всю папку `viz`.
## 5. Объектный эксперимент v1 — завершён
Скопирован MNIST-пример с прежними AltAI-изменениями в отдельный `cats-dogs/source`. В C++ для этого опыта изменены только константы `global_config.h`: классов 2 вместо 10, входов 2048 вместо 784. Лицензия Apache 2.0 сохранена. Исходный MNIST и штатные библиотеки не заменялись.
2048 входов, 20 обучаемых нейронов на класс, локальное STDP в KNP/AltAI, случайный разброс весов 20, seed 42. Подготовка входов обычная фиксированная, не нейросеть. Классы в CSV: 0=cat, 1=dog.
Данные: JPEG-зеркало `https://github.com/YoongiKim/CIFAR-10-images`, commit `d7d05618061fe37d830fb0419063d113c575ccbc`. Это преобразованные JPEG, **не оригинальные байты CIFAR-10** и не официальный CIFAR-бенчмарк. Train 800, validation 200, test 400; баланс классов. Имена файлов, seed и SHA-256 — в `data/manifest.json`, локальная копия `data-manifest.json`.
Данные и кэш на стенде `/home/int/run/cats-dogs/data`: `github-jpeg-cache`, `*-original.npz`, `.bin`, `.target`. Исходная загрузка официального архива была остановлена; `cifar-10-binary.tar.gz` и `parts` могут быть частичными. Hugging Face превью получали HTTP 429; они не использовались в финальном опыте. `download.py`, `prepare_data.py`, `prepare_preview.py`, `fetch_cache.py`, `preview-cache` сохраняют историю попыток, не являются текущим выбранным путём.
Первый яркостный ON/OFF-вход оказался слабым. Выбран контраст: серое изображение минус размытие 5×5, масштаб 4, положительный/отрицательный каналы. Порог 60 выбран из 10 фиксированных конфигураций по настоящей KNP-validation: 111/200 (55,5%). Итоговый `test`: 208/400 (52%), 183 ошибки, 9 молчаний. Интервал Уилсона 95% приблизительно 47,1–56,9%; превосходство над 50% не установлено.
`tune.py` — **неуспешный офлайн-симулятор**: расходился с KNP, его подбор не использован. Причина отдельно не исправлена, в том числе начальное состояние растра не учитывает предварительное кодирование train. Не использовать как эталон.
Артефакты: `README.md`, `results/selection.json`, `results/test-metrics.json`, `results/test-settings.json`, `results/reproducibility.json`, `source-snapshot.tar.gz`, `trained-weights.tar.gz`. На стенде прогоны `val_*`, `validation`, `test`; выбор `selection.json`, проверка `reproducibility.json`. Четыре CSV весов/порогов train между validation и test побайтно совпали.
## 6. Улучшенный эксперимент v2 — завершён
Фиксированные HOG-подобные признаки в `features.py`: sqrt RGB, выбирается цветовой канал с наибольшим градиентом, 9 направлений, ячейки 4×4, блоки 2×2, L2-Hys. 1764 признака; оставляются 256 сильнейших, дополнение до 2048. Это собственная реализация, не заявление о битовой совместимости со scikit-image. Метки не участвуют в предобработке. Обучение весов классификатора остаётся реальным KNP/STDP; извлечение признаков **не спайковое**.
Плотные HOG и HOG+цвет проверялись на старой validation как диагностика. После обычного квантования у `probe_hog_20` 65626/81920 весов нулевые. Режим `KNP_MNIST_QUANT=weights` масштабирует по весам и уменьшает потерю малых весов. Веса в ±255; пороги подбирались в другом масштабе. Переносимость порогов на физический AltAI определённого поколения не проверена.
Новые JPEG-разделения, прежний источник/commit, seed перемешивания 20261015:
- Train 4000: по 2000 cat/dog, исходный train 0000–1999.
- Новая validation 1000: по 500, исходный train 4500–4999.
- Новый test 1000: по 500, исходный test 0200–0699; старый test был 0000–0199.
- Проверены уникальность, баланс, отсутствие пересечений. Настройки выбирали по validation, не по test.
Пути: `/home/int/run/cats-dogs/data-v2` — исходные NPZ и manifest; `features-v2` — hog/hybrid/sparse_hog `.bin`/`.target` и манифесты; `pilot-features` — диагностические признаки старого пилота. Входной `*_validation.bin` содержит train, затем validation; `*_train_test.bin` содержит train, затем test. `run.py --train` и `--count` задают границу обучения и длину оценки. Не перепутать с отдельным `*_val.bin`.
8 заранее заданных конфигураций: колонки 20/60 × пороги 600/1600/4000/8000, sparse_hog, quant=weights, seed42. Выбран `v2_val_c20_t4000`: 626/1000 (62,6%). Новый `v2_test`: 618/1000 (61,8%), 382 ошибки, 0 молчаний; cats 304/500, dogs 314/500. Прежняя сеть на **том же новом test** (`v1_fresh_test`): 522/1000 (52,2%), 450 ошибок, 28 молчаний. Прирост 9,6 п.п.; интервалы 58,7–64,8% и 49,1–55,3%. Это небольшой JPEG-набор и один seed, не гарантированное распознавание любых фотографий.
Полная конфигурация новой модели: train4000, count1000, columns20, threshold4000, seed42, jitter20, quant weights; `KNP_MNIST_ADD_THR_SCALE=0`, `KNP_MNIST_INFER_INHIB=255`. Train+test новой 23,27 с, прежней 5,55 с в тех замерах. CSV весов/нейронов повторного обучения побайтно совпадают с выбранной validation. Test уже просмотрен; дальнейшие улучшения нельзя честно настраивать по нему и снова называть независимой тестовой оценкой.
Артефакты локально: `V2.md`, `results-v2/selection.json`, `comparison.json`, `test-settings.json`, `data-manifest.json`, `features-manifest.json`, `probes.json`, `trained-weights-v2.tar.gz`. Полные прогоны на стенде `v2_val_*`, `v2_test`, `v1_fresh_test`, файлы `selection-v2.json`, `comparison-v2.json`, `probes-v2.json`; также в резервном runtime-архиве. Файлы `.bin`/`.target` — входы для C++, а CSV выгрузки не являются готовой реализацией API загрузки модели.
## 7. Ускорение CPU — что проверено
### Независимые процессы: работает
`run_batch.py` запускает ограниченное число независимых C++-процессов, Python-потоки только управляют ими. Нет общей изменяемой сети и зависимости от Python GIL. В плане JSON нужны уникальное безопасное `name` и список строк `args`; обязательна отдельная сводка. Существующие прогоны защищены от перезаписи; ошибки возвращаются как неуспех.
`validate_v2.py` сейчас имеет `--jobs` (по умолчанию 4) и `--prefix`; стабильный выбор при равной accuracy идёт по заранее заданному порядку. Старые selection не перезаписывать. `benchmark_batches.py`: одна и та же группа из четырёх порогов, каждая train4000+validation1000, последовательно 91,573 с, 4 процесса 42,911 с (2,134× пропускная способность). Все четыре CSV весов/нейронов и `result.csv` совпали побайтно. Один отдельный процесс в группе стал медленнее из-за конкуренции: это ускорение группы, не одного временного ряда.
Стенд: `bench_serial_t*`, `bench_parallel_t*`, `/home/int/run/cats-dogs/acceleration/batch-benchmark.json`, планы/сводки. Локально `acceleration-results/batch-benchmark.json`.
### Многопоточность одной сети: поддержка добавлена, но медленнее
Штатный multi backend содержит BLIFAT/STDP-BLIFAT/LIF, не AltAI; прямой запуск даёт `Type is not supported`. `run.py --backend multi` теперь отвергается до создания папки.
`build_tuned_cpu.py` делает отдельную копию header/backend и добавляет AltAILIF + ResourceSTDPAltAI в поддерживаемые типы, env-параметры потоков/размеров порций. Обязательно компилирует backend.cpp **и get_network.cpp**, иначе несовместимы variants разных списков типов. Это экспериментальная сборка, не штатная поддержка релиза.
Библиотека `/home/int/run/cats-dogs/acceleration/libknp-cpu-tuned-backend.so`; headers в `acceleration/include`; `KNP_CPU_THREADS` по умолчанию2, допустимо1..256; `KNP_CPU_POPULATION_PART`64, `KNP_CPU_PROJECTION_PART`8192. Оригинальные .so не заменены.
Короткие одинаковые 800+200: single4,89 с, tuned2 15,09 с, tuned4 15,69 с. Проверена идентичность весов/ответа; масштаб проверки скрипта `benchmark_backends.py` — float_weights, quant_weights, result.csv. Полный `backend_altai_full` 4000+1000 завершён за80,77 с, результат626/1000. **Его полная побайтная сверка с `v2_val_c20_t4000` ещё не выполнена.** Не объявлять одной accuracy доказательством полной эквивалентности.
Первый `backend_bench_*` был неуспешной проверкой до добавления типов; последующие `backend_altai_*` после исправления. Локально `acceleration-results/backend-altai-benchmark.json`, `cpu-altai-multithread.patch`; на стенде исходники/логи/JSON в acceleration и корне runtime. У небольшой сети STDP ставится одной задачей на популяцию, плюс барьеры между фазами; это кандидаты горячих участков, не завершённый профиль по времени.
### Кэш подключений: собран, проверка неполная
`perf_connection_cache.h` кэширует подключённые ссылки в прежнем порядке, thread_local, ключ projection/neuron; отслеживает адрес/размер/хранилище проекций и сбрасывается при `_init`. Это только фиксированная топология. Переподключение с прежним размером/адресом не обнаруживается; нельзя автоматически переносить на динамическую сеть.
`build_fast_cpu.py` копирует **всё дерево CPU-library/include**, чтобы quoted includes взяли изменённые копии, заменяет поиск связей кэшем, использует const references вместо копий vector. Новая библиотека `/home/int/run/cats-dogs/fast-cpu/libknp-cpu-fast-backend.so`; оригинальные файлы не редактируются. `fast_smoke` 800+200 завершён за4,39 с и123/200, как эталон. **Побайтная проверка CSV и полноценный замер 4000+1000 ещё не завершены.** По умолчанию остаётся single.
## 8. GPU-бэкенд — незавершённый прототип
Штатный `/home/int/knp-build/bin/libknp-gpu-cuda-backend.so` поддерживает только BLIFATNeuron и DeltaSynapse, `plasticity_supported=false`. Не умеет AltAI/STDP. `cuobjdump` подтвердил sm89; проблема не сводится к отсутствию архитектуры RTX в бинарнике. Simple-network `/home/int/gputest/simple-network` игнорировал переданный CLI-backend и использовал библиотеку через sibling symlink; этот symlink указывал на GPU lib. В GPU-коде CUDA-векторов воспроизведён `invalid device function`. Ошибка лишь журналируется, процесс может вернуть0. Это не успешная сеть. Лог `acceleration-results/cuda-knp-probe.log` и runtime `cuda-knp-probe.log`; причина не исправлена.
Запрошено второе мнение GPT-6 Astra через skill astra-advisor: узкий перенос математически возможен; отсутствие модели в штатном backend не означает невозможность GPU на этом железе. Совет — собственные плоские CUDA Runtime буферы, точный порядок фаз/сумм, поэтапная проверка всех состояний. Маленькая сеть может не ускориться из-за host overhead. Гибридный этап допустим, но не выдавать его за полный GPU-backend.
Написаны четыре **не собранных и не проверенных** файла в папке эксперимента, теперь также сохраняемые на рабочей станции:
- `gpu_stdp_types.h`: POD-состояния нейрона/синапса и интерфейс create/step/download/destroy.
- `gpu_stdp.cu`: CUDA Runtime, свои malloc/copy/check errors; GPU-расчёт STDP, dopamine, ISI, renormalization; один thread на postsynaptic neuron, последовательный порядок его связей; ресурсы на GPU постоянные.
- `gpu_stdp_bridge.h`: контракт train(Population, Projections, SpikeMessage, Step, CPU-reference), flush, clear.
- `gpu_stdp_bridge.cpp`: thread_local контексты фиксированной топологии; packing/unpacking; last_spike_step авторитетно обновляется CPU-проекциями; веса возвращаются CPU; flush выгружает ресурсы перед экспортом сети.
Это **гибридный замысел**: нейродинамика, проекции и message bus остаются CPU; пластичность переносится на GPU. На активном шаге копируются нейроны и markers всех ~80k связей H2D, нейроны/веса D2H; копии pageable. Низкая GPU-загрузка/замедление возможны. Отсутствие активного STDP должно пропускаться, но это условие ещё надо сверить с эталоном.
`KNP_CUDA_VERIFY` в bridge проверяет CPU-reference по шагам: float tolerance1e-4 +1e-6 relative, timestamps/flags точно, на flush печатает `CUDA_STDP gpu_steps=... checked_steps=... max_state_abs_error=...`. Сейчас наличие env включает проверку, даже значение0. **Механизм проверки сам не проверен и не подключён к backend!** `run.py` пока не имеет gpu/backend или --cuda-verify. Нет `build_gpu_stdp.py`, GPU .so и результатов GPU-обучения.
Риски для проверки: точный float/double и порядок сумм additional_threshold/free_resource; unsigned time subtraction (в CPU есть непривычные выражения — не исправлять одновременно с портом); ISI-статусы forced/start/continue/not-period; отрицательный dopamine при forced; renormalization/drain; flags contributed/hebbian; задержки и несколько входных проекций; экспорт train→infer. У кэша/bridge фиксированная топология, повторное создание/уничтожение сети должно очищать stale refs.
## 9. Конкретная точка продолжения GPU
Ниже **план, ещё не выполненные действия**. Не утверждать, что эти команды уже запускались.
1. Прочитать CPU-эталон в `/mnt/c/KNP/examples/knp/backends/cpu/cpu-library/include/knp/backends/cpu-library/impl/populations/altai/altai_stdp.h` и `training/stdp.h`, соответствующие neuron/synapse traits. Сверить draft с реальным порядком вызовов.
2. Создать `build_gpu_stdp.py`, изолированное дерево `/home/int/run/cats-dogs/gpu-stdp`; скопировать целиком готовое fast-cpu/include, не менять оригиналы.
3. В копии altai_stdp.h переименовать исходное train_population_impl в train_population_cpu_reference; добавить wrapper старой сигнатуры, вызывающий bridge с reference callback. Include bridge вне namespace. Не допустить рекурсии.
4. В копии single backend `_init` добавить clear GPU-контекстов и кэша. В копии get_network.cpp перед `get_network_data()` добавить flush. Компилировать backend.cpp, get_network.cpp, bridge.cpp и CUDA-object, линковать по рабочему link.txt, но отдельным SONAME.
5. Предполагаемые CUDA-флаги: `-std=c++17 -arch=sm_89 --fmad=false --prec-div=true --prec-sqrt=true -O3 -Xcompiler=-fPIC`; host compiler gcc14 указан выше. Не включать fast-math при проверке. Link `-L/home/int/cuda-12.9/lib64 -lcudart` и rpath на этот lib64. Отдельный ожидаемый output `gpu-stdp/libknp-altai-gpu-stdp-backend.so` пока **не существует**.
6. Добавить явный experimental gpu-вариант в run.py только после успешной сборки; сделать управление verify env, не менять single default.
7. Маленький train+infer с пошага́вой CPU-reference; затем800+200 и4000+1000. Сравнить все CSV, состояния, спайки, delays, flags, метрики. Дополнить граничными фикстурами ISI/dopamine/несколько проекций. Итоговая accuracy сама по себе недостаточна.
8. Раздельно измерить без verify kernel/копии/host overhead. Если медленнее — честно сохранить результат; для большого выигрыша понадобятся device-resident нейроны/проекции/очереди и/или batching независимых сетей, а не смена драйвера вслепую.
Параллельно допустимо завершить сверку `backend_altai_full` и `fast_smoke` с эталонами. Это дешёвая проверка существующих файлов, не новое обучение. После этого изменить статус ограничений в ACCELERATION.md и журнале.
## 10. Команды проверенного пути и ограничения повторного запуска
Текущие run.py defaults — старые8000train/2000count/threshold60/data, **не** лучшая v2-конфигурация. Всегда явно задавать нужные параметры. `out.mkdir(exist_ok=False)` защищает старые результаты; взять новое имя. Повторное evaluate_v2.py с прежними именами намеренно откажет, не удалять исходные прогоны ради повторения.
Пример следующего обычного контрольного прогона v2 на validation (выполнять только когда пользователь разрешил продолжение):
```bash
python3 /mnt/c/KNP/cats-dogs/run.py resume_check_01 \
--data-dir /home/int/run/cats-dogs/features-v2 \
--dataset sparse_hog_validation --train 4000 --count 1000 \
--threshold 4000 --columns 20 --seed 42 --jitter 20 \
--quant weights --backend single
```
Новый параллельный поиск:
```bash
python3 /mnt/c/KNP/cats-dogs/validate_v2.py --jobs 4 --prefix resume_val_01
```
Он повторяет прежнюю сетку, не является новым способом обучения. Не запускать контрольный timing одновременно с поиском. Метрики `correct/wrong/unanswered` определяются по счётчикам KNP, а не по печатаемой им округлённой precision. Обучение каждый раз запускается заново; отдельный режим только загрузки готовой сети пока не реализован.
Сборка копии примера: `python3 /mnt/c/KNP/cats-dogs/build.py`. Сборки экспериментальных библиотек: `build_tuned_cpu.py`, `build_fast_cpu.py` — работают по абсолютным путям существующей сборки. Для другой машины сначала настроить исходники/библиотеки, архив runtime сам по себе не заменяет установленную KNP toolchain.
Подготовка изображений использует `/home/int/anvenv/bin/python`; orchestration/run — python3. Скрипты подготовки могут создавать/перезаписывать данные в указанной папке, не запускать их автоматически поверх исходных манифестов. Тест признаков: `/home/int/anvenv/bin/python /mnt/c/KNP/cats-dogs/test_features.py`.
## 11. Что осталось по качеству распознавания
61,8% улучшает пилот, но недостаточно. Пока только один seed. Возможные отдельные опыты: аугментации **только train** (зеркало, сдвиг), несколько seed, обучаемые локальные спайковые признаки + pooling, другое SNN-обучение с явным согласованием отличий от нынешнего STDP. Не смешивать алгоритмическое улучшение с GPU-портом — сначала воспроизвести математику. Для нового окончательного результата требуется независимый новый test/оговорённый протокол, поскольку нынешний уже просмотрен.
Физический чип AltAI не использовался; эмуляция KNP не доказывает аппаратную совместимость всех выбранных порогов. Различать поколения AltAI и версии KNP. Учебная библиотека `/opt/neiro` — публичный снимок на2026-10-05; для занятий прочитать README/INDEX и соответствующие локальные документы, не запускать скачанные установщики без запроса.
## 12. Linux, сохранение и восстановление
В WSL CUDA использует драйвер Windows; Linux NVIDIA-драйвер внутри WSL не устанавливать. Native Linux позволяет независимо выбирать совместимые драйвер/ядро/Toolkit. NVIDIA указывает ограничения managed/pinned memory в WSL; это не доказанное узкое место нашей реализации. Основной блокер — отсутствующий AltAI/STDP GPU-backend. Данные/сборки уже в `/home/int`, исходники на `/mnt/c`; Microsoft рекомендует Linux-файловую систему для Linux-инструментов. Замер WSL/native Linux не проводился. Источники: https://docs.nvidia.com/cuda/wsl-user-guide/index.html и https://learn.microsoft.com/en-us/windows/wsl/filesystems.
После успешного запуска save_handoff.py, `handoff-state/remote-runtime.tar.gz` будет полным снимком `/home/int/run/cats-dogs`, включая подготовленные данные, JPEG-кэш, все прогоны, логи, экспериментальные headers/objects/libs и частичные неиспользованные загрузки. Он не включает весь `/home/int/knp-build`, `/home/int/deps`, venv, CUDA Toolkit, SSH-ключи или весь прежний MNIST runtime. Частичные файлы внутри архива не становятся валидными данными от факта резервирования.
После успешного сохранения, `handoff-state/prior-context-and-source.tar.gz` будет отдельной копией адаптированного C++ source, двух HTML визуализатора, четырёх старых отчётов и обеих папок памяти Claude. Известные оригинальные незакоммиченные правки KNP будут в отдельном patch. Полный git checkout основного KNP остаётся на стенде; локальная учебная копия `/opt/neiro/sources/knp` может отличаться, не считать её автоматически рабочей сборкой.
Резервные архивы предназначены для восстановления в **новую** папку. Пример:
```bash
mkdir -p /home/int/restore-cats-dogs-2026-10-14
tar -xzf /mnt/c/KNP/cats-dogs/handoff-state/remote-runtime.tar.gz \
-C /home/int/restore-cats-dogs-2026-10-14
```
После распаковки абсолютные пути в settings/scripts будут указывать на оригинальный runtime; их надо осознанно адаптировать, а не запускать вслепую. `SHA256SUMS` и `preservation-manifest.json` в корне папки эксперимента проверяют локальную и сохранённую на станции копии. Манифест содержит перечень и хеши файлов; себя, SHA256SUMS и изменяемый preservation-status.json не включает. Наличие локальных контрольных сумм не доказывает выполненный перенос; см. preservation-status.json.
Сохранение по последнему запросу не меняло модель, алгоритмы или драйверы и не запускало обучение. Состояние незавершённых GPU/fast-проверок намеренно сохранено как незавершённое. Коммитов/PR этой работы не создавали. Перед продолжением проверить актуальные процессы и файлы: снимок не заменяет реального состояния машины.
## Дополнение: автоматическая доставка после восстановления SSH
По явному запросу пользователя настроен `monitor_handoff.py`. Проверки каждые30с, после доступа запускается `save_handoff.py`: имеющийся локальный пакет отправляется первым, затем полный runtime/context backup и дополненный пакет. Монитор завершается только после успешного переноса с SHA256-проверкой. Повторные экземпляры блокируются flock. Лог `/opt/neiro/.handoff-monitor/monitor.log`, состояние `status.json`, PID `pid`. Фазы waiting_for_ssh/checking/transferring ещё не означают успеха; succeeded означает успешный выход save_handoff.py. После перезагрузки локальной машины процесс сам не возобновится.
Незапущенный сетевой тест пользователя: на стенде установить iperf3 и запустить `iperf3 -c 10.9.8.1 -P 8 -t 5`. Пока не выполнен из-за тайм-аутов SSH; монитор доставки не выполняет сетевые тесты.