# Продолжение на 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 сохранить до финального выбора модели.