our_knp/reports/imported-neiro-2026-10-15/experiments/cats-dogs/ACCELERATION.md

12 KiB
Raw Permalink Blame History

CPU и GPU: что ускорено

Чистый Linux против WSL

По запросу пользователя проверена документация NVIDIA и Microsoft (2026-10-14). В WSL CUDA использует драйвер Windows через предоставляемую libcuda.so; Linux-драйвер NVIDIA внутри WSL устанавливать нельзя. На отдельном Linux можно выбирать совместимые версии драйвера, CUDA Toolkit и ядра независимо от Windows. Это преимущество для диагностики и воспроизводимых замеров, но не доказанное ускорение нашей сети.

NVIDIA указывает ограничения WSL для полной Unified Memory, одновременного доступа CPU/GPU к managed memory и доступного объёма pinned memory. Собственный прототип использует явные копирования. Перенос STDP написан в gpu_stdp.cu и gpu_stdp_bridge.cpp, но сборка, проверка состояний относительно CPU и измерение ускорения ещё не выполнены. Эти файлы нельзя считать рабочим GPU-бэкендом.

Microsoft рекомендует для Linux-инструментов хранить рабочие файлы в файловой системе Linux, а не /mnt/c. Расчётные данные и сборки нашего стенда уже расположены в /home/int; исходники проекта остаются в /mnt/c/KNP.

Редактирование драйвера не требуется для реализации AltAI/STDP: отсутствие поддерживаемых типов нейронов и пластичности исправляется в KNP. Возможный выигрыш Linux следует проверять одинаковым прогоном на той же видеокарте. Переустановка ОС или драйверов не выполнялась.

Источники: NVIDIA CUDA on WSL, Microsoft: файловые системы WSL.

Рабочий быстрый режим

Для этой небольшой AltAI/STDP-сети быстрее запускать несколько независимых однопоточных процессов KNP, каждый со своим набором параметров, данными состояния и выходной папкой. run_batch.py запускает ограниченное число процессов, собирает ошибки и метрики, не перезаписывает существующие прогоны. Python-потоки здесь только управляют отдельными C++-процессами; вычисления не ограничены Python GIL.

validate_v2.py теперь использует этот запуск, по умолчанию 4 параллельных эксперимента. Пример следующего поиска с новым префиксом:

python3 /mnt/c/KNP/cats-dogs/validate_v2.py --jobs 4 --prefix next_val

Старые результаты выбора не перезаписываются. Новый поиск сохраняет next_val-selection.json, план и сводку в /home/int/run/cats-dogs/acceleration. Входы/данные остаются одинаковыми для сравнимых запусков. Один временной ряд внутри одной сети этим способом не разбивается между процессами.

Измерение пропускной способности

Четыре одинаковые конфигурации новой validation: 4000 train + 1000 validation, 20 нейронов на класс, пороги 600/1600/4000/8000. Сначала измерена последовательная группа, затем та же группа с четырьмя независимыми процессами.

Режим группы Общее время
Последовательно 91,573 с
4 процесса 42,911 с

Ускорение 2,134 раза. Каждый отдельный параллельный прогон занял примерно 40,7–42,9 с вместо 22–24 с в одиночку, но вся группа закончилась раньше. Для каждого порога четыре CSV весов/порогов и result.csv совпали побайтно между последовательным и параллельным запусками. Выигрыш относится к группе независимых экспериментов, не к одной сети. Замер однократный; Windows/WSL и другие нагрузки могут менять время.

Результат: acceleration-results/batch-benchmark.json. Код измерения — benchmark_batches.py; повторный запуск требует новых имён, поскольку данные предыдущего замера защищены от перезаписи.

Многопоточная обработка одной сети

В установленном KNP штатный MultiThreadedCPUBackend::SupportedNeurons содержал BLIFAT, STDP-BLIFAT и LIF, но не AltAI. Прямой запуск нашей сети завершался Type is not supported. Параметр количества потоков этого ограничения не исправляет.

Создана отдельная экспериментальная библиотека:

/home/int/run/cats-dogs/acceleration/libknp-cpu-tuned-backend.so

