our_knp/reports/2026-10-15/Отчёт_Linux_GPU.md

168 lines
28 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.

# Продолжение на native Linux и GPU — 15 октября 2026
**Итог: завершено. Настоящий CUDA backend работает; KNP-validation транспорта71,25%. Фоновых прогонов этого опыта больше нет. Итоги в последнем разделе.**
## С чего продолжать
Этот документ новее старого `cats-dogs/HANDOFF.md` про WSL. Рабочая машина теперь `user@10.9.8.230`, hostname `knp`, Ubuntu26.04.1, ядро7.0.0-38-generic; это не прежний WSL. SSH: `ssh -i ~/.ssh/id_ed25519_snw -o IdentitiesOnly=yes -o BatchMode=yes user@10.9.8.230`. Пароли не сохранять. Старый автоматический монитор/перенос отменён пользователем и не возобновлялся.
Репозиторий `https://git.snw.su/int/our_knp` склонирован в `/home/user/KNP`, исходный HEAD `8fe6c3a24855bf741e5af92b90e826d826f97e24`. Новые рабочие изменения не закоммичены и не отправлены в remote. Исходники самого KNP2.0.0 находятся внутри `examples/`; корень репозитория объединяет эксперименты и отчёты. Обнаружены и прочитаны свежие записи `claude-memory/all-on-platform.md`, `knp-mnist-altai-work.md`, `reports/2026-10-15/журнал.md`.
Актуальная цель из свежей передачи: распознавание транспорта (CIFAR airplane/automobile/ship/truck) нейронами KNP/AltAI. Пользователь уточнял: обучение разрешено вне платформы, важен инференс в KNP. Поэтому возобновляется `altai-objects/altai_infer.cpp`, а не старый незавершённый STDP-CUDA черновик кошек/собак. Новое указание этого чата — использовать GPU для скорости.
Старая сессия остановилась на сборе детекторных спайков K=200/stride2. В новой системе `/home/int/run` и готовых частей из WSL нет: данные/модель восстановлены заново. Значения из прежних отчётов не выдавать за новые измерения.
## Пути
- `/home/user/KNP`: актуальный git checkout и все новые исходники.
- `/home/user/KNP/build`: CMake build, двоичные файлы/библиотеки в `bin`.
- `/home/user/anvenv`: Python3.14, numpy2.5.4, Pillow12.3.0, pyarrow26.0.0.
- `/home/user/anvenv/lib/python3.14/site-packages/nvidia`: CUDA Runtime12.9.79 и NVRTC12.9.86.
- `/home/user/deps-src/hdf5-hdf5_1.14.6`: закреплённый исходник HDF5, tar.gz рядом.
- `/home/user/run/native-migration`: configure/build/install/parity/benchmark логи и технические результаты.
- `/home/user/run/cifar/hf_{train,test}.parquet`: восстановленный источник.
- `/home/user/run/cifar/vehicles`: NPZ, пиксели `.bin`, метки, манифест SHA256.
- `/home/user/run/altai-objects/model_k200`: восстановленный обученный детектор; meta пока без readout, веса, kmeans.npz, training-settings.json.
- `/home/user/run/altai-objects/native-cuda`: место основного возобновляемого опыта: `counts`, `model_readout`, `validation`, `pipeline.json`, логи стадий. Реальный статус всегда проверять по JSON/процессам, не по названию папки.
## Окружение и сборка
CPU i7-13700KF,24 логических CPU,61GiB RAM. GPU RTX4070TiSUPER,16376MiB, драйвер595.99.02. Использован системный GCC15.2. Драйвер не менялся. Установлены CMake4.2.3, Ninja и необходимые Boost/filesystem/program_options/ZMQ/spdlog/Python-venv зависимости через apt. Первую слишком широкую загрузку libboost-all-dev остановили на этапе скачивания, до установки; затем поставили ограниченный набор без recommends. Apt update выполнен. Автоматическое удаление старых ядер не запускалось.
Стандартный CUDA-бэкенд KNP не поддерживает AltAILIF. Вместо установки полного CUDA Toolkit/GCC14 создан отдельный backend на CUDA Driver API и NVRTC: host-код компилируется GCC15, ядра — NVRTC для архитектуры текущей видеокарты. Рабочие CUDA headers и libnvrtc поставлены в venv, системный libcuda берётся от установленного драйвера. Проверено фактическим запуском GPU-ядра, не только обнаружением GPU. Документация: https://docs.nvidia.com/cuda/nvrtc/index.html.
Сторонние зависимости KNP скачиваются CPM. Медленный shallow clone HDF5 всех refs остановлен, заменён архивом того же tag hdf5_1.14.6 и `CPM_hdf5_SOURCE`. Первый configure был прерван до сохранения cache, поэтому все флаги затем заданы повторно; один промежуточный configure без них упёрся в отсутствующий OpenCV. Финальная сборка успешна. Обязательная часть нейроинференса не использует OpenCV; графический визуализатор сделан необязательным с сохранением прежнего default ON.
Команда для повторной конфигурации:
```bash
cmake -S ~/KNP/examples -B ~/KNP/build \
-DCMAKE_BUILD_TYPE=Release -DKNP_BUILD_CUDA=OFF \
-DKNP_BUILD_VISUALIZER=OFF -DKNP_BUILD_DOCUMENTATION=OFF \
-DKNP_BUILD_TESTS=OFF -DKNP_PYTHON_FRAMEWORK_BUILD=OFF \
-DKNP_BUILD_OBJECTS=ON -DKNP_BUILD_ALTAI_CUDA=ON -DKNP_IPO_ENABLED=OFF \
-DCPM_hdf5_SOURCE=/home/user/deps-src/hdf5-hdf5_1.14.6 \
-DCMAKE_CXX_FLAGS='-Wno-error=maybe-uninitialized -Wno-error=deprecated-declarations'
cmake --build ~/KNP/build --parallel 12
```
CMake добавляет `altai_infer`, `altai_objects`, `bench_conv`, `knp-altai-cuda-backend`, `altai_cuda_probe`, `altai_cuda_parity`. Собраны также исходные CPU-библиотеки, примеры и их зависимости. Старый CUDA target выключен, Python bindings и OpenCV-графика не собирались. Это не проверка всей штатной test-suite KNP: выполнены перечисленные ниже целевые проверки.
## Что изменено в коде
1. `examples/CMakeLists.txt` + новый `altai-objects/CMakeLists.txt`: обычные CMake-цели вместо чтения Makefile-флагов из чужого `/home/int/knp-build`. `altai-objects/build.py` теперь вызывает CMake.
2. `examples/knp/base-framework/CMakeLists.txt`: `KNP_BUILD_VISUALIZER` для необязательных OpenCV-исходников, default ON, в native build OFF.
3. `build_model.py`, `train_readout.py`, `prepare_vehicles.py`: переносимые пути, реальные бинарные exports данных. Убраны жёсткие пути `/mnt/c/knp/objects` и `/home/int` в текущем пути запуска. Старые неиспользуемые экспериментальные скрипты могут всё ещё содержать WSL-пути.
4. Новый `run_counts.py`, wrapper `run_counts.sh`: ограниченный параллельный сбор KNP-спайков, точные короткие последние части, проверка размера `_counts.bin`, `.done` после успеха, lock, отпечатки модели/данных/сборки, JSON-прогресс. Прежние неизвестные маркеры без settings не принимаются. Явный `--backend cuda` выбирает новую библиотеку; default остаётся CPU, GPU default jobs2 против CPU12.
5. Новый `evaluate_knp.py`: чтение только спайков классов реального KNP, возобновляемая validation, метрики correct/accuracy/silent/ties/per_class; argmax с первым классом при равенстве. Не вычисляет признаки/классификационную сеть вместо KNP.
6. Новый `benchmark_cuda.py`: одинаковые сети/изображения CPU/CUDA, wall и execution time, побайтная проверка detector counts и class CSV при наличии readout.
7. Новый `vehicle_pipeline.py`: конечная последовательность collect → offline readout → CPU/CUDA gate полного readout → KNP validation; отдельный выходной каталог, lock/JSON/логи, ошибки останавливают цепочку. Официальный test не запускает. `model_readout` отделён от неизменяемого detector-only model.
8. `altai_infer.cpp`: проверки размеров/типов входов и модели вместо падения на отсутствующих файлах; исключения возвращают ошибку; guard конечного шага input generator (ModelExecutor посылает вход до проверки predicate, раньше мог читать за концом массива); потоковое накопление счётчиков по шагам вместо хранения всех выходных сообщений до конца.
9. `OutputChannel::receive_messages()` — добавленный метод без копирования накопленного буфера; старый `update()` сохраняет прежнюю сигнатуру/возвращаемый vector, делегирует получение этому методу. ModelExecutor внутренне использует новый метод. Устранено повторное копирование постоянно растущего буфера на каждом шаге; существующий API update не заменялся ссылкой и ABI его сигнатуры не ломался.
10. `altai-objects/gpu/`: новый CUDA runtime, backend, probe и conformance test; подробности ниже.
## GPU: что именно считается и ограничения
Новая библиотека: `/home/user/KNP/build/bin/libknp-altai-cuda-backend.so`. Это настоящий загружаемый backend KNP, наследующий CPU-контейнеры/экспорт для совместимости с ModelLoader, но переопределяющий вычислительный шаг. На GPU находятся потенциалы/таймеры нейронов, CSR-веса/связи и очереди задержанных воздействий. На CPU остаются создание модели, ввод байтов→спайки, KNP message bus и сбор результатов. Отдельной нейросети-симулятора на Python для инференса не добавлялось.
Поддержка намеренно ограничена: AltAILIF + DeltaSynapse, без STDP/пластичности, целые конечные веса |w|≤65535, целый начальный потенциал и нулевая дополнительная часть порога, excitatory/inhibitory-current, delays1..64. Индексы/размеры и доступный диапазон проверяются. Повторы входного спайка учитываются, лимит1024 на индекс/проекцию/шаг; неподдерживаемые случаи завершаются ошибкой, не подменяются CPU.
64-битные целые gather/очереди позволяют сохранять результат CPU float только в доказанном диапазоне: перед каждым обновлением проверяется |prepotential| + сумма абсолютных воздействий всех пришедших проекций + |leak| <2^24. При нарушении backend бросает ошибку. Многократные входы, разные задержки и несколько проекций входят в эту сумму; проверяется также запас от переполнения int64. Для широкого readout применяется блочное целочисленное сокращение, для короткого fan-in — gather по postsynaptic neuron.
KNP-очерёдность сохранена: популяции → барьер сообщений → проекции → барьер; воздействие, обработанное проекцией на шагеN с delayD, учитывается нейроном наN+D. Экспорт `get_network_data` выгружает mutable потенциал/prepotential/activity из GPU. Изменение топологии/обучение после init не поддерживается. Нельзя менять унаследованные CPU-контейнеры через downcast: это обход контракта и не обновляет GPU-копию. Нельзя пересобирать или менять модель/данные во время работающего collection.
Это эмуляция AltAI средствами KNP на GPU, не проверка физического нейроморфного чипа и не доказательство аппаратной совместимости произвольных настроек.
## Проверки и измерения
- CUDA Driver/NVRTC probe: реальное ядро выдало spike1/potential0, activity=INT64_MAX.
- `cuda_parity.cpp`: CPU против GPU,101 снимок состояния на каждом из двух режимов (непрерывно и pause/resume), точные биты potential/prepotential, int64 activity, временные метки и индексы спайков. Покрыты широкий fan-in600, несколько проекций/один input-channel, рекуррентность, смешанные знаки/тормозящий ток, нулевые веса, дубли, задержки1/2/7/64, опустошение очередей и wraparound, flags/reset/clamp/leak/activity.
- Неподдерживаемые fractional weight, delay65 и нарушение2^24 guard отвергаются. Тест завершился `CUDA_PARITY_OK` до и после no-copy/streaming изменения.
- Реальная модель K200/stride2 на8 и32 CIFAR validation: detector counts CPU/GPU побайтно совпали.
- Старый накопительный и новый потоковый сбор совпали для всех четырёх комбинаций CPU/GPU×8/32; `streaming-compatibility.json`.
- Коллектор: smoke train/train_flip/val по8 изображений, всего24; завершён и маркеры проверены.
Контроль после streaming, последовательные одинаковые запуски без параллельного большого collection:
| Изображений | CPU wall | GPU wall | CPU execution | GPU execution |
| --- | ---: | ---: | ---: | ---: |
| 8 |11.428с|4.751с|7.099с|0.252с|
|32|31.537с|4.832с|27.161с|0.342с|
Для32 изображений полный запуск ускорен примерно6,5×, вычислительная часть ~79,5×. Нельзя смешивать эти отношения: wall включает создание/копирование большой KNP-сети и освобождение, execution — участок executor.start с init/NVRTC. Замеры однократные на detector-only модели, не latency классификации одного кадра и не готовый FPS физического AltAI. После обучения readout цепочка автоматически повторит CPU/GPU сравнение полного класса-выхода. Сравнения native Linux против WSL при одинаковых версиях/коде/драйверах не проводилось; весь выигрыш нельзя приписывать смене ОС.
Сырые файлы: `/home/user/run/native-migration/{cuda-parity.log,cuda-parity-stream.log,benchmark-detectors/benchmark.json,benchmark-stream/benchmark.json,streaming-compatibility.json,collector-smoke}`.
## Данные и модель
Источник `uoft-cs/cifar10`, Hugging Face revision `0b2714987fa478483af9968de7c934580d0bb9a2`, файлы `plain_text/train-00000-of-00001.parquet`119705255байт и `test-00000-of-00001.parquet`23940850байт. Это источник новой транспортной цепочки; не путать с JPEG-зеркалом старых cats/dogs.
Классы0airplane,1automobile,2ship,3truck. Train16000 (первые4000 каждого класса), validation4000 (последние1000), test4000 (официальный, инференс ещё не запускался). Seed перестановок20261015. Горизонтальное отражение только train; train_flip — вторая обучающая часть. `.bin` — uint8 N×3×32×32, метки txt. NPZ/входы/метки хешированы в manifest.json.
Восстановлен детектор: spherical kmeans,200000 кусочков,15 итераций,seed0,K200,stride2,alpha0.25,без contrast divide; ZCA/центрирование свёрнуты в целые веса ±127. Получены scale37.59,detector threshold135,bias−13..−5 — совпадает с описанием старой сессии, но старые runtime-веса недоступны для побайтной сверки. `training-settings.json` фиксирует данные и параметры. Распознавание этих признаков выполняется нейронами KNP; kmeans/ridge обучаются вне платформы по принятому новому требованию.
## Команды продолжения
```bash
# Проверка backend
~/KNP/build/bin/altai_cuda_parity \
~/KNP/build/bin/libknp-cpu-single-threaded-backend.so \
~/KNP/build/bin/libknp-altai-cuda-backend.so
# Возобновляемая основная цепочка (не запускать второй экземпляр)
OPENBLAS_NUM_THREADS=8 ~/anvenv/bin/python ~/KNP/altai-objects/vehicle_pipeline.py \
--backend cuda --jobs 2 --chunk 1000
# Статус
cat ~/run/altai-objects/native-cuda/pipeline.json
cat ~/run/altai-objects/native-cuda/counts/progress.json
cat ~/run/altai-objects/native-cuda/validation/metrics.json
```
Процесс может долго собирать36000 изображений (train+flip+val), затем обучит ridge и проверит4000 validation в KNP. Наличие папки не означает завершение: смотреть JSON и `.done`. Число заявленной точности брать только из validation/metrics.json и отделять от ridge на counts и старых numpy-прототипов. Test остаётся нетронутым до согласованного финального этапа.
Следующее после завершения: оценить реальную точность readout/частоту ties/silence, при необходимости настраивать только validation; затем демо-сервер с длительно живущей сетью (создание сети сейчас ~4с на процесс), сравнение с CNN отдельным контролируемым опытом. Не выдавать batch-ускорение за скорость одиночного live-кадра.
## Заключительная проверка и текущий запуск
Применён astra-advisor, GPT-6 Astra: архитектурная консультация и заключительное чтение актуального кода (всего три взаимодействия по ускорению с учётом предыдущего чата). Вердикт — отдельных блокеров GPU для указанного детекторного collection не найдено. Замечание о непроверенных ошибках записи файлов исправлено: open/write/close binary и CSV теперь бросают исключение; meaningful проверка через symlink выходного файла на /dev/full дала exit1 вместо ложного успеха. На8 изображениях после исправления counts сохранились побайтно; результат output-guard-result.json. Коллектор дополнительно проверяет длину файлов/полноту CSV до .done.
Важные ограничения обзора: потенциалы нейронов сохраняются между картинками, тишина не является reset при leak0. Поэтому фиксированы порядок и chunk1000; произвольная смена границ может менять признаки. Экспорт сети синхронизирует поля нейронов, но не сериализует внутреннюю очередь задержанных событий GPU: пауза/возобновление того же backend поддержаны, создание нового backend из экспорта не является полным checkpoint при непустых очередях. .done фиксируют готовые выходные части, а не внутреннее состояние сети.
Основная цепочка запущена отдельной сессией Python, PID47256, `/home/user/run/altai-objects/native-cuda/runner.log`; группа процесса совпадает с PID, для отмены всей цепочки: `kill -- -47256` после проверки актуальности процесса. Не настраивался системный автозапуск. После перезагрузки запустить pipeline повторно: валидированные части пропускаются, чужие/другие отпечатки отвергаются. На момент записи стадия collecting, итоговая accuracy этого нового GPU-прогона ещё не получена. Живой прогресс T3: pw_e9834d515ef6; он суммирует36000 collection +4000 validation, без промежуточных контрольных benchmark-изображений.
## Установка компонентов для повторения
```bash
python3 -m venv ~/anvenv
~/anvenv/bin/python -m pip install numpy==2.5.4 pillow==12.3.0 pyarrow==26.0.0 \
nvidia-cuda-runtime-cu12==12.9.79 nvidia-cuda-nvrtc-cu12==12.9.86
mkdir -p ~/deps-src
curl -fL https://codeload.github.com/HDFGroup/hdf5/tar.gz/refs/tags/hdf5_1.14.6 \
-o ~/deps-src/hdf5_1.14.6.tar.gz
tar -xzf ~/deps-src/hdf5_1.14.6.tar.gz -C ~/deps-src
# После восстановления pinned parquet-файлов:
~/anvenv/bin/python ~/KNP/altai-objects/prepare_vehicles.py
OPENBLAS_NUM_THREADS=8 ~/anvenv/bin/python ~/KNP/altai-objects/build_model.py \
~/run/altai-objects/model_k200 --k 200 --stride 2
```
Не запускать подготовку данных поверх работающего опыта. `~/run/cifar/hf-source-manifest.json` содержит SHA256 и размеры исходных parquet, отдельный vehicles/manifest.json — подготовленных файлов. Вывод окружения сохранён в native-migration/environment.txt.
## Первое возобновление после GPU collection
Все36000 признаковых изображений завершились успешно. Следующая стадия обнаружила прежнюю ошибку train_readout.load: glob train_* захватывал также train_flip_*, то есть32000 строк вместо16000. Исправлен точный regex для каждого tag, проверка непрерывности диапазонов, checkpoint и размера блоков. Обучение/validation возобновляются с готовых counts, их пересчёт не нужен. Первый pipeline.json закономерно был failed на training_readout; это не сбой CUDA.
## Итог нового запуска — завершён
Последняя истина: pipeline.json `completed/done=true/failed=false`, повторный PID49452 завершился. Старые разделы о работающем PID47256 и промежуточном сбое описывают историю, а не текущий процесс. Новых обучений/сборов в фоне не осталось.
Полный collection36000 успешно получен на GPU; readout обучен offline на train+flip. После исправления glob обучение завершено, предиктор целиком проверен в KNP на4000 validation: **2850/4000 = 71.25%**, молчаний0, равных максимальных ответов426 (правило argmax выбирает первый класс). По классам: airplane746/1000, automobile741/1000, ship636/1000, truck727/1000. Это validation, не итоговая test-оценка. Точность ridge на тех же KNP counts74,48% — диагностический ориентир, не число KNP-нейронного readout. Официальный test не запускался.
Полная сеть с readout: CPU/GPU побайтно совпали по detector counts и class CSV на8/32 изображениях. На32: CPU wall32.140с, GPU wall6.218с, ускорение5.17×; executor.start CPU26.418с против GPU0.369с (71.6×). Не смешивать с приведёнными выше detector-only замерами.
Для всей validation4000 дополнительно проверено: добавление readout не меняет детекторные counts против предыдущего collection при одинаковых chunk1000, все четыре файла совпали побайтно. Доказательство detectors-readout-independence.json. Во время collection наблюдалась фактическая загрузка GPU99% в одном сэмпле nvidia-smi; это не среднее за опыт.
Итоговые параметры readout: lambda1000, threshold120, веса классов в ±255. Обученная полная модель: `~/run/altai-objects/native-cuda/model_readout`. Финальные метрики: `validation/metrics.json`; сводка `~/run/native-migration/final-summary.json`. Артефакты source diff/исходников и модели сохранены отдельно в native-migration, копии на машине ассистента — `/opt/neiro/reports/native-gpu-artifacts`.
Следующий шаг: поднять долгоживущий демо-сервер, согласовать reset/сохранение состояния между кадрами и оценку того же протокола, затем улучшать readout (сейчас10,65% ties) по validation. Не менять границы частей и не обещать одиночный кадр за batch-time. Test сохранить до финального выбора модели.