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