# Стенд моделей: выбранная конфигурация Эти команды предназначены для будущего Linux-сервера. На пользовательском компьютере модели не скачивались и серверы не запускались. Полный backend, gateway и HA conversation adapter ещё предстоит реализовать по основному отчёту. Платформа актуальной сметы: Ryzen 7 5700X, Radeon AI PRO R9700 32 ГБ, DDR4 64 ГБ, SSD 2 ТБ. Исходная матрица: Ubuntu 24.04.3 LTS с HWE 6.14 и ROCm 7.2. Перед сборкой проверить hipconfig и rocminfo; GPU_TARGETS при необходимости берётся из фактического rocminfo. Этот стенд ещё не выполнен на оборудовании. ## Закреплённые исходники и веса llama.cpp commit: `7049ff0cbeb1f5ead231de4522af6b75d8d773c0`. Модели и размер каждого файла — в `model-manifest.json`. Приведённые параметры соответствуют прочитанным server docs этой версии; исполняемость на поставленном драйвере AMD/ROCm подтверждается стендом. ```bash git clone https://github.com/ggml-org/llama.cpp /opt/jarvis/llama.cpp cd /opt/jarvis/llama.cpp git checkout 7049ff0cbeb1f5ead231de4522af6b75d8d773c0 HIPCXX="$(hipconfig -l)/clang" HIP_PATH="$(hipconfig -R)" \ cmake -S . -B build -DGGML_HIP=ON -DCMAKE_BUILD_TYPE=Release cmake --build build --config Release -j 8 --target llama-server llama-bench ``` Скачать заранее через Hugging Face CLI; здесь `.gguf` — данные, не команды из модели: ```bash hf download Qwen/Qwen3-14B-GGUF Qwen3-14B-Q4_K_M.gguf \ --revision 530227a7d994db8eca5ab5ced2fb692b614357fd --local-dir /srv/jarvis/models/text hf download Qwen/Qwen3-VL-8B-Instruct-GGUF \ Qwen3VL-8B-Instruct-Q4_K_M.gguf mmproj-Qwen3VL-8B-Instruct-F16.gguf \ --revision f982a07559d4a2f6c8744d840bf6fccab30eea96 --local-dir /srv/jarvis/models/vision ``` ## Два процесса llama-server Для текста `ctx-size=16384` — **общий бюджет двух slots**, 8192 на slot, не 16384 на каждый диалог. Дополнительный явный per-slot limit защищает от слишком большого prompt. Запускать как два независимых systemd services, не в одной блокирующей shell-команде: ```bash /opt/jarvis/llama.cpp/build/bin/llama-server \ -m /srv/jarvis/models/text/Qwen3-14B-Q4_K_M.gguf \ --host 127.0.0.1 --port 8081 -ngl 99 \ --ctx-size 16384 --parallel 2 --kv-unified-per-slot 8192 \ --cache-type-k f16 --cache-type-v f16 --flash-attn on \ --batch-size 512 --ubatch-size 128 --jinja \ --chat-template-kwargs '{"enable_thinking":false}' ``` ```bash /opt/jarvis/llama.cpp/build/bin/llama-server \ -m /srv/jarvis/models/vision/Qwen3VL-8B-Instruct-Q4_K_M.gguf \ --mmproj /srv/jarvis/models/vision/mmproj-Qwen3VL-8B-Instruct-F16.gguf \ --host 127.0.0.1 --port 8082 -ngl 99 \ --ctx-size 8192 --parallel 1 --image-max-tokens 1536 \ --cache-type-k f16 --cache-type-v f16 --flash-attn on \ --batch-size 256 --ubatch-size 64 --jinja ``` Отключение thinking происходит chat template параметром, а не скрытием `` в интерфейсе. Backend ограничивает вход целиком (system, tools, история, изображения, output) 8192 токенами; после нескольких turns история сжимается/сбрасывается. Лимит output в запросе: tools 128, диалог 256, vision 512. Формат observations/tool arguments проверяется Pydantic/JSON Schema; невалидный вывод не исполняется. Нужно подтвердить по startup log, что веса, KV и mmproj действительно на GPU. `-ngl 99` задаёт цель offload, но лог и `amd-smi` остаются критерием. Если auto-fit уменьшил контекст или offload, тест конфигурации не пройден. KV/runtime память снимается после прогрева двух slots и максимального image request, а не сразу после старта пустого процесса. ## Речь Собрать закреплённый для стенда `ggml-org/whisper.cpp` с `GGML_HIP=ON`; точный commit записать после проверки совместимости (здесь он не выдуман). Файл `ggml-large-v3-turbo-q5_0.bin` у `ggerganov/whisper.cpp` имеет 574041195 байт на дату проверки. ```bash whisper-server -m /srv/jarvis/models/speech/ggml-large-v3-turbo-q5_0.bin \ --host 127.0.0.1 --port 8910 --language ru ``` Мост `ser/wyoming-whisper-api-client`: `--uri tcp://0.0.0.0:10300 --api http://127.0.0.1:8910/inference`. Firewall открывает Wyoming только HA-контроллеру. Ручные запросы и тесты language ru выполняются до включения Assist. Сначала проверить эти аргументы по `whisper-server --help` поставленной версии. Piper через `OHF-Voice/wyoming-piper`: голос `ru_RU-dmitri-medium`, порт 10200, CPU. Первый запуск скачивает `.onnx`/`.json`; затем запретить неожиданное скачивание новых моделей в production. Wyoming-интеграция HA указывает на 10300/10200 этого сервера. ## Сервисы и данные | Сервис | Где | Доступ | |---|---|---| | Home Assistant | N100, HA OS | LAN/app, remote только VPN | | MQTT/Zigbee2MQTT | HA OS add-ons | IoT ACL; без anonymous | | conversation adapter | HA custom integration | Assist → authenticated backend | | action gateway | HA OS local add-on | GPU backend → конечные разрешённые методы; HA token только здесь | | jarvis-backend | ИИ-сервер, systemd | HA adapter/планшет → HTTPS; llama API localhost | | text / vision / whisper | ИИ-сервер, systemd | localhost; только backend/bridge | | Piper / Wyoming bridge | ИИ-сервер | только HA controller | | capture service | ИИ-сервер | приём отдельных изображений по API; оборудование получения изображений здесь не подбирается | | SQLite | `/srv/jarvis/data` | один writer, WAL, FTS5, encrypted backup | Gateway методы в версии 1: `get_state`, `run_scene`, `kettle_heat`, `vacuum_room`, `tv_control`, `laundry_program`, `laundry_start`, `request_unlock`. Бытовая модель не получает `laundry_program/start` напрямую: их вызывает state machine после проверки партии. Фактические HA entity_id и service names не заполнены, пока не получена диагностика приборов. Permit laundry: `permit_id, machine_id, batch_id, batch_version, program_fingerprint, evidence_ids, expires_at, consumed_at`. В БД транзакция compare-and-set; одно применение, срок до 60 секунд. Неизвестное состояние, новый предмет, открытие двери/кожуха, reboot или изменение программы аннулируют permit. Создать permit может только движок правил с операторской сверкой; свободный текст модели не является доказательством. ## Что измерить 1. `llama-bench` для text и vision отдельно: prompt 512/2048, decode 64/128; затем end-to-end Assist. 2. Два диалога по 8192 context + VLM два image/crop + STT одновременно; точный набор requests фиксируется. 3. Peak VRAM ≤26 GiB и отсутствие CPU offload/OOM; точные показатели GPU/NVML в протоколе. 4. p95 реакции ≤5 секунд обычно и ≤8 секунд в смешанной нагрузке; vision ≤10 секунд. Проектные цели не считать выполненными до измерения. 5. Отдельно реальный readback каждого устройства, delayed cloud state, запрет повторной команды при UNKNOWN. 6. ASKO после двери, reboot, Remote Start expiry, невалидной программы/партии и отказа облака. 7. Сохранность ручного управления и базовых HA-сценариев при отключённом ИИ. Не принимать отдельную скорость tokens/s вместо этих испытаний. Нагрузочные тесты не выполнялись в текущем workspace: в нём нет выбранной GPU и подключённых приборов.