our_knp/reports/2026-10-15/Отчёт_Кошки_собаки.md

22 KiB
Raw Permalink Blame History

AltAI Pet lab: кошки и собаки в KNP GPU

Дата: 15 октября 2026. Запрос: сделать ещё одно интересное демо, например распознавание кошек и собак, используя уже загруженные данные. Продолжаются требования вести журнал, сохранять отчёты на рабочей станции и не запускать других агентов, кроме astra-advisor.

Рабочий сайт: http://10.9.8.230:8082/. Галерея из 24 отдельных тестовых фото, загрузка своего PNG/JPEG/WebP/BMP, изображение на входе 32×32, карта реальных спайков свёрточных детекторов, ответ выходных нейронов. Старые сайты цифр на8080/8081 не менялись.

Проверенный результат

Замороженная модель: 1427/2000 = 71,35% на официальном test CIFAR-10, только cat/dog. Validation:1437/2000=71,85%. Это умеренная точность на сложных маленьких изображениях; ошибка примерно в трёх из десяти случаев. Новая задача существенно сложнее MNIST. Не выдавать эту сеть за надёжное распознавание любых фотографий.

Test confusion: настоящие кошки —715 ответовcat и285dog; настоящие собаки —288cat и712dog. Семь нулевых margins дают молчание обоих выходов; зафиксированное правило ничьей выбираетcat. Данные других классов не проверяются как неизвестные: модель всегда выбирает междуcat/dog. На произвольных фотографиях пользователей нет отдельной измеренной оценки.

Каждый из256 скрытых спайковых счётчиков и оба конечных выходных спайка на всех2000validation и2000test точно совпали с целочисленным эталоном. Эти полные прогоны выполнены на CUDA-бэкенде KNP. CPU/GPU parity проверено на отдельных небольших наборах и специальных fixtures, полный4000-прогон CPU не выполнялся.

Реальные серверные запросы заняли392,442,444,392мс; это измерения четырёх конкретных примеров после прогрева, не обещание для любого компьютера/снимка. Не смешивать с1–5мс только постоянного детекторного процесса: полный запрос включает обработку изображения, кодирование, отдельные KNP hidden/readout процессы и формирование ответа.

Что именно исполняется в KNP

Это собственная составная спайковая система, без предобученной CNN или готового внешнего классификатора:

  1. RGB-пиксели кодируются в10 шагов входных спайков.
  2. KNP AltAILIF/Delta вычисляет200 типов свёрточных детекторов в196 позициях:39200 нейронов,6×6×3patch,stride2.
  3. Хост фиксированно суммирует спайки по четырём областям изображения и делает root-L2 нормализацию. Здесь нет обученных весов.
  4. Ещё один граф KNP исполняет обученный нелинейный слой800→256 с целыми весами и64-шаговым IF-кодированием.
  5. Хост маршрутизирует полученные счётчики в пакет спайков. Последний граф KNP вычисляет обученные знаковые суммы в двух выходных AltAILIF-нейронах. Ответ получается сравнением двух спайковых выходов; хост не исполняет обученный dense-классификатор.

Границу хоста важно сохранять: pooling, нелинейная нормализация и временное перепаковывание находятся вне KNP. Это несколько связанных KNP-графов, а не доказанная единая сеть на физическом процессоре.

Официальный GoldenModel и физический Алтай для этой модели не проверены. Ранее подтверждённую совместимость MNIST нельзя автоматически распространять сюда. В частности, промежуточные пакеты используют повторные входные индексы, а старый официальный GM-probe дедуплицировал такой ввод; для аппаратного переноса потребуются отдельное кодирование, допустимые палитры весов, размещение и проверка.

Данные и обучение

На станции уже были ~/run/cifar/hf_train.parquet и hf_test.parquet, источник uoft-cs/cifar10, pinned revision из прежнего /home/user/run/cifar/hf-source-manifest.json. Нового скачивания датасета и установки пакетов в этом опыте не было.

