our_knp/changes-2026-10-14.md
int ba81f0384b Report: seed variation, neural-rule pipeline, page
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 02:12:58 +03:00

338 lines
62 KiB
Markdown
Raw 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.

# Журнал работы — 14 октября 2026
## Передача следующему чату и сохранение состояния
По запросу пользователя создана подробная передача `/opt/neiro/experiments/cats-dogs/HANDOFF.md` и точка входа `/opt/neiro/HANDOFF.md`; ссылка добавлена в AGENTS.md. Передача содержит ограничения пользователя, SSH без сохранения пароля, карту путей, состояние процессов, прежние правки KNP, историю визуализатора и кодировки, наблюдение о четвёрке, данные/разделения/метрики v1/v2, настройки и команды, состояние CPU-оптимизаций, устройство незавершённого CUDA-прототипа и конкретный план его подключения/проверки.
Перед сохранением выполнен успешный SSH-осмотр: HTTP-сервер визуализатора PID3671 работал, HTTP200; обучений/сборок не обнаружено. Сверены каталоги данных/прогонов, git HEAD и dirty status KNP/viz, наличие обеих папок памяти Claude, показатели backend_altai_full (80,77с,626/1000) и fast_smoke (4,39с,123/200). Полная побайтная проверка этих двух прогонов не выполнялась. Runtime cats-dogs занимает около357МБ на стенде. Результаты наблюдения описаны в передаче; новые полные архивы ещё не получены.
После этого стенд перестал отвечать на10.9.8.230:22. Несколько повторных SSH-подключений, включая IdentitiesOnly=yes и ConnectTimeout=10, закончились Connection timed out. Причина недоступности не установлена; нельзя утверждать, что WSL выключен или проблема именно в VPN. Первое резервирование прервалось до получения первого нового snapshot-файла. **Новая передача и CUDA-черновики пока не подтверждены на рабочей станции.** Ранее сохранённые на станции скрипты/исходники/результаты остаются по прежним путям.
Создан `/opt/neiro/experiments/cats-dogs/save_handoff.py` для явного продолжения после восстановления связи: SSH-проверка, сохранение инвентаря/patch/флагов, полный tar.gz runtime и отдельный архив source/старых отчётов/памяти, проверка архивов, перенос пакета через rsync без удаления файлов, копия передачи в `/mnt/c/KNP/HANDOFF-2026-10-14.md`, удалённая SHA256-сверка. Запуск этого скрипта в текущем состоянии также завершился тайм-аутом; успешный путь переноса пока не проверен. Автозапуск/фоновый retry не создавался.
Локально сохранены все имевшиеся скрипты/модели/results, новая передача, копия правил/журнала и скриншот наблюдения в handoff-state. Сгенерированы preservation-manifest.json и SHA256SUMS; preservation-status.json честно хранит remote_verified=false. Полный новый remote-runtime.tar.gz и prior-context-and-source.tar.gz ещё не созданы. Сборка, обучение, изменение драйверов и модели в рамках этого запроса не выполнялись.
## Ускорение CPU и анализ GPU / Linux
Добавлены `run_batch.py`, `benchmark_batches.py`, `benchmark_backends.py`, `build_tuned_cpu.py`, `build_fast_cpu.py` и `perf_connection_cache.h`. В `run.py` добавлен выбор CPU-бэкенда; в `validate_v2.py` — ограниченный параллельный запуск независимых экспериментов. Оригинальные библиотеки KNP не заменялись; экспериментальные сборки расположены отдельно в `/home/int/run/cats-dogs`.
Четыре одинаковых эксперимента 4000 train + 1000 validation: последовательная группа 91,573 с, группа из четырёх процессов 42,911 с. Веса, параметры нейронов и ответы совпали побайтно. Это ускорение группы экспериментов, а не одной временной последовательности сети.
Штатный многопоточный CPU-бэкенд не поддерживал AltAI. В отдельной копии добавлена поддержка соответствующих типов и настройка потоков. Короткий контроль 800 + 200: однопоточный 4,89 с, два потока 15,09 с, четыре 15,69 с; результаты совпали побайтно. Поэтому многопоточность одной маленькой сети не выбрана по умолчанию. Кэширование подключений построено в отдельной однопоточной библиотеке; короткий прогон завершился за 4,39 с. Полная проверка идентичности этой оптимизации ещё не завершена.
Базовый CUDA-тест на RTX 4070 Ti SUPER работает. Штатный GPU-бэкенд KNP не поддерживает AltAI/STDP; простой BLIFAT-пример дополнительно показал `invalid device function`, причина не установлена. По консультации GPT-6 Astra выбран узкий экспериментальный перенос STDP с сохранением порядка вычислений и проверкой состояний по шагам. Написаны `gpu_stdp_types.h`, `gpu_stdp.cu`, `gpu_stdp_bridge.h`, `gpu_stdp_bridge.cpp`. **Прототип пока не собран и не проверен; готового GPU-обучения и доказанного ускорения GPU нет.**
На вопрос о чистом Linux проверены официальные документы NVIDIA и Microsoft: Linux даёт независимый выбор драйвера/ядра и меньше ограничений некоторых режимов CUDA-памяти. В WSL используется драйвер Windows; установка Linux-драйвера NVIDIA внутрь WSL не подходит. Переход ОС не добавит отсутствующую реализацию AltAI/STDP. Сравнительный замер ОС не проводился, драйверы и ОС не менялись. Подробности и ссылки — `experiments/cats-dogs/ACCELERATION.md`.
## Осмотр постоянного тестового стенда
По запросу пользователя выполнено подключение к `int@10.9.8.230` (WSL), осмотрен `/mnt/c/KNP`. Прочитаны отчёты за 12–13 октября и память Claude Code в `/home/int/.claude/projects/-mnt-c-knp/memory` и `/home/int/.claude/projects/-mnt-c-KNP/memory`.
Проверено на момент осмотра:
- Обучение, сборка и веб-сервер визуализатора в WSL не запущены.
- `/mnt/c/KNP/examples/VERSION` содержит `2.0.0`.
- В репозитории `examples` уже были незакоммиченные правки в шести файлах: `construct_network.cpp`, `hyperparameters.h` и `prepare_network_for_inference.cpp` модели altai; `prepare_network_for_inference.cpp` модели blifat; `knp/backends/gpu/cuda-backend/CMakeLists.txt`; `knp/base-framework/impl/model_loader.cpp`. Это работа предыдущего человека, сегодня эти файлы не меняли.
- Репозиторий `/mnt/c/KNP/viz` при первом осмотре был чистым.
- У прогонов `sz80_30k_s1`, `sz80_30k_s42`, `sz80_60k_s42`, `sz40_60k_s42` в `/home/int/run/exp` пустые `result.csv`; завершённого результата нет.
Из прежних отчётов (сегодня не воспроизводилось): улучшение MNIST через специализацию колонок и торможение при распознавании; исправление ошибки каналов `ModelLoader::init_channels`; проблемы GPU `invalid device function`. Следующая обсуждавшаяся ранее идея — ON/OFF-кодирование. Новых обучений, сборок и замеров точности сегодня не запускали.
## SSH и постоянные сведения о стенде
В локальный `/opt/neiro/AGENTS.md` добавлены постоянный адрес, пути и правило: подключаться к стенду только по запросу пользователя. Стенд предназначен для тестирования KNP и эмуляции нейроморфного процессора AltAI.
Первая проверка `ssh -o BatchMode=yes ...` без явного ключа завершилась `Permission denied`. По просьбе пользователя выполнено:
```bash
ssh-copy-id -i ~/.ssh/id_ed25519_snw.pub int@10.9.8.230
```
Результат: ключ уже присутствовал на сервере, добавлять его повторно не потребовалось. Проверка с `-i ~/.ssh/id_ed25519_snw -o IdentitiesOnly=yes -o BatchMode=yes` прошла без пароля; сервер вернул `1220WS2`, наличие `/mnt/c/KNP` подтверждено. SSH-конфигурацию не меняли; для последующих подключений указывали ключ явно.
## Запуск визуализатора
По запросу пользователя на стенде запущен статический HTTP-сервер:
```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 &
```
- Страница: `http://10.9.8.230:8080/altai_viz.html`.
- Корень раздачи: `/mnt/c/KNP/viz`.
- Лог: `/tmp/knp-viz-http.log`.
- Проверено HTTP-запросом: статус `200`.
- Это фоновый процесс, автозапуск не настраивался. Перезапуск WSL может его остановить.
## Исправление кодировки визуализатора
Пользователь прислал скриншот с неверным отображением кириллицы. Проверка показала: русский текст в файлах корректно записан в UTF-8, но HTML начинался с `<title>` без объявления кодировки; сервер отдавал `Content-type: text/html` без `charset`.
В начало обоих файлов на стенде добавлена строка:
```html
<meta charset="utf-8">
```
Изменены:
- `/mnt/c/KNP/viz/altai_viz.html` — готовая страница.
- `/mnt/c/KNP/viz/app.html` — шаблон, чтобы объявление кодировки сохранилось при следующем формировании страницы.
Проверка: страница повторно скачана по HTTP; первые строки содержат объявление UTF-8 и корректный русский заголовок. Пользователю предложено обновить страницу через Ctrl+F5. Визуальную проверку после обновления браузера не выполняли; подтверждения пользователя пока нет. Сервер не перезапускали, пересборку страницы не выполняли, коммиты не создавали.
## Ведение журнала
По запросу пользователя создан этот файл и добавлено правило ежедневного журналирования в `/opt/neiro/AGENTS.md`: кратко описывать обсуждения и обычные проверки, подробно — изменения и запуски. Пароли в журнал не включены.
## Наблюдение: нарисованная четвёрка
Пользователь сообщил, что визуализатор не распознал нарисованную четвёрку. Сохранён предоставленный скриншот: [четвёрка, лидирует ответ 5](reports/observations/2026-10-14-drawn-4-leading-5.png).
На скриншоте выбран режим «Колонки σ=20», показан шаг 9 из 14; ответ 5 помечен «пока лидирует». Поэтому скриншот фиксирует промежуточный ответ, окончательный результат после всех шагов не проверен. Это отдельное наблюдение, без диагностики причин, изменений кода или новых запусков. Кириллица на этом скриншоте отображается корректно.
## Новая задача: различать кошек и собак
Пользователь предложил перейти от цифр к объектам, например кошкам и собакам. Проведена предварительная проверка исходников на стенде: в `examples/examples/mnist-learn/global_config.h` жёстко заданы 10 классов и 784 входа, данные переводятся в частотные спайки в `dataset.cpp`. Бинарник `/home/int/knp-build/bin/mnist_learn_example` существует. В `anvenv` есть numpy, нет PIL, torch и torchvision. Обучение и установка пакетов не запускались, исходники не менялись.
Проверен первичный источник данных: https://www.cs.toronto.edu/~kriz/cifar.html — CIFAR-10 содержит классы cat и dog с отдельной тестовой выборкой. У пользователя запрошен выбор между обучением самой SNN KNP/AltAI по изображениям и гибридным вариантом с готовым извлекателем признаков. Выбор и реализация пока не выполнены.
### Реализация отдельного спайкового эксперимента
Пользователь выбрал обучение именно SNN KNP/AltAI, без готового извлекателя признаков.
- Создан `/mnt/c/KNP/cats-dogs/source` — копия текущего `examples/examples/mnist-learn` вместе с прежними правками, с сохранением лицензии Apache 2.0. Исходный MNIST не менялся. В копии `global_config.h` число классов изменено с 10 на 2, число входов с 784 на 2048.
- Вход — серое изображение 32×32, дополненное `255 − яркость` (ON/OFF). Преобразование фиксированное, не обучаемое. По 20 нейронов на каждый класс.
- Созданы локальные скрипты в `/opt/neiro/experiments/cats-dogs`, рабочие копии на стенде в `/mnt/c/KNP/cats-dogs`: подготовка данных, отдельная сборка, запуск с сохранением логов/настроек/счётчиков и валидационный подбор порога.
- `build.py` использует include/link-флаги рабочей сборки KNP и собирает отдельный бинарник `/home/int/run/cats-dogs/build/cats_dogs` (два параллельных компилятора). Сборка успешно завершилась, лог — `/home/int/run/cats-dogs/build.log`.
- Первоначальная загрузка официального `cifar-10-binary.tar.gz` оказалась медленной. Последовательную загрузку и последующую попытку через 32 HTTP Range-запроса остановили. Частичный архив и части не считаются проверенным датасетом и не использовались для обучения.
- Для пилота выбран источник JPEG-превью `uoft-cs/cifar10` через Hugging Face datasets-server: 800 train, 200 validation, 400 test, поровну кошек/собак. Это преобразованные JPEG, а не стандартные байты CIFAR; результат не следует называть стандартным CIFAR-бенчмарком. Индексы, seed и хеши сохраняются в manifest.
- В `/home/int/anvenv` через `ensurepip` установлен pip 25.1.1, затем Pillow 12.3.0 для чтения JPEG. Первая попытка pip не сработала, поскольку его в этой среде не было. Лог — `/home/int/run/cats-dogs/pillow-install.log`.
- Первая массовая загрузка превью остановилась на HTTP 429. Добавлены кэш и повторные попытки с задержкой, параллельность запросов метаданных снижена до двух. Дополнительно создан локальный `fetch_cache.py` для загрузки с другой машины и последующей передачи кэша на стенд.
На момент этой записи подготовка данных продолжается; результаты обучения будут добавлены ниже после фактического завершения.
### Завершение первого опыта с кошками и собаками
Данные в итоге получены из JPEG-зеркала `https://github.com/YoongiKim/CIFAR-10-images`, закреплённого на коммите `d7d05618061fe37d830fb0419063d113c575ccbc`. Попытки Hugging Face также остановлены из-за HTTP 429. Окончательная подготовка выполнена `prepare_jpeg.py`; данные Hugging Face и частичный бинарный архив в обучении не использовались.
Подготовлены 800 train, 200 validation, 400 test, поровну классов. Метки: 0 — кошка, 1 — собака. Имена исходных файлов, параметры и SHA-256 записаны в `data/manifest.json`. Проверены отсутствие пересечения train/validation, размеры файлов и баланс меток. Локальные копии манифестов — в `experiments/cats-dogs`.
Выполненные запуски:
```bash
python3 /mnt/c/KNP/cats-dogs/run.py smoke --dataset smoke --train 100 --count 100
python3 /mnt/c/KNP/cats-dogs/run.py validation --train 800 --count 200
OPENBLAS_NUM_THREADS=1 ~/anvenv/bin/python /mnt/c/KNP/cats-dogs/tune.py ~/run/cats-dogs/validation
~/anvenv/bin/python /mnt/c/KNP/cats-dogs/prepare_contrast.py
python3 /mnt/c/KNP/cats-dogs/validate.py
python3 /mnt/c/KNP/cats-dogs/run.py test --dataset contrast_train_test --train 800 --count 400 --threshold 60
```
- Smoke: 49/100 верных, 1 молчание. Веса выгружены, ограничиваются параметрами STDP, прогон завершился без ошибки.
- Исходный яркостный вход, validation, порог 60: 74/200 верных, 42 молчания, 84 ошибки.
- Офлайн-симулятор на том же пороге дал 83/200, поэтому его подбор не принят. Для этого опыта модель выбиралась по **настоящим прогонам KNP**. Начальное состояние растра после кодирования train в симуляторе не учтено; отдельная диагностика всех причин расхождения не проводилась.
- Добавлен второй фиксированный вариант кодирования (`prepare_contrast.py`): серый BT.601, вычитание box blur 5×5 с edge padding, усиление ×4, разделение положительной/отрицательной частей в ON/OFF, clipping uint8. Готовая обученная модель признаков не применяется.
- `validate.py` проверил 10 конфигураций только на validation: яркость с порогами 10/20/40/60 и контраст с 10/20/40/60/100/150. Выбраны контраст и порог 60: 111/200 (55,5%), 1 молчание. Полная таблица сохранена в `/home/int/run/cats-dogs/selection.json` и локально в `experiments/cats-dogs/results/selection.json` **до запуска test**.
- Тест проверен один раз выбранной конфигурацией: **208/400 (52%)**, 183 ошибки, 9 молчаний. Кошки — 98 верных / 97 ошибок / 5 молчаний, собаки — 110 / 86 / 4. CPU-прогон train+test занял 4,7 с.
- Тестовый прогон заново обучил сеть на тех же train и seed=42. `float_weights.csv`, `quant_weights.csv`, `float_neurons.csv`, `quant_neurons.csv` побайтно совпали с выбранным валидационным прогоном. Результат проверки и SHA-256 — `/home/int/run/cats-dogs/reproducibility.json`, копия локально в `results`.
Вывод: воспроизводимое STDP-обучение настоящей модели KNP/AltAI работает, но полезное различение кошек и собак не достигнуто. 52% на сбалансированном тесте близки к 50% постоянного ответа; интервал Уилсона 95% примерно 47,1–56,9%. Нельзя утверждать доказанное преимущество над угадыванием. Это один seed и небольшой JPEG-пилот, не стандартный CIFAR-бенчмарк.
Артефакты: `/mnt/c/KNP/cats-dogs` — исходники и скрипты; `/home/int/run/cats-dogs` — данные, логи и все прогоны; `/opt/neiro/experiments/cats-dogs` — скрипты, README, манифесты, результаты, архив исходников и обученных весов. Исходный пример MNIST и его визуализатор не менялись. Автозапуск не настраивался; фоновых обучений или загрузок этого опыта не оставлено. Следующая идея — спайковый слой локальных признаков перед классификатором; он пока не реализован.
## Второй опыт: улучшение распознавания
По запросу пользователя начата работа над улучшением результата. Сохранено обучение классификатора через STDP в KNP; предобработчик контуров фиксированный, готовая обученная нейросеть не используется. Полностью спайковый извлекатель локальных признаков пока не реализован.
Изменения:
- `features.py`: HOG-подобный дескриптор (sqrt RGB, выбор канала с наибольшим градиентом, 9 направлений, ячейки 4×4, перекрывающиеся блоки 2×2, L2-Hys). Проверены плотные HOG, HOG с грубыми цветом/яркостью, и разреженный HOG с 256 сильнейшими признаками. Вход дополняется нулями до 2048.
- `test_features.py`: проверки ориентации границ, чёрного изображения, размеров, padding, разреженности и детерминированности — прошли.
- `run.py`: добавлены параметры `--data-dir`, `--columns`, `--seed`, `--jitter`, `--quant`. Старые значения по умолчанию сохранены. `--quant weights` включает существующий исследовательский режим `KNP_MNIST_QUANT=weights` в KNP-примере.
- `prepare_v2.py`: расширенный JPEG-набор с новым разделением. Train: 4000 (по 2000, train 0000–1999), новая validation: 1000 (train 4500–4999), новый test: 1000 (test 0200–0699). Новый test не пересекается с test первого опыта (0000–0199). Seed перемешивания 20261015, источник и commit прежние. Использован существующий JPEG-кэш, недостающие файлы скачаны с GitHub.
- `prepare_features.py`: подготовка трёх представлений с манифестами/хешами. `prepare_baseline_v2.py`: прежние 800 обучающих примеров первого опыта и новый test в прежнем контрастном кодировании для сравнения на одинаковых изображениях.
- `validate_v2.py`: 8 заранее заданных конфигураций на новой validation: 20/60 нейронов на класс × пороги 600/1600/4000/8000, разреженный HOG, квантование по весам, seed 42. `evaluate_v2.py`: однократный тест выбранной конфигурации и прежней сети, проверка идентичности весов и сохранение сравнения.
Предварительные прогоны только на прежней validation:
- `probe_v2.py`: 6 прогонов плотных HOG/комбинированных признаков с порогами 20/60/150. Основная проблема — молчание; у `probe_hog_20` 65626/81920 квантованных весов нулевые.
- 8 прогонов `probe_precise_*`: плотный/разреженный HOG × пороги 200/600/1600/4000 с квантованием по весам. Разреженный HOG перестал молчать и дошёл до 123/200 (61,5%) на старой validation. Это диагностическая валидация, не тестовая оценка.
- Отдельно вычислены скалярные произведения выгруженных весов с признаками и диагностические варианты центрирования/нормирования весов. Эти вычисления не обучали веса и не использовались как итоговый классификатор; изменения центрирования в C++ не вносились.
Смысл изменений: избежать плотного общего фона входных признаков и потери малых весов при квантовании. Веса остаются в ±255; пороги проверяются в CPU-эмуляторе, переносимость на конкретное поколение физического AltAI пока не установлена. Исходники MNIST и библиотек KNP в этом втором опыте не редактировались.
На момент записи завершена подготовка данных, идёт панель новой validation. Тестовая оценка и итоговые артефакты будут добавлены после завершения.
### Результат второго опыта
Все 8 валидационных конфигураций завершены. Выбрана `v2_val_c20_t4000`: 20 нейронов на класс, порог 4000, разреженный HOG, `KNP_MNIST_QUANT=weights`, jitter 20, seed 42. На новой validation — 626/1000 (62,6%). 60 нейронов на класс не улучшили результат; лучший проверенный порог с ними дал 60,2%. Выбор сохранён в `selection-v2.json` до проверки test.
`evaluate_v2.py` завершился успешно. **Одинаковый новый test, 1000 изображений:**
- Новая сеть (`v2_test`): 618 верных, 382 ошибки, 0 молчаний, **61,8%**. Кошки 304/500, собаки 314/500. Train+test 23,27 с на CPU.
- Прежняя сеть (`v1_fresh_test`): 522 верных, 450 ошибок, 28 молчаний, **52,2%**. Кошки 213/500, собаки 309/500. Train+test 5,55 с.
- Прирост **9,6 п.п.** Интервал Уилсона 95%: новая 58,7–64,8%, прежняя 49,1–55,3%. Это оценка на данном небольшом JPEG-наборе, не гарантия распознавания произвольных фотографий.
Для обеих моделей `float_weights.csv`, `quant_weights.csv`, `float_neurons.csv`, `quant_neurons.csv` побайтно совпали с соответствующими валидационными прогонами. Для прежней модели подтверждена идентичность весов первому опыту. Модель по test не перенастраивалась. Манифесты проверены: уникальность, баланс классов, отсутствие пересечений train/validation/test, новый test не пересекается со старым. Проверены синтаксис всех скриптов и тесты признаков. Среда: Python 3.14.4, numpy 2.5.4, Pillow 12.3.0.
Сохранены локально:
- `experiments/cats-dogs/V2.md` — описание, команды, результаты и ограничения.
- `results-v2/selection.json`, `comparison.json`, `test-settings.json`, `data-manifest.json`, `features-manifest.json`, `probes.json`.
- `trained-weights-v2.tar.gz` — обученные веса/пороги и настройки.
На стенде остались все логи, данные и прогоны в `/home/int/run/cats-dogs`; скрипты и копия отчёта — в `/mnt/c/KNP/cats-dogs`. Нового веб-приложения не делали, визуализатор MNIST не меняли. Фоновые загрузки/обучения этого опыта завершены, автозапуск не создавался.
Что можно сделать дальше (пока не сделано): зеркальные отражения и небольшие сдвиги train; спайковый слой обучаемых локальных признаков и объединение по соседним участкам; проверка нескольких seed; при потолке STDP — отдельный опыт с другим обучением SNN. Совместимость с физическим чипом не проверена. Прирост есть, но 61,8% всё ещё недостаточно для уверенного распознавания.
## Мониторинг восстановления SSH и автоматическая отправка
Пользователь явно разрешил мониторить доступ и при восстановлении отправить всю информацию. Создан `experiments/cats-dogs/monitor_handoff.py`: проверяет SSH каждые30с, при доступности запускает save_handoff.py, повторяет после сбоя и выходит после успешной SHA256-проверки переноса. Использует flock для защиты от второго монитора. Процесс запускается в фоне с отдельной сессией; лог/статус/PID находятся в `/opt/neiro/.handoff-monitor`. Перезапуск локальной машины остановит монитор: системный автозапуск не настроен.
Перенос включает всю папку эксперимента, копии журнала и AGENTS, наблюдения, сохранённые результаты/исходники/веса и CUDA-черновики. save_handoff.py сначала отправляет имеющийся локальный пакет, затем получает полный runtime-снимок и контекст со стенда и отправляет дополненный пакет. Это позволяет сохранить память раньше длительного резервирования. При отсутствии rsync на стенде используется tar по SSH. Из исходного KNP ничего не удаляется.
Непроведённый запрос iperf3: требовалось установить на стенд и выполнить `iperf3 -c 10.9.8.1 -P 8 -t 5`; доступ был недоступен, установка/тест не выполнялись. Этот монитор занимается сохранением информации, сетевые тесты сам не запускает.
## Отмена мониторинга и экспорт ZIP
По последнему запросу пользователя остановлены фоновый монитор SSH и автоматическая доставка (группа процесса784614); дальнейшие подключения автоматически не выполняются. Последний зафиксированный ответ SSH был Connection refused, успешного переноса не было. Вместо этого создан публичный ZIP `/public/knp-altai-handoff-2026-10-14.zip` со всеми доступными локальными материалами этого чата: передача, правила/журнал, скрипты и CUDA-прототип, результаты/манифесты/архивы исходников и весов, наблюдения/скриншоты, состояние отменённого монитора. Недоступные новые полные снимки удалённого runtime в ZIP не включены — их не удалось получить. Пароли и SSH-ключи в архив не включались.
## Вечер: перенос в git и сверка ускоренных прогонов
- Папка `/mnt/c/knp` стала общим git-репозиторием (ветка `main`, remote `https://git.snw.su/int/our_knp.git`). Вложенные `.git` из `1/`, `viz/`, `examples/` перенесены в `/mnt/c/knp-nested-git-backup/`, там же `examples-local-changes.patch`. Локальный DNS не резолвит `git.snw.su`, поэтому в репозитории задан `http.curloptResolve git.snw.su:443:45.141.100.133`. Пуш выполняет пользователь.
- Недостающие материалы передачи (HANDOFF, ACCELERATION, GPU-черновики, results v1, архивы) скопированы из ZIP в `cats-dogs/`. Работа выполнялась прямо на стенде: `~/run/cats-dogs` на месте, SSH не нужен.
- Сверка готовых файлов, без новых запусков, `cmp` всех CSV (float/quant neurons/weights, result.csv):
- `backend_altai_full` (tuned, 2 потока) против `v2_val_c20_t4000` (single): **все побайтно совпадают**, 626/1000. Время: tuned2 80,77 с против single 22,84 с — многопоточность в 3,5 раза медленнее.
- `fast_smoke` (кэш подключений) против `backend_altai_single` (800+200): **все побайтно совпадают**, 123/200. Время 4,39 с против 4,89 с (~10% быстрее). Полный замер fast на 4000+1000 ещё не делался.
## Вечер: ON/OFF-вход, устойчивость сети, аугментация (MNIST как полигон)
Цель пользователя — распознавание объектов; MNIST используется как быстрый полигон, находки переносятся на кошек/собак.
### Код
- `examples/examples/mnist-learn/global_config.h`: размер входа теперь `get_input_size()` из `KNP_MNIST_INPUT_SIZE` (по умолчанию 784); замены в `dataset.cpp`, `models/{altai,blifat}/construct_network.cpp`. Пример пересобран в `~/knp-build`.
- `onoff/prepare_onoff.py` — ON/OFF-датасеты (1568 байт: ON + OFF; режимы full/half/local).
- `viz/altai_sim.py --pix 1568` — симулятор для ON/OFF; сверка с KNP 177 против 179 из 300.
- `augment/tta_sim.py` — голосование сдвигами при ответе и проверка устойчивости в симуляторе.
- `augment/augment_mnist.py` — аугментация train: сдвиг ±2, поворот ±12°, масштаб 0,9–1,1, толще/тоньше на 1 px; eval-часть без изменений.
- `augment/resume.sh` — перезапуск прерванных прогонов.
### Результаты (validation = train 50000–59999, обучение 30 000, настройки лучшей сети, seed 42)
| Прогон | Вход | Верно |
| --- | --- | --- |
| `oo_v_base` | обычный | **92,5%** (на тесте та же сеть `fin30k_s42` — 92,3%) |
| `oo_v_local` | ON/OFF, OFF в полосе 2 px | 56,5% |
| `oo_v_half` | ON/OFF, OFF ×0,5 везде | 55,9% (колонки 5, 8, 9 молчат) |
| `oo_v_full` | ON/OFF, OFF везде | 2,4% (сеть почти всё время молчит) |
Почему ON/OFF провалился: спайков на входе в 3–4 раза больше; на трети картинок у всех колонок отрицательная сумма весов (молчание). Не квантование: на float-весах картина та же. Следующий шаг — нормировать поток спайков (ON+OFF ≈ как раньше).
Устойчивость лучшей сети (симулятор, 2000 тестовых картинок): как в MNIST 90,1%; сдвиг 1 px 83,8%; 2 px 63–65%; толще 1 px 78,8%; тоньше 1 px 75,5%. Сеть — набор трафаретов, поэтому нарисованные в визуализаторе цифры распознаются плохо. Голосование 9 сдвигами (±1): как есть 91,5%, сдвиг 2 px 70,0%, толще 82,7%, тоньше 85,3%.
### Прервано выключением компьютера (перезапуск: `augment/resume.sh`)
Компьютер оставили на ночь: в 19:17 `resume.sh` перезапустил `aug_v_A90k`, `sz80_30k_s{42,1}`, `sz{40,80}_60k_s42`; `aug_v_B30k` досчитывается. Исправлен признак готовности в `resume.sh`: остановленный `run.sh` всё равно пишет `ELAPSED`, поэтому готовым считается только прогон со строками `CLASS`.
Проверить после обучения: `augment/tta_sim.py aug_v_B30k val30000.bin val30000.target --first 30000` — устойчивость к сдвигу/толщине, сравнение с `oo_v_base`.
### Аугментация B (10 000 исходных × 3 = 30 000 шагов обучения), validation
KNP: `aug_v_B30k` 8940/10000 = 89,4% (ориентир `oo_v_base` 92,5%). Устойчивость в симуляторе, 2000 картинок validation:
| Сеть | Как есть | Сдвиг 2 px | Толще 1 px | Тоньше 1 px |
| --- | --- | --- | --- | --- |
| `oo_v_base` (30 000 исходных) | 91,9% | 66,6% | 80,8% | 80,2% |
| `aug_v_B30k` (10 000 × 3) | 87,8% | **81,5%** | 79,1% | 74,9% |
Сдвиг: +15 п.п.; на чистых картинках −4 п.п. (втрое меньше уникальных исходников); к толщине устойчивость не выросла. Ждём `aug_v_A90k` (30 000 × 3).
### Страница проверки и слой «детекторы штрихов + пулинг» (прототип вне KNP)
- Визуализатор: кнопки сдвига на 1 px и строка «Итог всех сетей» (`viz/app.html`); страница с обычной сетью и аугментацией B — `viz/aug_viz.html`, опубликована https://claude.ai/artifact/Vc1q1WCZuPY2QAHBSGtrKF. Пользователь проверил: нарисованная тройка → «2»; аугментация сдвигами не решает другой почерк.
- `features/stroke_features.py`: детекторы штрихов (Gabor-подобные ядра) + max-пулинг, 784 значения на картинку, считается обычным кодом — проверка идеи перед переносом слоя в KNP. Вариант `fine`: 4 направления, пулинг 3×3 шаг 2 → 4×14×14.
- `augment/tta_sim.py --features [--preset --scale]` — устойчивость для сетей на признаках (искажение пикселей → признаки → сеть).
| Сеть (validation, 2000 картинок, симулятор) | Как есть | Сдвиг 2 px | Толще 1 px | Тоньше 1 px |
| --- | --- | --- | --- | --- |
| пиксели (`oo_v_base`) | 91,9% | 66,6% | 80,8% | 80,2% |
| пиксели + аугм. B (`aug_v_B30k`) | 87,8% | 81,5% | 79,1% | 74,9% |
| штрихи fine (`f_v_plain`, KNP 86,3%) | 85,2% | 61,4% | 75,1% | 71,6% |
| штрихи fine + аугм. B (`f_v_augB`, KNP 82,2%) | 81,0% | 74,8% | 71,9% | 68,6% |
Вывод: мелкий пулинг не помог ни точности, ни устойчивости (сдвиг 2 px = целая клетка сетки 14×14). Порог не виноват (лучший 85,3% при 60). Запущен вариант `coarse` как у HOG: 8 направлений × 2 толщины, пулинг 5×5 шаг 4 → 16×7×7, масштаб 0,3842 (`fc_v_plain`, `fc_v_augB`).
### Признаки coarse и диагностика классификатора
KNP, validation: `fc_v_plain` 81,0%, `fc_v_augB` 79,5%. Симулятор (2000): coarse — как есть 79,4%, сдвиг 61,4→59,5%; coarse + B — 79,3% / 76,5% / 66,7% / 74,1%.
Диагностика: линейный классификатор (ridge, обычный код, только для оценки информативности входа), обучен на тех же 30 000:
| Вход | как есть | сдвиг 2 px | толще | тоньше |
| --- | --- | --- | --- | --- |
| пиксели | 85,3% | 57,2% | 76,6% | 56,4% |
| штрихи fine | 95,2% | 88,9% | 90,7% | 59,6% |
| штрихи coarse | 96,2% | 91,2% | 93,3% | 66,2% |
**Вывод:** признаки штрихов информативны и устойчивы к сдвигу и толщине; узкое место — классификатор из колонок STDP. На пикселях он лучше линейного (трафареты), на плотных признаках сильно хуже (79–86% против 95–96%). Дальше нужно улучшать обучение классификатора (дискриминативное: наказывать неверную колонку, дофамин в ResourceSTDP AltAI) или обучать выходной слой вне чипа и загружать веса в нейроны AltAI (решает пользователь).
### Досчитались ночные прогоны (20:34)
- `aug_v_A90k` (30 000 исходных × 3 = 90 000, 4593 с): KNP validation 88,6%. Симулятор (2000): как есть 89,5%, сдвиг 2 px 83,8%, толще 69,2%, тоньше 76,2%. Больше исходных картинок не вернуло точность на чистых (B 87,8%), устойчивость к сдвигу чуть выше B (81,5%), к толщине хуже.
- Размер колонки, тест: 80 нейронов, 30k — 89,6% (s42) и 91,1% (s1), в среднем 90,3% (хуже 20/40); 40 нейронов, 60k — 92,8% (s42; 20 нейронов, 60k `fin60k_s42` — 92,2%). `sz80_60k_s42` ещё считается.
## Ночь 14→15 октября: компьютер отдан под эксперименты, главная цель — объекты
### Спайковый выходной слой (обучение вне чипа, распознавание целочисленными нейронами AltAI)
- `readout/spiking_readout.py`: ridge-регрессия на числах спайков, веса квантуются в ±255, выход — по нейрону на класс (порог, сброс в 0, потенциал не ниже 0, вход «смещение» спайкает каждый активный шаг); ответ — нейрон с наибольшим числом спайков. `readout/robustness.py` — устойчивость.
- MNIST, validation 10 000: пиксели — 65% (линейный слой на пикселях слаб); штрихи fine — 93,2%; штрихи coarse — 94,9% при пороге 8 (float 96,7%).
- Устойчивость (coarse, обучение на признаках `augA`, 90 000): как есть 95,1%, сдвиг 2 px 89,9%, толще 91,1%, тоньше 74,6% (лучшие колонки: 91,9 / 66,6 / 80,8 / 80,2).
### Кошки/собаки: узкое место — признаки
- Спайковый/линейный выход на HOG v2 (`features-v2`): ~60% (колонки STDP — 62,6%). Классификатор не спасает: HOG не хватает.
- `objects/kmeans_features.py`: признаки, выученные без меток (Coates & Ng 2011): кусочки 6×6×3, нормировка контраста, ZCA, сферические k-средние (= соревновательное обучение «победитель забирает всё»), активация max(0, ⟨p, d⟩ − α), сумма по четвертям картинки.
- Validation v2 (обучение 4000, линейный выход, ridge): K=400 — 73,9%, с зеркальными копиями 75,1–75,6%; K=800 α=0,25 + зеркало — **77,4%** (HOG + колонки STDP было 62,6%).
- `objects/fetch_more.py`: докачаны JPEG того же зеркала/коммита train 2000–4499 для cat и dog (5000 файлов). `objects/prepare_big.py` → `~/run/cats-dogs/data-v3`: train 9000 (0–4499 на класс), val 1000 (4500–4999, побайтно те же картинки, что v2 val). Пересечений с val/test нет. Test не используется.
### Наказание неверных колонок в STDP (MNIST)
- `KNP_COL_PUNISH=<d>` в `models/altai/construct_network.cpp`: проекция target→input, дофамин −d·1000 всем колонкам, кроме колонки метки (награда 0,179376). В KNP отрицательный дофамин ослабляет синапсы, внёсшие вклад, у нейронов, спайкавших в последние 10 шагов; принудительно сработавший нейрон наказание игнорирует.
- Короткие прогоны (3000 обучение, 1000 проверка): пиксели — без наказания 85,9%, 0,005–0,06 — 83,7–84,8%, 0,18 — 76,6%. Coarse-признаки: без наказания 69,8%, 0,0005–0,003 — 62–71%, 0,005–0,02 — 73–79%, 0,18 — сеть молчит. Разброс большой; ночью полные прогоны `augment/punish_runs.sh`: 30 000, p ∈ {0; 0,005; 0,012} × seed {42, 1}.
### 21:30–22:00
- Кошки/собаки, v3 (9000 обучение + зеркало): K=800, с делением на контраст — 78,4% (lam 300); без деления (линейная центровка, складывается в веса нейрона) — 77,1% (α 0,25). K=1600 на 4000 — 78,1%.
- MNIST `sz80_60k_s42` (колонки 80, полный MNIST, тест): 93,49% — лучший результат колонок на пикселях (один seed).
- Наказание, полные прогоны (coarse-признаки, 30 000, validation): без — 81,0/78,4% (ср. 79,7); 0,005 — 79,0/83,1% (81,0); 0,012 — 83,0/83,9% (**83,5**). Запущены 0,02/0,035/0,06.
- Кошки/собаки в KNP: `cats-dogs/source` получил `KNP_COL_PUNISH` (по умолчанию выключено, поведение v2 не меняется); `cats_dogs` пересобран, прежний бинарник — `build/cats_dogs.v2-backup`. `objects/make_knp_features.py` → `features-v3/kmeans_validation.{bin,target}`: K=512 × 4 четверти = 2048 входов, без деления на контраст, α 0,25, усиление по 99-му перцентилю; ~6200 спайков на картинку. Сетка `objects/grid_v3.sh`: порог {1600, 4000, 8000, 16000} × наказание {0; 0,012; 0,03}.
- Выход на этих 2048 входах: ridge без спайков 74,2%; один спайковый нейрон-разность «собака − кошка» (сработал → собака) — 72,4% (порог 500). Пара нейронов «за/против» не работает (почти равные огромные суммы, 10–15 спайков не различают разницу).
### 22:00 – 00:30
- KNP-колонки на плотных выученных признаках (`features-v3`, 2048 входов, ~6200 спайков/картинку): молчат на 99–100% картинок при любых порогах 1600–16000 и наказании 0–0,03; в симуляторе даже при пороге 1 — 25,8% верно, 48,6% молчит. Средний вес после STDP −13 (как у ON/OFF): у плотного входа сумма уходит в минус.
- Разреженные варианты (порог колонки × наказание, validation 1000): top-256 — 61,4–64,3% (лучший t1600 p0,012 **64,3%**); выше 70-го перцентиля — 56,3–60,3%; выше 50-го — 51,6–58,8%. Наказание 0,012 лучше 0 во всех 9 парах (+0,2…+2,5 п.п.). Линейный выход на тех же входах: top-256 66,2%, c70 68,2%, c50 69,6%.
- MNIST, наказание (coarse, 30 000, validation, seed 42/1): 0 — 81,0/78,4 (79,7); 0,005 — 81,0; 0,012 — 83,0/83,9 (**83,5**); 0,02 — 81,4/85,4 (83,4); 0,035 — 83,3/80,5 (81,9); 0,06 — 77,1/73,9 (75,5). Оптимум 0,012–0,02, +3,8 п.п.
- Полностью спайковая цепочка в приближении (признаки float → uint8 → нейрон-разность «собака − кошка»): K=800 — **74,1%** (порог 1000, выбран по validation).
- Ошибка ожидания: условие `pgrep -f grid_v3_sparse.sh` находило саму команду ожидания, компьютер простаивал ~22:40–00:10.
- `objects/fetch_fresh_test.py`: докачаны test 0700–0999 cat/dog (600, нигде не использовались) — для одной итоговой проверки.
- `objects/spiking_pipeline.py`: точная пошаговая симуляция пиксели → слой 1 (K × 27×27 нейронов, целые веса ±127, смещение каждый активный шаг, порог, сброс 0, не ниже 0) → нейрон «собака − кошка» (веса общие для узора и четверти, задержка 1). Проба на 300 обучающих: линейный на точных счётчиках 63,3%, спайковый выход 63,0% (порог 4 × медиана входа за шаг).
### 00:20 – 01:00: точная спайковая цепочка и однократная проверка на свежем тесте
- Точная симуляция `spiking_pipeline.py`, K=800 (`v3_k800_lin.npz`), 18 000 обучение + 1000 validation, 582 с: порог слоя 1 108,08 (99-й перцентиль) — линейный на точных счётчиках 71,0%, спайковый выход **71,6%** (lam 1e6, порог 4 × медиана); ~668 тыс. спайков слоя 1 на картинку. Порог 50 — 70,0%, порог 75 — 70,6% (не лучше).
- Свежий тест: CIFAR-10 JPEG test 0700–0999 на класс, 600 картинок, ранее не использовались (`objects/fetch_fresh_test.py`, `prepare_fresh_test.py`). Все настройки зафиксированы по validation до проверки; признаки D/E проверены на побайтное совпадение с сохранёнными. Скрипты `objects/prepare_fresh_knp.py`, `objects/final_fresh_test.py`; результаты `~/run/cats-dogs/final_fresh_test.json`, прогоны `fresh_D_v3`, `fresh_E_v2`.
| Вариант | validation | свежий тест (600) |
| --- | --- | --- |
| E: v2, sparse HOG + колонки STDP (t4000, c20) | 62,6% | 62,5% |
| D: выученные K=512 top-256 + колонки STDP, наказание 0,012 (t1600), KNP | 64,3% | 67,0% |
| C: полностью спайковая, точная симуляция (слой 1 + нейрон «собака − кошка») | 71,6% | 68,3% |
| B: K=800 без деления на контраст, ridge (без спайков) | 77,1% | 76,5% |
| A: K=800 с делением на контраст, ridge (без спайков) | 78,4% | 77,2% |
95% интервал при n=600 около ±3,7 п.п. **Свежий тест теперь просмотрен**; все test-картинки кошек и собак CIFAR (0–999) использованы, для новой независимой оценки нужен другой источник.
### 01:00 – : слой признаков нейронным правилом; число шагов
- `kmeans_features.learn_online`: обучение «победитель забирает всё» по одному кусочку за проход (как WTA-слой с Хеббом/STDP): победивший нейрон сдвигает нормированные веса к кусочку, скорость lr0/(1 + t/20000), 200 000 кусочков, то же выбеливание. Validation, K=400, без деления на контраст, +зеркало, ridge 300: пакетные k-средние 74,9%, **онлайн WTA 75,9%** — правило на нейронах даёт признаки не хуже.
- `spiking_pipeline.py --active N`: число активных шагов входа (по умолчанию 10). Запущены 20 и 30 шагов (порог слоя 1 тот же 108,08).
- Число активных шагов (точная симуляция, K=800, порог слоя 1 108,08, validation): 10 — 71,6%; 20 — **72,9%** (1,49 млн спайков, 1515 с); 30 — 73,0% (2,32 млн, 2079 с). +1,3 п.п. за 2–3× шагов. (Первый запуск 20/30 упал на `global` в `main` — исправлено через `globals().update`.)
### 01:20 – 02:10: предел колонок и выход, обучаемый дофамином
- Колонки KNP на выученных признаках (validation): top-384 — 45,7–54,7% (молчат 96–308), top-512 — 22–37% (молчат 459–695); top-256 c40 — 62,2–**64,8%** (t4000 p0,012); top-256 t1000/t2500 p0,02 — 63,0/63,4%; top-128 — 50,9–55,9%; top-64 — 50% (один класс); top-256 c80 — 64,8/**65,1%**; top-128 c80 — 50,0/55,2%. Предел колонок на этих признаках ≈ 65%: плотнее — молчат, реже — теряют информацию.
- `objects/dopamine_readout.py`: выход «собака − кошка», обучаемый локальным трёхфакторным правилом: на каждой картинке синапс меняется на η·e·(число спайков входа), e = цель − tanh(сумма) — знаковый дофамин; усреднение весов по ходу; 20 эпох; вход нормирован средним числом спайков (постоянное усиление синапса). На точных счётчиках слоя 1 (K=800, 10 шагов): линейно 69,2% (ridge 71,0%).
- Нейрон-решатель без подбора порога по validation: смещение поднимается на thr/ACTIVE за шаг, порог k × медиана входа (k = 10…200 — результат не зависит), так что «дошёл до порога» = «сумма > 0». Ridge — **71,8%**; дофаминовые веса после обрезки |w| по 99,5-му перцентилю перед целочислением — **69,3–69,6%** (без обрезки 53,9%: редкие входы получают огромные веса, остальные округляются в 0).
### 02:10 – 02:40: новая сеть на странице
- `viz/export_data.py --readout <npz>`: в данные страницы добавляются ядра признаков штрихов, веса спайкового выхода и точность на всём тесте (считается тем же кодом, что в экспериментах). Сеть: признаки coarse (масштаб 0,3842), выход обучен на `fcoarseA_val90000` (90 000 = 30 000 × 3 с аугментацией A), порог 16; веса `~/run/exp/readout_coarseA.npz`, для страницы `readout_coarseA_page.npz`.
- `viz/app.html`: панель «4 · Сеть штрихов» — 16 карт 7×7, спайки 10 выходных нейронов, ответ; сеть входит в строку «Итог всех сетей» (работают сдвиги и рисование).
- Тест MNIST (10 000, симулятор): колонки 92,2%, аугментация B 89,3%, **сеть штрихов 94,7%**.
- Проверка JS против Python (QuickJS, установлен в `~/anvenv` через pip): 105/105 одинаковых ответов на картинках галереи, признаки расходятся максимум на 1 из 255 (округление); весь скрипт страницы разбирается без ошибок.
- Опубликовано на тот же адрес: https://claude.ai/artifact/Vc1q1WCZuPY2QAHBSGtrKF (версия 2).
- Всё обучение нейронными правилами (validation): признаки онлайн WTA K=800 (400 000 кусочков, то же выбеливание, `v3_k800_online.npz`) → точная симуляция (10 шагов, порог 108,08; 676 тыс. спайков/картинку) → выход: ridge + калиброванный нейрон 72,9–73,1%; **дофаминовое правило + калиброванный нейрон 69,4–69,8%**. Онлайн-WTA не хуже пакетных k-средних (там 71,8% / 69,3%).
- Разброс по seed (validation, `objects/seeds_DE.sh`): D (top-256 + колонки, наказание 0,012, t1600) — seed 42/1/2/3: 64,3/64,7/63,4/63,5 → 64,0 ± 0,6; E (v2 sparse HOG, t4000) — 62,6/62,9/62,6/60,3 → 62,1 ± 1,2. Отчёт дополнен.