build_tuned_cpu.py копирует заголовок/реализацию многопоточного бэкенда в каталог эксперимента, добавляет AltAILIF и SynapticResourceSTDPAltAILIFNeuron к списку типов, использует существующие CPU-функции AltAI и STDP. Перекомпилируются обе единицы backend.cpp и get_network.cpp, чтобы их представления variant совпадали. Добавлены переменные фабрики:

  • KNP_CPU_THREADS: по умолчанию 2.
  • KNP_CPU_POPULATION_PART: по умолчанию 64.
  • KNP_CPU_PROJECTION_PART: по умолчанию 8192.

Значения проверяются на корректность и границы. Штатные исходники и библиотеки KNP не заменялись. Патч для просмотра — acceleration-results/cpu-altai-multithread.patch.

python3 /mnt/c/KNP/cats-dogs/build_tuned_cpu.py
python3 /mnt/c/KNP/cats-dogs/run.py my_tuned_run \
  --data-dir /home/int/run/cats-dogs/features-v2 \
  --dataset sparse_hog_validation --train 4000 --count 1000 \
  --quant weights --threshold 4000 --backend tuned --threads 2

На одинаковом коротком прогоне (800 train + 200 validation):

Бэкенд Время KNP train+inference Веса и результат
Однопоточный 4,89 с эталон
Новый, 2 потока 15,09 с побайтно совпали
Новый, 4 потока 15,69 с побайтно совпали

Поэтому run.py оставляет однопоточный бэкенд по умолчанию, а параллелизм для поиска организован между независимыми сетями. Наличие нескольких потоков само по себе не означает ускорения. В частности, в исходном многопоточном коде финализация STDP ставится в очередь одной задачей на популяцию, а у текущей сети одна небольшая обучаемая популяция; есть также барьеры между фазами каждого шага. Это кандидаты для дальнейшей оптимизации, не измеренная разбивка времени профилировщиком.

Короткий замер: acceleration-results/backend-altai-benchmark.json. Полный валидационный прогон экспериментального бэкенда проверяется отдельно; результат будет добавлен после завершения.

Видеокарта и CUDA

Стенд видит Intel i7-13700KF, 24 логических CPU в WSL, NVIDIA RTX 4070 Ti SUPER (compute capability 8.9, около 16 ГБ VRAM). Драйвер, сообщённый nvidia-smi: 610.88; установленный CUDA Toolkit: 12.9. Эти значения не следует смешивать с максимальной версией CUDA API, показанной драйвером.

Базовое CUDA-ядро /home/int/scratch-cu/t2 успешно записало и прочитало число 42: no error h=42. Это подтверждает работу базовых CUDA-вычислений в WSL, не всего GPU-бэкенда KNP.

В установленном исходнике gpu-cuda/backend.h:

using SupportedNeurons = boost::mp11::mp_list<knp::neuron_traits::BLIFATNeuron>;
using SupportedSynapses = boost::mp11::mp_list<knp::synapse_traits::DeltaSynapse>;
bool plasticity_supported() const override { return false; }

Следовательно, GPU-бэкенд не умеет нашу модель AltAI и не выполняет STDP-обучение. Исправление архитектуры компиляции не добавляет эти функции. Бинарник уже содержит sm_89 cubin, что проверено cuobjdump.

Кроме отсутствия модели, простой BLIFAT-пример через GPU-бэкенд воспроизвёл invalid device function в коде CUDA-векторов KNP. Лог — acceleration-results/cuda-knp-probe.log. Пример при этом может завершиться с кодом 0, поскольку ошибки только журналируются; это не успешное выполнение сети. Причина этой ошибки не установлена и не исправлена.

Чтобы обучать именно эту AltAI/STDP-сеть на GPU, нужны реализация её состояния, правил пластичности и обмена сообщениями в CUDA и проверка против CPU. Это отдельная доработка бэкенда; GPU-обучение в этой работе не включено. Текущий доступный выигрыш — проверенный параллельный поиск на CPU. Переход на другую модель нейрона или другое обучение должен оформляться как отдельный эксперимент.