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

131 lines
22 KiB
Markdown
Raw Permalink 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.

# 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`.
Команды выполненного опыта:
```bash
~/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. Послеэтойотметкисинхронизацияповторяетсядляобновлённыхтекстов.