131 lines
22 KiB
Markdown
131 lines
22 KiB
Markdown
# 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. Послеэтойотметкисинхронизацияповторяетсядляобновлённыхтекстов.
|