AZykov (обсуждение | вклад) Новая страница: «= Установка и настройка робота Эра (SecondChain) = Пошаговая инструкция по развёртыванию голосового робота на проектном домене. __TOC__ == 0. Подготовка сервера == === Установка Docker === <syntaxhighlight lang="bash"> apt install ca-certificates curl install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ub...» Метка: визуальный редактор отключён |
AZykov (обсуждение | вклад) Нет описания правки |
||
| Строка 1: | Строка 1: | ||
= Установка и настройка робота Эра (SecondChain) = | = Установка и настройка голосового робота Эра (SecondChain) = | ||
Пошаговая инструкция по развёртыванию голосового робота на | Пошаговая инструкция по развёртыванию голосового робота. Процесс разбит на четыре этапа: | ||
# '''[[#Этап 1. Подготовка|Подготовка]]''' — Docker, PostgreSQL, настройки в системе телефонии. | |||
# '''[[#Этап 2. Установка сервисов инференса (опционально)|Установка сервисов инференса]]''' — ASR, LLM, TTS. ''Опционально, только для развёртывания на собственном сервере с GPU.'' | |||
# '''[[#Этап 3. Настройка .env|Настройка .env]]''' — параметры подключения. | |||
# '''[[#Этап 4. Запуск контейнера и создание робота|Запуск контейнера и создание робота]]''' — старт сервиса и конфигурация робота. | |||
__TOC__ | __TOC__ | ||
= | = Этап 1. Подготовка = | ||
Установка Docker, базы данных и настройка проброса заголовков и абонента в системе телефонии. | |||
== | == 1.1. Установка Docker == | ||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
| Строка 29: | Строка 36: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== 1. Настройка проброса заголовка в B2B == | == 1.2. Создать БД в PostgreSQL == | ||
Установить или взять существующий инстанс Postgres, создать нового пользователя и базу для робота. | |||
Пример с Docker: | |||
<syntaxhighlight lang="bash"> | |||
docker run -d \ | |||
--name postgres \ | |||
--network host \ | |||
-e POSTGRES_USER=secondchain \ | |||
-e POSTGRES_PASSWORD=changeme \ | |||
-e POSTGRES_DB=secondchain \ | |||
-v pgdata:/var/lib/postgresql/data \ | |||
postgres:17 | |||
</syntaxhighlight> | |||
== 1.3. Настройка проброса заголовка в B2B == | |||
Мастер-домен → приложение '''Настройки'''. В конфигурации, в нодах B2B добавить проброс заголовка <code>X-Robot-Session</code>: | Мастер-домен → приложение '''Настройки'''. В конфигурации, в нодах B2B добавить проброс заголовка <code>X-Robot-Session</code>: | ||
| Строка 39: | Строка 63: | ||
Активировать новую конфигурацию. | Активировать новую конфигурацию. | ||
== | == 1.4. Создать абонента для робота == | ||
Проектный домен → приложение '''Настройки'''. Создать нового абонента, под которым будет регистрироваться робот. | Проектный домен → приложение '''Настройки'''. Создать нового абонента, под которым будет регистрироваться робот. | ||
== | == 1.5. Создать канал интеграции для робота == | ||
Проектный домен → приложение '''Настройки'''. Создать новый канал интеграции: | Проектный домен → приложение '''Настройки'''. Создать новый канал интеграции: | ||
| Строка 51: | Строка 75: | ||
* '''Режим активности''' — постоянный | * '''Режим активности''' — постоянный | ||
{{Note|Сохранить локальный токен — он потребуется на | {{Note|Сохранить локальный токен — он потребуется на [[#Этап 3. Настройка .env|этапе настройки .env]].}} | ||
== | == 1.6. Создать движок в приложении ИИ == | ||
Задать произвольные название и код. В поле '''Номер телефона''' указать внутренний номер абонента, созданного на шаге [[# | Задать произвольные название и код. В поле '''Номер телефона''' указать внутренний номер абонента, созданного на шаге [[#1.4. Создать абонента для робота|1.4]]. | ||
'''Количество сессий''' по умолчанию = 8. Точное число зависит от оборудования, на котором размещаются сервисы робота. | '''Количество сессий''' по умолчанию = 8. Точное число зависит от оборудования, на котором размещаются сервисы робота. | ||
== | = Этап 2. Установка сервисов инференса (опционально) = | ||
{{Note|'''Опциональный этап.''' Выполняется только при развёртывании сервисов инференса на собственном сервере с GPU. Если ASR / LLM / TTS уже развёрнуты или используются внешние эндпоинты — перейдите к [[#Этап 3. Настройка .env|Этапу 3]].}} | |||
Инструкция для '''Ubuntu Server 24.04'''. Стек: ASR (T-one/Triton) → LLM (Qwen3.5-35B-A3B на vLLM) → TTS (LightTTS + CosyVoice3). | |||
Целевая машина — сервер с GPU: '''RTX PRO 5000 (48GB)''' или '''RTX PRO 6000 Blackwell (96GB)'''. | |||
== 2.1. Предварительные требования == | |||
Убедиться, что установлены драйверы NVIDIA, Docker и NVIDIA Container Toolkit: | |||
<syntaxhighlight lang="bash"> | |||
nvidia-smi # драйвер и GPU видны | |||
docker --version # Docker установлен | |||
docker run --rm --gpus all ubuntu nvidia-smi # GPU проброшен в контейнер | |||
</syntaxhighlight> | |||
Если последняя команда не отображает GPU, требуется установить NVIDIA Container Toolkit и перезапустить Docker. | |||
== | === Бюджет VRAM === | ||
{| class="wikitable" | |||
! Компонент !! VRAM | |||
|- | |||
| ASR (T-one/Triton) || 600–800 MB | |||
|- | |||
| LLM (Qwen3.5-35B-A3B) || 24–48 GB (зависит от числа сессий и длины контекста) | |||
|- | |||
| TTS (LightTTS/CosyVoice3) || 11 GB | |||
|} | |||
Суммарное потребление в пике — ~36–60 GB. | |||
'''RTX PRO 6000 (96GB):''' объёма достаточно с большим запасом. Допустимо использование максимального числа сессий и длинного контекста. | |||
'''RTX PRO 5000 (48GB):''' запас минимальный. Фиксированная сумма ASR (~0.8 GB) и TTS (11 GB) составляет ~12 GB, на LLM остаётся ~36 GB. Это покрывает только нижнюю границу диапазона LLM (24 GB). Требуется ограничение параметров <code>--max-num-seqs</code> и <code>--max-model-len</code> во избежание ошибки OOM. Значение <code>--gpu-memory-utilization 0.50</code> (~24 GB на карте 48GB) для данного сценария допустимо при условии, что ASR и TTS инициализированы до старта LLM. | |||
== 2.2. Порядок запуска == | |||
Модели независимы. Рекомендуемый порядок развёртывания для упрощения диагностики: '''ASR → LLM → TTS'''. | |||
== 2.3. ASR (T-one на Triton) == | |||
Сборка выполняется из исходных файлов в каталоге <code>/home/secondchain</code> через venv и скрипт сборки контейнера. | |||
<syntaxhighlight lang="bash"> | |||
# Python 3.12 + venv | |||
sudo apt install -y software-properties-common | |||
sudo add-apt-repository ppa:deadsnakes/ppa | |||
sudo apt update | |||
sudo apt install -y python3.12 python3.12-venv | |||
# Корень проекта | |||
cd /home/secondchain | |||
# Установка зависимостей | |||
./setup.sh | |||
# Активация окружения | |||
source venv/bin/activate | |||
# Сборка и запуск контейнера T-one на Triton | |||
./scripts/run_tone_triton.sh | |||
</syntaxhighlight> | |||
'''Проверка:''' после старта Triton слушает gRPC (стандартно 8001) и HTTP (стандартно 8000). Потребление VRAM — '''600–800 MB'''. Статус контейнера: | |||
<syntaxhighlight lang="bash"> | |||
docker ps | grep -i tone | |||
</syntaxhighlight> | |||
{{Note|При отсутствии ответа со стороны ASR диагностику следует начинать с проверки портов gRPC и логов контейнера.}} | |||
== 2.4. LLM (Qwen3.5-35B-A3B на vLLM) == | |||
{{Note|'''Перед запуском:''' значение <code>/path/to/cache</code> необходимо заменить на фактический путь к кэшу моделей (например <code>~/vllm-cache</code>), иначе веса будут загружаться повторно при каждом старте.}} | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
docker run -d \ | docker run -d \ | ||
--name | --name vllm-qwen35-moe \ | ||
-- | --gpus all \ | ||
- | --ipc=host \ | ||
- | -v ~/vllm-cache:/root/.cache \ | ||
- | -p 16080:8000 \ | ||
-v | vllm/vllm-openai:cu130-nightly \ | ||
--model Qwen/Qwen3.5-35B-A3B-GPTQ-Int4 \ | |||
--served-model-name qwen35-35b-a3b \ | |||
--quantization moe_wna16 \ | |||
--max-num-seqs 6 \ | |||
--max-model-len 8192 \ | |||
--kv-cache-memory 3221225472 \ | |||
--gpu-memory-utilization 0.50 \ | |||
--enable-prefix-caching \ | |||
--host 0.0.0.0 --port 8000 \ | |||
--reasoning-parser qwen3 \ | |||
--enable-auto-tool-choice \ | |||
--tool-call-parser qwen3_coder \ | |||
--language-model-only | |||
</syntaxhighlight> | |||
'''Ключевые параметры:''' | |||
* <code>--max-model-len 8192</code> — максимальное окно контекста в токенах. | |||
* <code>--max-num-seqs 6</code> — максимум одновременно обрабатываемых запросов. | |||
* <code>--gpu-memory-utilization 0.50</code> — 50% VRAM выделено под LLM. | |||
* <code>--kv-cache-memory 3221225472</code> — 3 GiB под KV-кэш. | |||
Минимальный объём VRAM для запуска — '''24 GB'''. Фактическое потребление — '''24–48 GB''' в зависимости от числа допустимых сессий (<code>--max-num-seqs</code>) и длины контекста (<code>--max-model-len</code>). | |||
'''Проверка:''' после загрузки весов проверить OpenAI-совместимый эндпоинт на порту '''16080''': | |||
<syntaxhighlight lang="bash"> | |||
docker logs -f vllm-qwen35-moe # ожидать "Application startup complete" | |||
curl http://localhost:16080/v1/models | |||
curl http://localhost:16080/v1/chat/completions \ | |||
-H "Content-Type: application/json" \ | |||
-d '{ | |||
"model": "qwen35-35b-a3b", | |||
"messages": [{"role": "user", "content": "Привет"}] | |||
}' | |||
</syntaxhighlight> | |||
== 2.5. TTS (LightTTS + CosyVoice3) == | |||
Сборка двухфазная: на первой фазе интерактивно подготавливается образ с TRT-движком и весами с последующим коммитом, на второй — выполняется запуск в режиме демона. | |||
=== Фаза 1 — подготовка образа === | |||
<syntaxhighlight lang="bash"> | |||
docker pull lighttts/light-tts:latest | |||
docker run -it --gpus all -p 8080:8080 --shm-size 4g --name lighttts \ | |||
-v ~/lighttts-models:/data \ | |||
lighttts/light-tts:latest /bin/bash | |||
</syntaxhighlight> | |||
Внутри контейнера: | |||
<syntaxhighlight lang="bash"> | |||
git checkout main && git pull | |||
pip install huggingface_hub | |||
python -c " | |||
from huggingface_hub import snapshot_download | |||
snapshot_download('FunAudioLLM/Fun-CosyVoice3-0.5B-2512', local_dir='/data/Fun-CosyVoice3-0.5B') | |||
" | |||
# первый запуск собирает TRT-движок (float16) | |||
python -m light_tts.server.api_server \ | |||
--model_dir /data/Fun-CosyVoice3-0.5B \ | |||
--data_type float16 \ | |||
--load_trt True | |||
exit | |||
</syntaxhighlight> | |||
=== Фаза 2 — коммит и запуск в режиме демона === | |||
<syntaxhighlight lang="bash"> | |||
docker commit lighttts lighttts/light-tts:ready | |||
docker rm lighttts | |||
docker run -d --gpus all -p 8080:8080 --shm-size 4g \ | |||
--restart unless-stopped \ | |||
--name lighttts \ | |||
-v ~/lighttts-models:/data \ | |||
lighttts/light-tts:ready \ | |||
python -m light_tts.server.api_server \ | |||
--model_dir /data/Fun-CosyVoice3-0.5B \ | |||
--data_type float16 \ | |||
--load_trt True | |||
</syntaxhighlight> | |||
'''Проверка:''' TTS слушает порт '''8080''', потребление VRAM — '''11 GB''': | |||
<syntaxhighlight lang="bash"> | |||
docker ps | grep lighttts | |||
docker logs -f lighttts # ожидать готовности сервера | |||
</syntaxhighlight> | |||
== 2.6. Итоговая карта портов == | |||
{| class="wikitable" | |||
! Сервис !! Контейнер !! Внешний порт | |||
|- | |||
| ASR (Triton HTTP) || <code>*tone*</code> || 8000 | |||
|- | |||
| ASR (Triton gRPC) || <code>*tone*</code> || 8001 | |||
|- | |||
| LLM (vLLM) || <code>vllm-qwen35-moe</code> || 16080 | |||
|- | |||
| TTS (LightTTS) || <code>lighttts</code> || 8080 | |||
|} | |||
== 2.7. Финальная проверка стека == | |||
<syntaxhighlight lang="bash"> | |||
docker ps # все три контейнера (ASR / vLLM / TTS) в статусе Up | |||
</syntaxhighlight> | </syntaxhighlight> | ||
= | После проверки выполняется подключение пайплайна PjSIP → VAD → ASR → LLM → TTS с указанием эндпоинтов в конфигурации: ASR — <code>:8000/:8001</code>, LLM — <code>:16080</code>, TTS — <code>:8080</code>. | ||
= Этап 3. Настройка .env = | |||
{{TODO|Раздел будет описан отдельно.}} | |||
Базовые параметры: | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
EXTERNAL_TEMPLATES_URL=https://[адрес инстанса эры]/rest/v1/model/ai/robot | EXTERNAL_TEMPLATES_URL=https://[адрес инстанса эры]/rest/v1/model/ai/robot | ||
EXTERNAL_TEMPLATES_TOKEN=[локальный токен из шага | EXTERNAL_TEMPLATES_TOKEN=[локальный токен из шага 1.5] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
А также настройки Postgres и подключения SIP к учётной записи абонента из шага [[# | А также настройки Postgres (из шага [[#1.2. Создать БД в PostgreSQL|1.2]]) и подключения SIP к учётной записи абонента (из шага [[#1.4. Создать абонента для робота|1.4]]). | ||
<!-- Плейсхолдер под подробное описание .env --> | |||
= Этап 4. Запуск контейнера и создание робота = | |||
== | == 4.1. Загрузка образа и запуск контейнера == | ||
Скопировать на сервер архив с образом контейнера и файл <code>.env</code> в одну директорию. | Скопировать на сервер архив с образом контейнера и файл <code>.env</code> в одну директорию. | ||
| Строка 126: | Строка 336: | ||
{{Note|Первый запуск занимает больше времени, чем последующие.}} | {{Note|Первый запуск занимает больше времени, чем последующие.}} | ||
== | == 4.2. Создать робота в приложении ИИ == | ||
=== | === Загрузить голос === | ||
Необходим аудиофайл <code>.mp3</code> или <code>.wav</code> длительностью ~10 секунд, без лишних шумов и эхо. При загрузке указать точную транскрипцию произнесённого текста (со знаками препинания). | Необходим аудиофайл <code>.mp3</code> или <code>.wav</code> длительностью ~10 секунд, без лишних шумов и эхо. При загрузке указать точную транскрипцию произнесённого текста (со знаками препинания). | ||
| Строка 134: | Строка 344: | ||
Для быстрого старта можно импортировать демо-голос (импорт + загрузка файла). | Для быстрого старта можно импортировать демо-голос (импорт + загрузка файла). | ||
=== | === Создать инструменты === | ||
Базовые инструменты работы со звонком. | Базовые инструменты работы со звонком. | ||
==== | ==== drop_call ==== | ||
{| class="wikitable" | {| class="wikitable" | ||
| Строка 156: | Строка 366: | ||
|} | |} | ||
==== | ==== transfer_call ==== | ||
{| class="wikitable" | {| class="wikitable" | ||
| Строка 176: | Строка 386: | ||
|} | |} | ||
=== | === Создать робота === | ||
Импортировать шаблон (<code>Роботы.json</code>). На вкладке '''Инструкции''' изучить рекомендуемый шаблон системного промпта, а также промпта пост-обработки звонка. | Импортировать шаблон (<code>Роботы.json</code>). На вкладке '''Инструкции''' изучить рекомендуемый шаблон системного промпта, а также промпта пост-обработки звонка. | ||
== | == 4.3. Проверить создание пользователя == | ||
После создания робота должен автоматически создаться пользователь <code>Робот_имяРобота</code>. | После создания робота должен автоматически создаться пользователь <code>Робот_имяРобота</code>. | ||
== | == 4.4. Проверить и установить статус пользователя == | ||
Приложение '''Супервизор контакт-центра''' → раздел '''Операторы → Текущие статусы'''. Убрать фильтры, найти пользователя робота и убедиться, что у него установлен статус '''Готов'''. При необходимости установить этот статус. | Приложение '''Супервизор контакт-центра''' → раздел '''Операторы → Текущие статусы'''. Убрать фильтры, найти пользователя робота и убедиться, что у него установлен статус '''Готов'''. При необходимости установить этот статус. | ||
== | == 4.5. Добавить робота в очередь == | ||
Приложение '''Администратор контакт-центра''' → добавить робота как участника очереди. '''Тип участника''' = Робот. В остальном настройки идентичны. | Приложение '''Администратор контакт-центра''' → добавить робота как участника очереди. '''Тип участника''' = Робот. В остальном настройки идентичны. | ||
== | == 4.6. Осуществить звонок == | ||
Настройка завершена. Можно совершить звонок в очередь и протестировать работу робота. | Настройка завершена. Можно совершить звонок в очередь и протестировать работу робота. | ||
Версия от 20:44, 6 июля 2026
Установка и настройка голосового робота Эра (SecondChain)
Пошаговая инструкция по развёртыванию голосового робота. Процесс разбит на четыре этапа:
- Подготовка — Docker, PostgreSQL, настройки в системе телефонии.
- Установка сервисов инференса — ASR, LLM, TTS. Опционально, только для развёртывания на собственном сервере с GPU.
- Настройка .env — параметры подключения.
- Запуск контейнера и создание робота — старт сервиса и конфигурация робота.
Этап 1. Подготовка
Установка Docker, базы данных и настройка проброса заголовков и абонента в системе телефонии.
1.1. Установка Docker
apt install ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
1.2. Создать БД в PostgreSQL
Установить или взять существующий инстанс Postgres, создать нового пользователя и базу для робота.
Пример с Docker:
docker run -d \
--name postgres \
--network host \
-e POSTGRES_USER=secondchain \
-e POSTGRES_PASSWORD=changeme \
-e POSTGRES_DB=secondchain \
-v pgdata:/var/lib/postgresql/data \
postgres:17
1.3. Настройка проброса заголовка в B2B
Мастер-домен → приложение Настройки. В конфигурации, в нодах B2B добавить проброс заголовка X-Robot-Session:
"fwd_headers": ["X-Robot-Session"],
Активировать новую конфигурацию.
1.4. Создать абонента для робота
Проектный домен → приложение Настройки. Создать нового абонента, под которым будет регистрироваться робот.
1.5. Создать канал интеграции для робота
Проектный домен → приложение Настройки. Создать новый канал интеграции:
- Тип — Подписчик
- Права —
ai_admin,ai_voicebot_admin - Режим активности — постоянный
1.6. Создать движок в приложении ИИ
Задать произвольные название и код. В поле Номер телефона указать внутренний номер абонента, созданного на шаге 1.4.
Количество сессий по умолчанию = 8. Точное число зависит от оборудования, на котором размещаются сервисы робота.
Этап 2. Установка сервисов инференса (опционально)
Инструкция для Ubuntu Server 24.04. Стек: ASR (T-one/Triton) → LLM (Qwen3.5-35B-A3B на vLLM) → TTS (LightTTS + CosyVoice3).
Целевая машина — сервер с GPU: RTX PRO 5000 (48GB) или RTX PRO 6000 Blackwell (96GB).
2.1. Предварительные требования
Убедиться, что установлены драйверы NVIDIA, Docker и NVIDIA Container Toolkit:
nvidia-smi # драйвер и GPU видны
docker --version # Docker установлен
docker run --rm --gpus all ubuntu nvidia-smi # GPU проброшен в контейнер
Если последняя команда не отображает GPU, требуется установить NVIDIA Container Toolkit и перезапустить Docker.
Бюджет VRAM
| Компонент | VRAM |
|---|---|
| ASR (T-one/Triton) | 600–800 MB |
| LLM (Qwen3.5-35B-A3B) | 24–48 GB (зависит от числа сессий и длины контекста) |
| TTS (LightTTS/CosyVoice3) | 11 GB |
Суммарное потребление в пике — ~36–60 GB.
RTX PRO 6000 (96GB): объёма достаточно с большим запасом. Допустимо использование максимального числа сессий и длинного контекста.
RTX PRO 5000 (48GB): запас минимальный. Фиксированная сумма ASR (~0.8 GB) и TTS (11 GB) составляет ~12 GB, на LLM остаётся ~36 GB. Это покрывает только нижнюю границу диапазона LLM (24 GB). Требуется ограничение параметров --max-num-seqs и --max-model-len во избежание ошибки OOM. Значение --gpu-memory-utilization 0.50 (~24 GB на карте 48GB) для данного сценария допустимо при условии, что ASR и TTS инициализированы до старта LLM.
2.2. Порядок запуска
Модели независимы. Рекомендуемый порядок развёртывания для упрощения диагностики: ASR → LLM → TTS.
2.3. ASR (T-one на Triton)
Сборка выполняется из исходных файлов в каталоге /home/secondchain через venv и скрипт сборки контейнера.
# Python 3.12 + venv
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install -y python3.12 python3.12-venv
# Корень проекта
cd /home/secondchain
# Установка зависимостей
./setup.sh
# Активация окружения
source venv/bin/activate
# Сборка и запуск контейнера T-one на Triton
./scripts/run_tone_triton.sh
Проверка: после старта Triton слушает gRPC (стандартно 8001) и HTTP (стандартно 8000). Потребление VRAM — 600–800 MB. Статус контейнера:
docker ps | grep -i tone
2.4. LLM (Qwen3.5-35B-A3B на vLLM)
docker run -d \
--name vllm-qwen35-moe \
--gpus all \
--ipc=host \
-v ~/vllm-cache:/root/.cache \
-p 16080:8000 \
vllm/vllm-openai:cu130-nightly \
--model Qwen/Qwen3.5-35B-A3B-GPTQ-Int4 \
--served-model-name qwen35-35b-a3b \
--quantization moe_wna16 \
--max-num-seqs 6 \
--max-model-len 8192 \
--kv-cache-memory 3221225472 \
--gpu-memory-utilization 0.50 \
--enable-prefix-caching \
--host 0.0.0.0 --port 8000 \
--reasoning-parser qwen3 \
--enable-auto-tool-choice \
--tool-call-parser qwen3_coder \
--language-model-only
Ключевые параметры:
--max-model-len 8192— максимальное окно контекста в токенах.--max-num-seqs 6— максимум одновременно обрабатываемых запросов.--gpu-memory-utilization 0.50— 50% VRAM выделено под LLM.--kv-cache-memory 3221225472— 3 GiB под KV-кэш.
Минимальный объём VRAM для запуска — 24 GB. Фактическое потребление — 24–48 GB в зависимости от числа допустимых сессий (--max-num-seqs) и длины контекста (--max-model-len).
Проверка: после загрузки весов проверить OpenAI-совместимый эндпоинт на порту 16080:
docker logs -f vllm-qwen35-moe # ожидать "Application startup complete"
curl http://localhost:16080/v1/models
curl http://localhost:16080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen35-35b-a3b",
"messages": [{"role": "user", "content": "Привет"}]
}'
2.5. TTS (LightTTS + CosyVoice3)
Сборка двухфазная: на первой фазе интерактивно подготавливается образ с TRT-движком и весами с последующим коммитом, на второй — выполняется запуск в режиме демона.
Фаза 1 — подготовка образа
docker pull lighttts/light-tts:latest
docker run -it --gpus all -p 8080:8080 --shm-size 4g --name lighttts \
-v ~/lighttts-models:/data \
lighttts/light-tts:latest /bin/bash
Внутри контейнера:
git checkout main && git pull
pip install huggingface_hub
python -c "
from huggingface_hub import snapshot_download
snapshot_download('FunAudioLLM/Fun-CosyVoice3-0.5B-2512', local_dir='/data/Fun-CosyVoice3-0.5B')
"
# первый запуск собирает TRT-движок (float16)
python -m light_tts.server.api_server \
--model_dir /data/Fun-CosyVoice3-0.5B \
--data_type float16 \
--load_trt True
exit
Фаза 2 — коммит и запуск в режиме демона
docker commit lighttts lighttts/light-tts:ready
docker rm lighttts
docker run -d --gpus all -p 8080:8080 --shm-size 4g \
--restart unless-stopped \
--name lighttts \
-v ~/lighttts-models:/data \
lighttts/light-tts:ready \
python -m light_tts.server.api_server \
--model_dir /data/Fun-CosyVoice3-0.5B \
--data_type float16 \
--load_trt True
Проверка: TTS слушает порт 8080, потребление VRAM — 11 GB:
docker ps | grep lighttts
docker logs -f lighttts # ожидать готовности сервера
2.6. Итоговая карта портов
| Сервис | Контейнер | Внешний порт |
|---|---|---|
| ASR (Triton HTTP) | *tone* |
8000 |
| ASR (Triton gRPC) | *tone* |
8001 |
| LLM (vLLM) | vllm-qwen35-moe |
16080 |
| TTS (LightTTS) | lighttts |
8080 |
2.7. Финальная проверка стека
docker ps # все три контейнера (ASR / vLLM / TTS) в статусе Up
После проверки выполняется подключение пайплайна PjSIP → VAD → ASR → LLM → TTS с указанием эндпоинтов в конфигурации: ASR — :8000/:8001, LLM — :16080, TTS — :8080.
Этап 3. Настройка .env
Базовые параметры:
EXTERNAL_TEMPLATES_URL=https://[адрес инстанса эры]/rest/v1/model/ai/robot
EXTERNAL_TEMPLATES_TOKEN=[локальный токен из шага 1.5]
А также настройки Postgres (из шага 1.2) и подключения SIP к учётной записи абонента (из шага 1.4).
Этап 4. Запуск контейнера и создание робота
4.1. Загрузка образа и запуск контейнера
Скопировать на сервер архив с образом контейнера и файл .env в одну директорию.
docker load -i secondchain-1.0.3a-cpu.tar.gz
mkdir -p ./logs
docker run -d --name secondchain \
--network host \
--env-file .env \
--restart unless-stopped \
-v secondchain-data:/data \
-v ./logs:/app/logs \
secondchain:1.0.3a-cpu
docker logs secondchain -f
Когда сервис загрузится и проинициализируется, в консоли появится сообщение:
Registration: OK (code=200) [pjsip.account] [info ] SIP client registered successfully [voip.sip] [info ] VoIP health monitor started [src.api.app] [info ] SecondChain started successfully [src.api.app] [info ] Application startup complete. [uvicorn.error] [info ] Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
4.2. Создать робота в приложении ИИ
Загрузить голос
Необходим аудиофайл .mp3 или .wav длительностью ~10 секунд, без лишних шумов и эхо. При загрузке указать точную транскрипцию произнесённого текста (со знаками препинания).
Для быстрого старта можно импортировать демо-голос (импорт + загрузка файла).
Создать инструменты
Базовые инструменты работы со звонком.
drop_call
| Параметр | Значение |
|---|---|
| Имя | drop_call
|
| Код | drop_call
|
| description | Завершение звонка по инициативе робота |
| toolType | callManagement
|
| callAction | drop
|
| enabled | Да |
transfer_call
| Параметр | Значение |
|---|---|
| Имя | transfer_call
|
| Код | transfer_call
|
| description | Перевод звонка на оператора |
| toolType | callManagement
|
| callAction | transfer
|
| transferDestination | Короткий номер для перевода звонков (например, номер очереди) |
| enabled | Да |
Создать робота
Импортировать шаблон (Роботы.json). На вкладке Инструкции изучить рекомендуемый шаблон системного промпта, а также промпта пост-обработки звонка.
4.3. Проверить создание пользователя
После создания робота должен автоматически создаться пользователь Робот_имяРобота.
4.4. Проверить и установить статус пользователя
Приложение Супервизор контакт-центра → раздел Операторы → Текущие статусы. Убрать фильтры, найти пользователя робота и убедиться, что у него установлен статус Готов. При необходимости установить этот статус.
4.5. Добавить робота в очередь
Приложение Администратор контакт-центра → добавить робота как участника очереди. Тип участника = Робот. В остальном настройки идентичны.
4.6. Осуществить звонок
Настройка завершена. Можно совершить звонок в очередь и протестировать работу робота.