Docker среда
ASR сървърът се деплойва като Docker Compose stack с CUDA 12.8 поддръжка на NVIDIA DGX Spark. Тази страница описва Docker конфигурацията, включително Dockerfile, GPU passthrough, volumes, мрежи и health checks.
Общ преглед на контейнерите
ASR Dockerfile (Dockerfile.cuda128)
ASR контейнерът е базиран на NVIDIA CUDA 12.8 runtime image:
FROM nvidia/cuda:12.8.1-cudnn-runtime-ubuntu22.04
RUN apt-get update && apt-get install -y --no-install-recommends \
python3 python3-pip python3-venv libsndfile1 \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY requirements.txt .
RUN pip3 install --no-cache-dir --upgrade pip && \
pip3 install --no-cache-dir numpy typing_extensions && \
pip3 install --no-cache-dir torch --index-url https://download.pytorch.org/whl/cu128 && \
pip3 install --no-cache-dir -r requirements.txt
COPY app/ ./app/
EXPOSE 8765
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8765"]
Детайли на build процеса
| Стъпка | Описание |
|---|---|
| Base image | nvidia/cuda:12.8.1-cudnn-runtime-ubuntu22.04 -- CUDA 12.8 runtime с cuDNN |
| System packages | python3, python3-pip, python3-venv, libsndfile1 (за soundfile) |
| PyTorch | Инсталира се от CUDA 12.8 wheel index (cu128) |
| NeMo | Инсталира се чрез nemo_toolkit[asr] от requirements.txt |
| App server | Uvicorn ASGI сървър на порт 8765 |
Python dependencies (requirements.txt)
fastapi>=0.115
uvicorn[standard]>=0.30
python-multipart>=0.0.9
numpy
soundfile>=0.12
httpx>=0.27
prometheus-client>=0.21
nemo_toolkit[asr]>=2.4
Data Collector Dockerfile
Лек Python контейнер без GPU зависимости:
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app/ app/
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8767"]
Python dependencies (data-collector/requirements.txt)
fastapi>=0.115
uvicorn>=0.30
azure-storage-blob[aio]>=12.20
azure-monitor-ingestion[aio]>=1.0
azure-identity[aio]>=1.17
aiohttp>=3.9
GPU Passthrough
Docker Compose използва NVIDIA Container Toolkit за GPU достъп:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1 # или "all" за dcgm-exporter
capabilities: [gpu]
GPU разпределение по контейнери
| Контейнер | GPU count | Описание |
|---|---|---|
asr | 1 | Canary-1B-v2 inference |
llm | 1 | vLLM Gemma 3 12B inference |
dcgm-exporter | all | Достъп до всички GPU за метрики |
| Останалите | -- | Не използват GPU |
Docker Compose profiles
vLLM сървърът е в profile postprocess и не се стартира по подразбиране:
llm:
profiles: [postprocess]
# ...
# Без LLM (само ASR)
docker compose up -d
# С LLM post-processing
docker compose --profile postprocess up -d
Volumes
Таблица с volumes
| Контейнер | Host път | Container път | Режим | Описание |
|---|---|---|---|---|
llm | ${HF_HOME:-~/.cache/huggingface} | /root/.cache/huggingface | rw | Cache за Hugging Face модели |
proxy | ./nginx.conf | /etc/nginx/conf.d/default.conf | ro | Nginx конфигурация |
promtail | ./promtail-config.yml | /etc/promtail/config.yml | ro | Promtail конфигурация |
promtail | /var/run/docker.sock | /var/run/docker.sock | ro | Docker socket за log collection |
node-exporter | /proc | /host/proc | ro | Linux proc filesystem |
node-exporter | /sys | /host/sys | ro | Linux sysfs |
node-exporter | / | /rootfs | ro | Корен на файловата система |
Environment Variables
ASR контейнер
| Променлива | Стойност в Compose | Описание |
|---|---|---|
SERVER_API_KEY | ${SERVER_API_KEY} | API ключ от .env файл |
POSTPROCESS_ENABLED | ${POSTPROCESS_ENABLED:-false} | Включване на LLM корекция |
POSTPROCESS_URL | http://llm:8000 | Хардкоднат вътрешен URL |
POSTPROCESS_MODEL | ${POSTPROCESS_MODEL:-google/gemma-3-12b-it} | Модел за vLLM |
POSTPROCESS_TIMEOUT | ${POSTPROCESS_TIMEOUT:-5.0} | Timeout в секунди |
DASHBOARD_URL | http://dashboard:8766 | Хардкоднат вътрешен URL |
DATA_COLLECTOR_URL | http://data-collector:8767 | Хардкоднат вътрешен URL |
LLM контейнер
| Променлива | Стойност в Compose | Описание |
|---|---|---|
HF_TOKEN | ${HF_TOKEN} | Hugging Face API token |
Data Collector контейнер
| Променлива | Стойност в Compose | Описание |
|---|---|---|
AZURE_STORAGE_CONNECTION_STRING | ${AZURE_STORAGE_CONNECTION_STRING} | Azure Blob Storage connection string |
AZURE_STORAGE_CONTAINER | ${AZURE_STORAGE_CONTAINER:-asr-recordings} | Име на blob container |
LOG_ANALYTICS_DCE_ENDPOINT | ${LOG_ANALYTICS_DCE_ENDPOINT} | Data Collection Endpoint URL |
LOG_ANALYTICS_DCR_RULE_ID | ${LOG_ANALYTICS_DCR_RULE_ID} | Data Collection Rule ID |
LOG_ANALYTICS_STREAM_NAME | ${LOG_ANALYTICS_STREAM_NAME:-Custom-AsrRequests_CL} | Log Analytics stream |
AZURE_CLIENT_ID | ${AZURE_CLIENT_ID} | Service Principal client ID |
AZURE_CLIENT_SECRET | ${AZURE_CLIENT_SECRET} | Service Principal secret |
AZURE_TENANT_ID | ${AZURE_TENANT_ID} | Azure AD tenant ID |
COLLECTOR_HOST_LABEL | ${COLLECTOR_HOST_LABEL:-gx10-804f} | Host label за blob организация |
SERVER_API_KEY | ${SERVER_API_KEY} | API ключ за вътрешна автентикация |
Мрежа
Всички услуги са в default Docker Compose мрежа. Вътрешната комуникация използва Docker DNS имена (напр. http://asr:8765, http://llm:8000).
Изложени портове (host)
| Порт | Контейнер | Описание |
|---|---|---|
| 8765 | proxy | Единствен входен порт -- Nginx reverse proxy |
| 8000 | llm | vLLM API (достъпен и директно от хоста) |
| 9100 | node-exporter | Node metrics (за директен Prometheus scraping) |
| 9400 | dcgm-exporter | GPU metrics (за директен Prometheus scraping) |
LLM специфични настройки
llm:
ipc: host # Споделена IPC namespace за GPU комуникация
ulimits:
memlock: -1 # Неограничен memory lock (CUDA нужда)
stack: 67108864 # 64 MB stack (vLLM нужда)
Health Checks
| Контейнер | Health Check | Interval | Timeout | Retries | Start Period |
|---|---|---|---|---|---|
llm | curl -f http://localhost:8000/health | 30s | 10s | 5 | 180s (3 мин) |
Останалите контейнери нямат Docker health check, но ASR сървърът предоставя HTTP endpoint:
# ASR health (чрез proxy)
curl http://localhost:8765/health
# Data collector health (вътрешен)
curl http://data-collector:8767/health
Restart политика
Всички контейнери имат restart: unless-stopped -- рестартират се автоматично при crash, освен ако не са спрени ръчно.
Стартиране и управление
# Стартиране на всички основни услуги
docker compose up -d
# Стартиране с LLM post-processing
docker compose --profile postprocess up -d
# Преглед на логове
docker compose logs -f asr
docker compose logs -f llm
# Rebuild на ASR контейнера
docker compose build asr
docker compose up -d asr
# Спиране на всичко
docker compose down