Files
vidconf/docs/architecture/adr/004-ai-tier-matrix.md

115 lines
8.5 KiB
Markdown
Raw 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.
# ADR-004. Матрица уровней AI (min/medium/max): модели, кванты, железо, параметры генерации
## Статус
ACCEPTED
## Контекст
Продукту нужны три уровня качества AI-обработки (`min`/`medium`/`max`,
`AiLevel` в `backend/core/plugins/config.py`) для пресетов инсталлятора 35.
Ограничения: только локальные модели на всех уровнях (без внешних API);
промпты `workers/summarizer/prompts/` едины и не меняются между уровнями —
качество наращивается размером модели, а не правкой промптов. Ранний опыт с
Qwen ~3B показал, что модель на пределе инструктивной сложности: reduce
упирался в `max_tokens=1024`, отсюда per-tier лимиты (reduce ≥1536); часовой
транскрипт на CPU ≈ 6,5 мин — ориентир для уровня «min».
Актуальное на момент решения поколение моделей — **Qwen3.5**: dense
0.8B/2B/4B/9B («Small», thinking ВЫКЛЮЧЕН по умолчанию), dense 27B и MoE
35B-A3B (мультимодальные, thinking ВКЛЮЧЁН по умолчанию, отключается
`chat_template_kwargs: {"enable_thinking": false}`), крупнее — 122B-A10B,
397B-A17B. Инференс поддержан llama.cpp (llama-server,
`--chat-template-kwargs`), GGUF-кванты публикуются Qwen и Unsloth.
Кандидаты Qwen3-4B/8B/14B/32B (предыдущее поколение) отклонены в пользу
более нового поколения при том же рантайме.
faster-whisper: GPU через CTranslate2 — `WhisperModel(..., device="cuda",
compute_type="float16")` (вариант `int8_float16` для экономии VRAM); нужны
cuBLAS/cuDNN 9 для CUDA 12 (`pip install nvidia-cublas-cu12
nvidia-cudnn-cu12==9.*` + `LD_LIBRARY_PATH`) и nvidia-container-toolkit.
llama.cpp: официальные CUDA-образы `ghcr.io/ggml-org/llama.cpp:server-cuda`
(CUDA 12) / `server-cuda13`; offload — `--n-gpu-layers` /
`LLAMA_ARG_N_GPU_LAYERS`.
## Решение
### Матрица уровней
| Уровень | Транскрибация | Суммаризация (LLM) | Режим |
|---|---|---|---|
| **min** | faster-whisper `small`, CPU, `int8` (~0,5 ГБ весов) | **Qwen3.5-4B**, GGUF Q4_K_M ≈ 2,52,8 ГБ, llama.cpp CPU | thinking выключен по умолчанию (семейство Small) |
| **medium** | faster-whisper `medium` (~1,5 ГБ): CPU `int8`; при GPU — `cuda`/`float16` (VRAM ~23 ГБ) | **Qwen3.5-9B**, GGUF Q4_K_M ≈ 6,2 ГиБ, llama.cpp CPU или GPU (полный offload от ~8 ГБ VRAM) | thinking выключен по умолчанию |
| **max** | faster-whisper `large-v3` (~3 ГБ), только GPU, `cuda`/`float16` (VRAM ~4,55 ГБ) | **Qwen3.5-35B-A3B** (MoE, ~3B активных), GGUF Q4_K_M ≈ 2022 ГБ, llama.cpp GPU (полный offload от ~24 ГБ VRAM; допустим гибрид GPU+RAM за счёт скорости) | thinking ПРИНУДИТЕЛЬНО отключается: `LLAMA_ARG_CHAT_TEMPLATE_KWARGS='{"enable_thinking":false}'` на llama-server |
Замена более раннего варианта (Qwen2.5-3B → Qwen3.5-4B на min) — сопоставимый
размер/скорость, новее поколение, лучшее следование инструкциям; промпты
не трогаем — они едины для всех уровней. Точные имена GGUF-файлов фиксируются в
`deploy/llm/download-model.sh` при реализации (репозитории `Qwen/…-GGUF` /
`unsloth/…-GGUF`); размеры выше — ориентиры для инсталлятора.
### Per-tier параметры генерации (промпты неизменны)
| Параметр | min | medium | max |
|---|---|---|---|
| temperature | 0.2 | 0.2 | 0.2 |
| max_tokens (map) | 1024 | 1024 | 1536 |
| max_tokens (reduce) | 1536 | 2048 | 2560 |
| CTX llama-server | 16384 | 16384 | 16384 |
temperature 0.2 — осознанное отступление от рекомендаций карточки модели
(0.71.0 для чата): суммаризация экстрактивная, нужна детерминированность.
Раздельные лимиты map/reduce требуют параметров
`max_tokens_map`/`max_tokens_reduce` в плагине `QwenLocal` (options, контракт
`Summarizer` не меняется).
### Требования железа (таблица инсталлятора и детекта админки)
| Пресет | CPU | RAM | GPU (VRAM) | Диск | Модели на диске |
|---|---|---|---|---|---|
| 1 MVP / 2 +чат | 4 vCPU | 8 ГБ | — | 40 ГБ | — |
| 3 +AI min | 8 vCPU | 16 ГБ | — | 100 ГБ | ~3,5 ГБ |
| 4 +AI medium | 1216 vCPU | 32 ГБ | опционально ≥8 ГБ (ускорение) | 150 ГБ | ~8 ГБ |
| 5 +AI max | 16+ vCPU | 64 ГБ | ОБЯЗАТЕЛЬНО NVIDIA ≥16 ГБ (рекоменд. 24 ГБ) | 250 ГБ | ~25 ГБ |
Детект: железо определяет `install.sh` (nproc, free, nvidia-smi) и пишет в
`.env` (`HW_CPUS`, `HW_RAM_MB`, `HW_GPU_NAME`, `HW_VRAM_MB`); backend-детект
доступности уровней (`services/ai_levels.py`) читает эти переменные плюс
факт наличия скачанных моделей на томах — без зависимости от torch/nvidia-smi
внутри контейнера.
## Последствия
- **Плюс:** переключение уровней — только конфиг/админка; ядро и промпты
неизменны; min остаётся CPU-only на всех уровнях.
- **Плюс:** thinking-режим гарантированно выключен на всех уровнях
(Small — по умолчанию, MoE — флагом сервера), формат вывода промптов
сохраняется.
- **Минус:** Qwen3.5 требует свежий llama.cpp — тег образа
`ghcr.io/ggml-org/llama.cpp:server[-cuda]` фиксируется по digest в compose;
риск несовместимости старых GGUF (арх. `qwen35`) закрывается скачиванием
только официальных квантов.
- **Минус:** GPU-стек (nvidia-container-toolkit, cuDNN 9) — новая
эксплуатационная зависимость пресетов 4 (опция) и 5 (обязательно).
- **Нейтрально:** 27B dense отклонён для max в пользу MoE 35B-A3B: при
сравнимом качестве ~3B активных параметров дают кратно большую скорость
на том же VRAM-бюджете.
## Аддендум
Флаг `LLAMA_ARG_CHAT_TEMPLATE_KWARGS='{"enable_thinking":false}'`, названный
выше для принудительного отключения thinking на уровне `max`, в актуальной
llama.cpp имеет более простой равнозначный эквивалент: `LLAMA_ARG_REASONING=off`
(`--reasoning off`) — по `common/arg.cpp` проекта llama.cpp флаг выставляет
`enable_thinking=false` в шаблоне чата сервера тем же эффектом, без
необходимости передавать сырой JSON `chat_template_kwargs` через переменную
окружения. Реализация (`deploy/docker-compose.yml`) использует
`LLAMA_ARG_REASONING=off`; сама матрица уровней и решение (thinking отключён на
`max`) не меняются.
## Ссылки
- ADR-001 (динамические конференции).
- `backend/core/plugins/{faster_whisper,qwen_local}.py`,
`backend/services/ai_levels.py`, `config/plugins.yaml` — реализация.
- unsloth.ai/docs/models/qwen3.5 (линейка, режимы, требования памяти),
huggingface.co/Qwen/Qwen3.5-35B-A3B (enable_thinking, Q4_K_M 9B = 6,22 ГиБ),
github.com/SYSTRAN/faster-whisper (CUDA/CTranslate2),
github.com/ggml-org/llama.cpp docs/docker.md (server-cuda).