Перейти к основному содержимому
Accent

Accent / Администратору

Руководство администратора

Установка на CPU и GPU, контракт API, подключение к Monolit, резервное копирование, мониторинг.

Введение

Accent — on-prem сервис AI-триажа уязвимостей. Он поставляется тремя контейнерами (API, модель, брокер задач) и поднимается Docker Compose. Это руководство описывает установку, профили мощности, обновление, наблюдение и типичные отказы.

До ребрендинга сервис назывался Triage LLM (в файлах модели — AI-TRIAGE): это то же изделие. Каталог установки по умолчанию — accent/, проект Compose — sdlplatform_accent. Установки, сделанные под прежним именем (triage_llm/.env.triage_llm, проект sdlplatform_triage_llm), скрипт установки распознаёт сам и обновляет под прежними именами — переносить их не нужно.

Инструкция по установке

Требования к системе​

Операционная система: Linux (Ubuntu 24.04.1 LTS или выше).
ПО: Docker Engine 20.10 или новее, Docker Compose v2.
Сеть: доступ к registry поставщика на время установки и обновления.
Набор инструкций процессора: AVX2 и FMA. На виртуальной машине тип процессора задаётся как x86-64-v3 или выше, иначе гость их не увидит. Проверка внутри гостя:

grep -m1 flags /proc/cpuinfo | grep -o avx2

CPU​

РежимПроцессорПамятьСвободно на дискеОриентир /analyze
Минимум (cpu4)4 vCPU16 ГиБ40 ГиБ2–4 мин и дольше
Практический (cpu8)8 vCPU16 ГиБ40 ГиБ1–2 мин
Рекомендуемый (cpu16)12–16 vCPU16–32 ГиБ60 ГиБ45–60 с

На хостах с 16 ГиБ ОЗУ обязателен --cache-ram 0 у модели (так настроено в профилях). Иначе кеш промпта уходит в swap, и запросы зависают.

Не ставьте:

  • меньше 4 vCPU;
  • меньше 12–14 ГиБ ОЗУ под полную модель Q8;
  • несколько параллельных слотов модели на 4 CPU / 16 ГиБ;
  • несколько воркеров API при одном слоте модели на минимуме.

GPU (опционально)​

Скрипт install.sh раскатывает только CPU. GPU собирается отдельным составом compose.

РежимСвободная VRAMХостОриентир
Минимум≥ 16 ГиБ, CUDA4 vCPU / 16 ГиБ15–40 с
Практический≥ 24 ГиБ8 vCPU / 32 ГиБ8–25 с

Нужны драйвер NVIDIA и NVIDIA Container Toolkit. На 16 ГиБ держите один слот модели и контекст не больше 8192.

Цифры времени — ориентир, не SLA. При очереди хвост длиннее.

Установка в Docker (Docker Compose)​

Установку и обновление выполняет один скрипт. Запускайте его из каталога, в котором должен появиться accent/:

curl -fsSL -o install.sh https://sdlplatform.ru/accent/install.sh && bash install.sh

Без меню:

REGISTRY_USER=... REGISTRY_PASSWORD=... \
bash install.sh --tag 2.0.2 --profile cpu16 --port 13001 --yes
ПараметрНазначение
--tagВерсия образов в registry, например 2.0.2
--profilecpu4, cpu8 или cpu16 (по умолчанию — по числу ядер хоста: от 12 — cpu16, от 8 — cpu8, иначе cpu4)
--portПорт хоста на API (по умолчанию 13001)
--registryХост registry (по умолчанию registry.sdlplatform.ru)
--dirКаталог установки (по умолчанию accent)
--yesНе задавать вопросы
--skip-host-checkПропустить проверку CPU / ОЗУ / диска / AVX2