Классы CIFAR3=cat,5=dog. В каждом классе первые4000 train-изображений ушли в обучение, последние1000 — в validation. Итог8000train,2000validation,2000из отдельного officialtest. Seed20261015; оригиналы разделены до зеркалирования, train_flip имеет те же метки, validation/test не аугментируются. Исходные IDs и SHA файлов сохранены в data/*.npz и dataset-manifest.json.

Стартовые unsupervised K200 фильтры скопированы из завершённого транспортного опыта ~/run/altai-objects/native-cuda/model_readout. Они обучались только на vehicle-train, не на cats/dogs и не на officialtest. Это переиспользование собственных локальных признаков, не внешний предобученный классификатор.

Сначала собраны18000 спайковых представлений(train8000+flip8000+val2000) через CUDA,chunk1000,jobs2. Обучен ridge baseline: floatvalidation до68,9%, integerbaseline68,3%. Проверены фиксированные count/sqrt/root-L2 кодировки, лучший integer69% приблизительно. Это недостаточно, поэтому обучен собственный MLP256 hidden:40 эпох,Adam,dropout0,15,L2регуляризация; checkpoint и ridge/readout квантование выбирались только поvalidation.

Первый MLP-экспорт имел ошибку масштаба у почти нулевых нейронов: пороги выходили заuint16, часть преобразований переполнялаint32. Этот runtime/head не развёрнут. adapt_head.py удалил71 отрицательный overflow-unit(нулевой в раннем evaluator), перемасштабировал32 слишком больших положительных порога, повторно обучил readout только поtrain и выбрал λ/квантование поvalidation. Получился валидный head-v2, проверенный реальным KNP; validation71,85% сохранилась. Затем модель зафиксирована и впервые оценена наofficialtest. После test веса/подбор гиперпараметров не менялись.

Исторический тренер сохранён как train_head_legacy.py. Для следующего опыта train_head.py исправлен: scale ограничен до int32 cast, учитываютсяuint16threshold/reset-bound, сохраняется float-checkpoint, новый каталог head-next. Проверен отдельный regression с почти нулевой колонкой; полное повторное обучение новой версией не запускалось и текущие метрики к нему не относятся.

Состояние, reset и арифметика

Старый объектный runner переносил остаточный заряд между изображениями. Новый detector frame20 вводит отрицательный reset−65535 наtick0, три дополнительных такта тишины,10 входных тактов4..13 и drain. Веса и bias ограничены, residual строго ниже reset. Входы сdelay1 успевают дойти до следующего изображения. Подсчёт включает все активные выходы, а не только drain.

Проверено: freshB, A→B→B, белый→B, чёрный→B дают одинаковые800 счётчиков; чёрный кадр даёт нулевые detectorcounts. CPU/GPU восемь изображений — exact.

Фиксированное кодирование root-L2: clip(round(2048*sqrt(count)/sqrt(sum(count))),0,640) с корректным нулевым случаем. L2-норма после округления не выше2063. К каждому hidden-нейрону прибывает один полный пакет входов иbias; он исполняет clip(floor(max(dot+bias,0)/threshold),0,64) в64 такта. Frame72: reset0,полныйпакет4,считаютсявыходы5..68. Остальные выходы игнорируются, перед следующим изображением residual принудительно обнуляется.

Reset для hidden доказан черезCauchy bound ceil(2063*norm(w))+abs(bias)+1; импульс разбит на целыеchunks≤65535. Проверяется2×bound<2^24. Все проверки весов/bias/reset используютint64 до сужения. Специальный повреждённыйINT_MIN отвергается, не вызывает signed-overflow.

Выходные нейроны threshold1,do_not_save=true,reset0. Знаковые веса двух нейронов противоположны; весь пакет иbiaschunks приходят в один такт. KNP сначала суммирует полный ток, затем применяетfloor/threshold. Максимальная кратность и сумма абсолютных воздействий ограничены; hostinteger-маржины используются только в offline-проверке, не в сервисном распознавании.

Проверки и ускорение сайта

checks/VERIFIED.json: detectorCPU/GPU exact, независимость от предшественников, readout0/±1 иmaxmultiplicity640 exact.

eval-v2-smoke/VERIFIED.json: hidden256 и обаoutput exactCPU/CUDA/reference на8validation; ещё один sequence-reset smoke. Smoke успешно завершён перед final. Впоследствии wrapper дополнен обязательным gate поsmokehash перед новымfinal, фиксациейSHA и повторной проверкой неизменности в конце.

deployment-checks/VERIFIED.json: дополнительно adversarialpacket с максимальным положительным направлением, выходы достигаютcap64; после негоzero/B/repeatedB дают точные referencecounts наCPU/CUDA. INT_MIN отвергается.

pets_worker.cpp сохраняет большой KNP-граф и GPU backend загруженными. На каждом запросе проходит тот же20-tickframe со сбросом. Шесть последовательных запросов, включаяwhite/black, побайтно совпали с обычным runner. Первый запуск≈5,69s создаёт граф, следующие≈0,0014–0,0047s вычисляют толькоdetectors. Server прогревает его доlisten, потому первый пользователь не ждёт первоначальную сборку графа.

Hidden/readout пока запускаются отдельными короткими процессами; это основная оставшаяся задержка около0,4s. Дальнейшее ускорение возможно их объединением/постоянным процессом с сохранением всех reset/reference gates.

API: до8MB и16MP, EXIF transpose,RGB,BILINEAR32×32, ограниченный набор форматов. До4 HTTP handlers,timeout15s для сокетов; единственный GPU lock берётся до чтения/декодирования фото. Параллельный запрос возвращает429; malformed400; subprocesstimeouts; SHA всех весов проверяются пристарте и каждомраспознавании. TempDirectory с пользовательской картинкой удаляется после ответа. Внешние команды и пользовательские пути не принимаются.

Проверены четыреAPIпримера, ихответы иобаoutputexact финальномуtestCSV; параллельные200/429, некорректныефайлы400. Браузерные проверки:24gallery,реальныйfilepickerupload,ожиданиеответа,защитаотstaleresponse,mobile390px безoverflow,JSerrors0. Визуально проверенdesktop screenshot; отсутствующие emoji заменены собственнымиSVGиконками. T3preview явно сообщилnoautomationhost, поэтому разрешёнfallbackChromiumCDP. Скриншоты иJSON находятся влокальныхартефактах.

Карта файлов и запуск

SSH: user@10.9.8.230, ключ ~/.ssh/id_ed25519_snw. Только по запросу пользователя.

  • Исходники станции: /home/user/KNP/pets-knp; локально /opt/neiro/experiments/pets-knp.
  • Runtime: /home/user/run/pets-knp; бинарники pets_infer, pets_hidden, pets_readout, pets_worker.
  • Frozen weights: detectors иhead-v2; head иreadout* — история, не текущая модель.
  • Head SHA256:1b5b8a716d19741cdd873713e60697a7adba26755dc90b3b08281d1a4b60e417.
  • Pipeline weights SHA256:41cbd3bc6a5bfeb17f8cac2575b26052ab3945a72b45956836c3ca3df6db200f.
  • Истина: final-summary.json, eval-v2-final/VERIFIED.json и перечисленные вышеproofs. ПофайловыеSHA моделей включены вsummary.
  • Сервис: server.py, текущий PID116676, workerPID116704; актуальность после этого снимка проверять черезserver.pid иps. Логи server.log, worker.log.
  • Страница: pets.html, сервер читает её сдиска; встарые страницы ничего не добавлялось.
  • Подробные командыrestart/stop/reproduction — pets-knp/README.md.

Команды выполненного опыта:

~/anvenv/bin/python ~/KNP/pets-knp/prepare.py
~/anvenv/bin/python ~/KNP/pets-knp/build.py
~/anvenv/bin/python ~/KNP/pets-knp/collect.py \
  ~/run/pets-knp/detectors ~/run/pets-knp/counts 1000 \
  --data ~/run/pets-knp/data --backend cuda --jobs 2
OPENBLAS_NUM_THREADS=8 ~/anvenv/bin/python ~/KNP/pets-knp/verify.py
# Baseline, кодировки, исходный MLP, затем adapt до реальных диапазонов:
OPENBLAS_NUM_THREADS=8 ~/anvenv/bin/python ~/KNP/pets-knp/train.py
OPENBLAS_NUM_THREADS=8 ~/anvenv/bin/python ~/KNP/pets-knp/tune_encoding.py
# Исторический запуск был файлом train_head.py, теперь его копия train_head_legacy.py.
OPENBLAS_NUM_THREADS=8 ~/anvenv/bin/python ~/KNP/pets-knp/adapt_head.py
OPENBLAS_NUM_THREADS=8 ~/anvenv/bin/python ~/KNP/pets-knp/evaluate.py --stage smoke
OPENBLAS_NUM_THREADS=8 ~/anvenv/bin/python ~/KNP/pets-knp/evaluate.py --stage final
OPENBLAS_NUM_THREADS=8 ~/anvenv/bin/python ~/KNP/pets-knp/verify_deployment.py
~/anvenv/bin/python ~/KNP/pets-knp/finalize.py
nohup ~/anvenv/bin/python ~/KNP/pets-knp/server.py \
  > ~/run/pets-knp/server.log 2>&1 < /dev/null &

Эти команды не нужно запускать повторно всуществующие каталоги: guards намеренно откажут. Для нового опыта выбратьновыепути, не удалять старые результаты.

Неудачи, обзор и сохранение

Помимо исправленного MLP-export, раннийtrain.py получилcircularreference приJSONserialization: выбранныйrow входилвсобственный списокcandidates. Исправлено копированиемrow, baselineвversionedreadout-v2. Раннийlocalpython отсутствовал, использованpython3; localnumpy отсутствовал, regressionзапущен в существующемremotevenv без установкипакетов. Не выдавать ранние невалидные прогоны за финальнуюмодель.

Применён astra-advisor, GPT-6 Astra high, всего3/3 консультации. Первая — архитектура readout/reset; вторая подтвердила допустимость KNPвычислений с явно описанным фиксированнымhostrouting. Третья нашла староеAPIподключение, недостаточныйadversarialresetfixture, int32overflowвguards, отсутствиеfinalgate инеограниченныйHTTPadmission. Всё перечисленное исправлено; новыеCPU/GPU/reference/admission/browserпроверки завершены. Другиеsubagents не запускались.

Отчёт, журнал иHANDOFF сохранены локально и перенесены вканонические пути станции. Полный набор исходников/весов/результатов/данных эксперимента — ~/run/pets-knp/model-and-proofs.tar.gz сSHA256; копия в/opt/neiro/reports/pets-knp-artifacts. Все локальные отчёты дополнительно синхронизированы в/home/user/KNP/reports/imported-neiro-2026-10-15 соSHA каждого файла; окончательная истина IMPORT-VERIFIED.json илокальныйreport-transfer-status.json.

KNPбиблиотеки, старые MNIST/vehicleмодели и8080/8081 не менялись. Установок, системногоautostart,commit/push не было. Новое обучение/финальные тесты завершены; в фоне оставлены толькопользовательскиеwebсервисы ипостоянныйpetworker.

Что делать дальше

Главное ограничение — качество признаков инизкое разрешение, а не скорость GPU. Для улучшения: собственные K400/800детекторы поcats/dogstrain, большепространственныхобластей/слоёв, обучение сразубезошибочномуэкспорту, болеекачественныйдатасетфотографий сновымheld-outtest. Подбиратьтолькопоvalidation, текущийofficialtestбольше не использоватькакнезависимыйпринастройке. ДляGoldenModel отдельно заменитьповторныеиндексы на аппаратно допустимыйкод, соблюсти палитры/диапазоны иповторить численнуюпроверку.

Пакет для восстановления

Архив model-and-proofs.tar.gz:61 517 274байта,153файла, SHA256 2cfefd3c2617aef48e2bfaefa672311d89fb88d657b42354eb77101d66718b55. Внутри source,валидныйhead-v2 иисторическийhead,детекторы,готовыесчётчикиобучения,train/val/testNPZсsourceIDs,пофайловыеbuildfingerprints,сырыепредсказания/counts ипроверочныеJSON,браузерныескриншоты. ЗависимостиKNP/CUDAбиблиотек не включены: они уже настанции иописаны вLinuxGPUотчёте. Сам отчёт в архиве — снимок доэтогоприложения, актуальныйканоническийотчёт сохраняетсяотдельно.

Финальное сохранение подтверждено: архив локально проверен (SHA256 совпал,153 regular members без небезопасных путей); все261 файла отчётов/журналов/контекста импортированы настанцию с пофайловымSHA256. Послеэтойотметкисинхронизацияповторяетсядляобновлённыхтекстов.