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

28 KiB
Raw Permalink Blame History

Продолжение на 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.

Команда для повторной конфигурации:

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.parquet119705255байт и test-00000-of-00001.parquet23940850байт. Это источник новой транспортной цепочки; не путать с 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 обучаются вне платформы по принятому новому требованию.

Команды продолжения

# Проверка 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-изображений.

Установка компонентов для повторения

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