Переменные поставки: ACCENT_BASE_URL (по умолчанию https://sdlplatform.ru/accent), REGISTRY_USER и REGISTRY_PASSWORD для входа в registry без приглашения (с --yes обязательны, если docker login не выполнен заранее).

Скрипт различает установку и обновление по файлу accent/.env.accent (у установок до ребрендинга — triage_llm/.env.triage_llm).

При установке скрипт:

  1. Проверяет Docker и Docker Compose. Если Docker не найден — предлагает поставить его с get.docker.com.
  2. Запрашивает адрес registry и выполняет docker login.
  3. Проверяет, что тег api:<версия> есть в registry (до трёх попыток ввода).
  4. Спрашивает профиль CPU и порт API.
  5. Проверяет хост: CPU, ОЗУ, диск и наборы инструкций AVX2/FMA (проверка встроена в скрипт, пороги зависят от профиля). При отказе спрашивает, продолжать ли; с --yes останавливается.
  6. Скачивает docker-compose.yml версии TAG с https://sdlplatform.ru/accent/<TAG>/. Если версионного файла нет, берёт последний опубликованный.
  7. Пишет accent/.env.accent (профиль CPU, ALLOW_SYNC_ANALYZE=0, Redis).
  8. Загружает образы и поднимает проект sdlplatform_accent.

Копия install.sh сохраняется в accent/.

При установке опечатка в TAG остановит скрипт только если манифеста нет в registry. Сверяйте версию с поставщиком до запуска.

Скрипт вызывает docker через sudo. Учётная запись должна иметь право повышения привилегий.

Сервисы поставки:

  • api — HTTP API, воркеры задач, разбор ответа модели (порт хоста → 13001);
  • llama — локальный инференс (внутри сети, с хоста по умолчанию проброшен 13080);
  • redis — очередь задач (внутри сети, с хоста по умолчанию проброшен 6379).

Порты модели и Redis наружу не публикуйте. Снаружи нужен только API, лучше через внутренний прокси.

После установки:

API: http://<host>:13001
Прод-контракт: POST /analyze/async | POST /analyze/sarif/async + GET /jobs/{id}

Проверка:

curl -sS "http://127.0.0.1:13001/health"

Совместная установка с Monolit​

Скрипт https://sdlplatform.ru/sdlplatform/install.sh предлагает меню продуктов: Monolit и Accent. Для пункта «Accent» он скачивает и запускает тот же https://sdlplatform.ru/accent/install.sh. Номера вводятся через пробел, если нужны оба. Accent поднимается отдельным составом и подключается в Monolit как AI-интеграция по URL http://<хост>:13001.

Обновление Accent​

Запускайте скрипт из того же каталога, что и установку — из родительского по отношению к accent/:

cd /путь/где/лежит/accent
bash accent/install.sh

Скрипт находит .env.accent, показывает текущую версию и спрашивает новую. Пустой ввод оставляет версию и перекачивает образы.

Если запустить скрипт изнутри accent/, он не увидит ожидаемый путь к .env так, как при штатном запуске из родителя. Обновляйте из каталога установки.

При смене TAG прежний .env.accent копируется в .env.accent.bak.<метка>; остальные значения файла не меняются. Compose скачивается заново; при ошибке скачивания возвращается предыдущий файл.

У установок до ребрендинга скрипт при первом обновлении переключает REGISTRY с проекта triage_llm на accent (все версии образов перенесены туда). Учётная запись registry выдаётся на проект: если docker login к новому проекту не проходит, запросите учётные данные у поставщика.

Смена профиля CPU при обновлении: bash install.sh --profile cpu8 — файл .env.accent перегенерируется под новый профиль, прежний остаётся в .bak. Если в файле нет PROFILE (установка старым скриптом), профиль будет предложен при первом обновлении.

Неинтерактивно:

bash install.sh --tag 2.0.2 --yes

Профили CPU​

ПрофильКогда выбирать
cpu4Стенд, 4 ядра. Долго, один слот, очередь задач 32
cpu8Рабочий минимум
cpu16Продакшен на CPU

Правило: число слотов модели = число воркеров задач = лимит одновременного инференса. На CPU это единица. Не поднимайте параллелизм модели на четырёх ядрах.

Число потоков модели задают переменные LLAMA_THREADS и LLAMA_THREADS_BATCH в файле профиля: 4 в cpu4, 8 в cpu8, 12 в cpu16. Если ядер больше, чем задано в профиле, приведите оба значения к числу ядер и перезапустите сервис:

nproc
sed -i 's/^LLAMA_THREADS=.*/LLAMA_THREADS=12/; s/^LLAMA_THREADS_BATCH=.*/LLAMA_THREADS_BATCH=12/' profiles/cpu16.env
docker compose --env-file profiles/cpu16.env -p triage-prod up -d --force-recreate

Установка на GPU​

Положите полный файл весов Q8 (~7.6–8 ГиБ) на хост. Обрезанный файл (~1.8 ГиБ) модель не загрузит.

ls -lh model/ai-triage.Q8_0.gguf

docker compose \
-f docker-compose.yml \
-f docker-compose.override.yml \
-f docker-compose.gpu.yml \
--env-file profiles/gpu.env \
-p triage-gpu up -d

Проверьте карту:

docker run --rm --gpus '"device=0"' nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi

На 16 ГиБ VRAM оставьте один слот. Несколько слотов — от 24 ГиБ.

Проверка хоста без установки​

MIN_CPUS=8 MIN_RAM_GIB=16 MIN_DISK_GIB=60 \
./scripts/check_host_requirements.sh

Пороги по умолчанию: 4 CPU, 16 ГиБ ОЗУ, 40 ГиБ диска (смотрит /var/lib/docker или /). Скрипт установки для cpu16 поднимает минимум до 8 CPU и 60 ГиБ диска.

Состав и сеть

Наружу публикуйте только порт API. Модель и Redis оставьте во внутренней сети compose; если поставка пробросила 13080 и 6379 на хост, закройте их межсетевым экраном.

API в поставке без аутентификации. Доступ должен быть только из контура Monolit, CI и рабочих мест аналитиков.

Переменные окружения

Файл установки: accent/.env.accent.

Поставка​

ПеременнаяСмысл
TAGВерсия образов
REGISTRYПрефикс образов, например registry.sdlplatform.ru/accent/ (до ребрендинга — …/triage_llm/; скрипт обновления переключает сам)
PORTПорт хоста → API
PROFILEcpu4 / cpu8 / cpu16

Контракт API​

ПеременнаяЗначение в поставкеСмысл
ALLOW_SYNC_ANALYZE01 включает синхронные /analyze и /analyze/sarif (только отладка)
SARIF_MAX_RESULTS20Потолок страницы SARIF
JOB_BACKENDredisБез Redis (memory) очередь живёт только в процессе API
REDIS_URLredis://redis:6379/0Брокер
JOB_QUEUE_MAX64 (на cpu4 — 32)Максимум задач в работе и в очереди
JOB_TTL_SECONDS7200Срок хранения задачи
JOB_WORKERS1 на CPUДолжно совпадать со слотами модели

Инференс​

ПеременнаяСмысл
LLAMA_API_URLАдрес chat completions модели (по умолчанию внутри compose)
LLAMA_TIMEOUTТаймаут чтения ответа модели (на CPU — 900 с)
LLAMA_CONNECT_TIMEOUTКороткий таймаут соединения; если модели нет, слот не держится минутами
LLAMA_MAX_TOKENSДлина ответа (CPU — 512, GPU — 768)
PROMPT_FEW_SHOTnone на CPU, compact на GPU
ASCII_REPROMPT_THRESHOLDПорог доли латиницы для повторного запроса; 1.0 — выключено
MAX_CONCURRENT_INFERENCEСлоты инференса, равны --parallel модели
INFERENCE_QUEUE_MAXСколько запросов ждут слот
INFERENCE_QUEUE_TIMEOUT0 — ждать слот без ложного 503 по времени
RETRY_AFTER_SECONDSМинимум для заголовка Retry-After
CIRCUIT_FAILURE_THRESHOLD / CIRCUIT_OPEN_SECONDSПосле серии ошибок соединения с моделью — быстрый 503 и пауза
UVICORN_WORKERS1 при одном слоте модели
LOAD_UNIXCODER0 — не грузить дополнительную модель уверенности (~2 ГиБ)

После правки .env.accent:

cd accent
sudo docker compose --env-file .env.accent -p sdlplatform_accent up -d

REST API: служебные запросы

База: http://<хост>:13001. Пользовательский контракт — в Руководстве пользователя.

Проверка состояния​

curl -sS "http://<хост>:13001/health"

Ответ всегда 200 и "status": "ok", пока процесс API жив. Нагрузка и недоступность модели не валят пробу — смотрите вложенные поля.

УзелНа что смотреть
inference.in_use / waitersСлот модели и очередь на слот
jobs.queued / jobs.runningПринятые асинхронные задачи
jobs.backendredis или memory
llama.circuitРазомкнута ли защита от недоступной модели
metrics.http_503_ratioДоля отказов по перегрузке
allow_sync_analyzeВключён ли опасный sync-режим
sarif_max_resultsПотолок страницы

Эндпоинт подходит для пробы Kubernetes и внешнего мониторинга. Формата Prometheus сервис не отдаёт: загрузку CPU, ОЗУ и диска снимайте с хоста (cAdvisor, node_exporter).

Очередь и 503​

СитуацияОтвет
Слот свободенЗадача идёт в модель
Слоты заняты, в очереди есть местоЗадача ждёт
Очередь полна503 + Retry-After, работа не принята
Модель недоступна, защита разомкнута503 + Retry-After, слот не удерживается
Модель сама вернула 503Пробрасывается клиенту

Клиенту: прочитать Retry-After, подождать, повторить то же тело. Шторм повторов ухудшает очередь.

Подключение к Monolit​

  1. Убедитесь, что GET http://<хост-accent>:13001/health доступен с хоста Monolit.
  2. В Monolit: Инструменты → Интеграция AI — укажите URL Accent.
  3. Привяжите интеграцию к приложениям.

Рекомендуемый канал платформы — страницы POST /analyze/sarif/async и опрос GET /jobs/{id}. Синхронный POST /analyze в поставке Accent закрыт: при старом клиенте платформы включение sync на проде не чинит обрывы на балансировщике, а возвращает длинные запросы.

Резервное копирование и восстановление

Accent не хранит реестр уязвимостей. Сохранять нужно конфигурацию поставки. Вердикты должны жить у клиента (Monolit, своя БД).

Что копировать​

  • accent/.env.accent
  • accent/docker-compose.yml
  • копию install.sh, если меняли вручную
tar -czvf /backups/accent_config_$(date +%F).tar.gz \
/путь/к/accent/.env.accent \
/путь/к/accent/docker-compose.yml

Redis в поставке запущен без записи на диск: перезапуск брокера теряет незавершённые задачи. Это ожидаемо. Не используйте Redis Accent как архив.

Восстановление конфигурации​

Верните файлы в каталог установки и поднимите состав:

cd /путь/где/лежит/accent
sudo docker compose --env-file accent/.env.accent \
-p sdlplatform_accent -f accent/docker-compose.yml up -d

Либо снова запустите install.sh с тем же TAG.

Мониторинг и диагностика

Журналы​

cd /путь/где/лежит/accent
sudo docker compose --env-file accent/.env.accent \
-p sdlplatform_accent logs -f

По сервисам:

sudo docker compose --env-file accent/.env.accent \
-p sdlplatform_accent logs -f api
sudo docker compose --env-file accent/.env.accent \
-p sdlplatform_accent logs -f llama
sudo docker compose --env-file accent/.env.accent \
-p sdlplatform_accent logs -f redis

В журнале API ищите: 503 queue_full, 503 queue_timeout, 503 circuit_open, slot_wait_s=, job_retry.

Сбор журналов для поддержки​

sudo docker compose --env-file accent/.env.accent \
-p sdlplatform_accent logs --tail=2000 > accent-all.log 2>&1

Имена контейнеров зависят от имени проекта. Список: docker ps --format '{{.Names}}'.

Типичные отказы​

СимптомЧто проверить
Контейнер llama не становится healthyОбъём файла GGUF, ОЗУ, docker logs llama, не обрезан ли вес
API не стартуетЗависимость от healthy llama и redis; docker compose ps
Клиенты получают 403 на /analyzeШтатно. Нужен async-контракт
Массовые 503JOB_QUEUE_MAX, inference.waiters, не бьёт ли клиент пачкой sync/ретраев
Задачи пропадают после рестарта APIДолжен быть JOB_BACKEND=redis; при memory очередь в RAM
404 на старой задачеИстёк JOB_TTL_SECONDS
Swap и таймауты на 16 ГиБВ команде llama должен быть --cache-ram 0
OOM на GPUСлишком большой --parallel / --ctx-size для карты

Обновления и патчи

Обновление образов — через install.sh, см. Обновление Accent. Сборки на площадке заказчика нет.

Перезапуск без смены версии:

cd /путь/где/лежит/accent
sudo docker compose --env-file accent/.env.accent \
-p sdlplatform_accent restart api

После обновления:

sudo docker compose --env-file accent/.env.accent \
-p sdlplatform_accent ps
curl -sS "http://127.0.0.1:13001/health"

Обновляйте пакеты хоста:

sudo apt update && sudo apt upgrade -y

Безопасность

  • Откройте снаружи только SSH и, если нужно, порт API во внутренней сети. Порты модели и Redis закройте.
  • Не включайте ALLOW_SYNC_ANALYZE на контуре за балансировщиком с коротким таймаутом.
  • Не публикуйте /docs и API в интернет без дополнительного контроля доступа (SSO-прокси, сеть, VPN).
  • Исходный код находок попадает в журнал только если вы сами пишете его в отладке; не включайте подробный дамп тел запросов на проде.

Пример UFW:

sudo ufw allow OpenSSH
sudo ufw allow from <сеть-монолита> to any port 13001 proto tcp
sudo ufw enable

Часто задаваемые вопросы

Техническая поддержка

В случае проблем напишите в поддержку: support@cybear.ru. Приложите версию из .env.accent (TAG, PROFILE), вывод /health и журналы api / llama.

Поддержка Cybear

Не нашли ответ в документе?

Техподдержка: support@cybear.ru · +7 (495) 790-66-88, добавочный 3.

Написать в поддержку