test/docs/deployment.md

700 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Qwen3-ASR 部署指南
快速部署 Qwen3-ASR 语音识别服务,支持 CPU/macOS、NVIDIA GPU、沐曦 GPU、天数 GPU 与摩尔线程 GPU 运行形态。
如果你正在继续验证本轮 CUDA 官方 vLLM 迁移,请同时参考:
- [PENDING_CUDA_VLLM_HANDOFF.md](./TODO/PENDING_CUDA_VLLM_HANDOFF.md)
依赖安装现在改成根目录默认 NVIDIA GPU,CPU、沐曦、天数与摩尔线程为单独特化环境:
| 模式 | 命令 | 说明 |
|------|------|------|
| NVIDIA GPU | `uv sync` 或 `./scripts/sync_gpu_env.sh` | Linux/NVIDIA 运行时,默认锁定 CUDA 13.0/cu130 `torch 2.11.0` / `torchaudio 2.11.0` / `torchvision 0.26.0` + `vllm 0.20.0` |
| 沐曦 GPU | `./scripts/sync_metax_env.sh` | 同步公共依赖;可选 GPU 栈安装默认从沐曦 MACA PyPI 源按 `--no-deps` 安装 |
| 天数 GPU | `./scripts/sync_iluvatar_env.sh` | 同步公共依赖;GPU 栈使用天数官方 vLLM 镜像 |
| 摩尔线程 GPU | `./scripts/sync_mthreads_env.sh` | 同步公共依赖;GPU 栈使用摩尔线程官方 MUSA vLLM 镜像 |
| CPU | `./scripts/sync_cpu_env.sh` | Linux/CPU 运行时 |
| 自动 | `./scripts/sync_accel_env.sh` | 根据 `mx-smi` / `ixsmi` / `mthreads-gmi` / `nvidia-smi` 自动选择沐曦、天数、摩尔线程、NVIDIA 或 CPU 环境 |
## 快速部署
### NVIDIA GPU 版本部署(推荐)
适用于生产环境,提供更快的推理速度:
**前置要求:**
- NVIDIA GPU(默认镜像面向 CUDA 13.0+;CUDA 12.6 / 13.0 可通过构建参数覆盖)
- 已安装 NVIDIA Container Toolkit
- 显存 12GB+(推荐 16GB+ 以支持 Qwen3-ASR 1.7B)
```bash
# 使用 docker run(带模型挂载)
docker run -d --name qwen3-asr \
--gpus all \
-p 17003:8000 \
-v /opt/dep/asr/models:/app/models \
-v /opt/dep/asr/data:/app/data \
-e ACCELERATOR=nvidia \
-e DEVICE=auto \
-e QWEN_GPU_MEMORY_UTILIZATION=0.3 \
-e QWEN_VLLM_ENFORCE_EAGER=true \
unis/qwen3-asr:gpu-latest
# 或使用 docker-compose(推荐)
docker-compose up -d
```
### 沐曦 GPU 版本部署
适用于已安装沐曦驱动与容器运行栈的机器:
```bash
docker run -d --name qwen3-asr-metax \
--privileged \
--network=host \
--pid=host \
--ipc=host \
-v /dev:/dev \
-v /opt/mxdriver:/opt/mxdriver:ro \
-v /opt/dep/asr/models:/app/models \
-v /opt/dep/asr/data:/app/data \
-e ACCELERATOR=metax \
-e PORT=17003 \
-e METAX_VISIBLE_DEVICES=0 \
unis/qwen3-asr:metax-latest
# 或使用 docker-compose-metax.yml
docker compose -f docker-compose-metax.yml up -d
```
构建沐曦镜像时,`Dockerfile.metax` 会基于沐曦官方 vLLM 镜像融合本项目代码与通用依赖:
```bash
./scripts/package_vendor_gpu_image.sh \
--vendor metax \
--base-image <沐曦官方vLLM镜像名> \
-v n260-3.7.0.38
```
沐曦等国产 GPU 的生产推荐路径是“厂商官方 vLLM 镜像 + 本项目代码/通用依赖”。不要在项目 Dockerfile 中重新 `pip install vllm`,避免解析到 PyPI/NVIDIA CUDA 依赖。
沐曦 GPU 的完整编译、模型准备和离线交付流程见 [沐曦 GPU 国产化离线部署指南](./metax_offline_deployment.md)。
### 天数 GPU 版本部署
适用于已安装天数驱动与容器运行栈的机器。按天数官方镜像运行建议,本 compose 使用 host network、host pid/ipc、privileged、`/dev`、`/usr/src`、`/lib/modules` 等挂载,并额外挂载本项目模型与数据目录:
```bash
docker pull registry.iluvatar.com.cn:10443/customer/sz/vllm0.17.0-4.4.0-x86:v5
./scripts/package_vendor_gpu_image.sh \
--vendor iluvatar \
--base-image registry.iluvatar.com.cn:10443/customer/sz/vllm0.17.0-4.4.0-x86:v5 \
-v vllm0.17.0-4.4.0-v5
ASR_IMAGE=unis/qwen3-asr:iluvatar-vllm0.17.0-4.4.0-v5 \
docker compose -f docker-compose-iluvatar.yml up -d
```
天数 GPU 的完整编译、模型准备和离线交付流程见 [天数 GPU 国产化离线部署指南](./iluvatar_offline_deployment.md)。
### 摩尔线程 GPU 版本部署
适用于已安装摩尔线程驱动与 MUSA 容器运行栈的机器:
```bash
docker pull registry.mthreads.com/presale/devtech/vllm_musa:s4000_4.3.5_d0519
./scripts/package_vendor_gpu_image.sh \
--vendor mthreads \
--base-image registry.mthreads.com/presale/devtech/vllm_musa:s4000_4.3.5_d0519 \
-v s4000_4.3.5_d0519
ASR_IMAGE=unis/qwen3-asr:mthreads-s4000_4.3.5_d0519 \
docker compose -f docker-compose-mthreads.yml up -d
```
摩尔线程 GPU 的完整编译、模型准备和离线交付流程见 [摩尔线程 GPU 国产化离线部署指南](./mthreads_offline_deployment.md)。
默认推荐将宿主机目录统一挂载到 `/opt/dep/asr` 下,目录结构如下:
```text
/opt/dep/asr/models/
Qwen/
iic/
damo/
```
如果你希望挂载到自定义目录,可统一设置:
```bash
export MODEL_STORAGE_DIR=/data/qwen3-asr-models
export DATA_STORAGE_DIR=/data/qwen3-asr-data
mkdir -p "$MODEL_STORAGE_DIR" "$DATA_STORAGE_DIR"
docker-compose up -d
```
### 多 GPU 拓扑模式
项目现在支持统一的多 GPU 拓扑开关:
- `ASR_DEPLOY_TOPOLOGY=isolated`
- 默认模式
- 每张卡启动 1 个 backend 实例
- 容器内使用 Nginx 负载均衡到多个实例
- `ASR_DEPLOY_TOPOLOGY=sharded`
- 单个 backend 进程占用多张卡
- 由 vLLM 在进程内部做多卡分片
- `ASR_DEPLOY_TOPOLOGY=auto`
- 优先尝试 `sharded`
- 如果当前平台、可见设备或 shard 数不满足条件,则自动回退到 `isolated`
### NVIDIA 多 GPU 自动并行部署(推荐)
适用于并发量较高场景。该方案通过容器 entrypoint 自动完成:
- 根据 `ASR_VISIBLE_DEVICES` 拉起多个 ASR 实例(每张卡 1 个实例)
- 容器内自动生成 Nginx upstream 并负载均衡到各实例
- 对外仍只暴露一个服务端口(默认 `8000`)
你不需要手工维护多个 `docker-compose` 服务块或手工维护 nginx upstream。
```bash
# 4 卡示例:GPU0,1,2,3 各启动 1 个实例
ASR_VISIBLE_DEVICES=0,1,2,3 docker-compose up -d
```
常用组合:
- 单卡(保持默认):`ASR_VISIBLE_DEVICES=0`
- 双卡:`ASR_VISIBLE_DEVICES=0,1`
- 四卡:`ASR_VISIBLE_DEVICES=0,1,2,3`
强制单实例多卡分片:
```bash
ASR_DEPLOY_TOPOLOGY=sharded \
ASR_VISIBLE_DEVICES=0,1 \
docker-compose up -d
```
自动选择模式:
```bash
ASR_DEPLOY_TOPOLOGY=auto \
ASR_VISIBLE_DEVICES=0,1 \
docker-compose up -d
```
**服务访问地址:**
- API 服务: `http://localhost:17003`
- API 文档: `http://localhost:17003/docs`
### 沐曦多 GPU 自动并行部署
```bash
ASR_VISIBLE_DEVICES=0,1 docker compose -f docker-compose-metax.yml up -d
```
### 摩尔线程多 GPU 自动并行部署
```bash
ASR_VISIBLE_DEVICES=0,1 docker compose -f docker-compose-mthreads.yml up -d
```
### CPU 版本部署
适用于开发测试或无 GPU 环境:
```bash
docker run -d --name qwen3-asr \
-p 17003:8000 \
-v /opt/dep/asr/models:/app/models \
-v /opt/dep/asr/data:/app/data \
-e DEVICE=cpu \
unis/qwen3-asr:cpu-latest
```
**注意:** CPU 版本不使用 GPU/vLLM 路径。
当前 CPU 镜像已集成 QwenASR Rust backend,会自动选择 `qwen3-asr-0.6b`。
CPU 镜像默认使用可分发的 `x86-64-v2` Rust 构建目标,避免把构建机的 native CPU 指令带入通用镜像。
如果你确认构建机与部署机 CPU 指令集一致,可在自建镜像时设置 `QWENASR_RUST_TARGET_CPU=native` 换取更激进优化。
当前 Rust backend 的 x86 kernel 需要 `avx2` 与 `fma`,不满足时启动会给出明确错误。镜像默认限制
`OPENBLAS_NUM_THREADS=1` / `OMP_NUM_THREADS=1` / `GOTO_NUM_THREADS=1`,以减少多 runtime 并发时的线程争抢。
CUDA vLLM 与 CPU Rust 路径下,`word_timestamps=true` 会自动调用 forced aligner 返回字词级时间戳。
### 离线交付目录导出
如果你需要把镜像交付到不能联网的机器,推荐直接生成一个完整的离线交付目录。该脚本使用普通 `docker build` + `docker save`,不依赖 `buildx`:
```bash
# 生成 GPU 离线交付目录
./export_offline_bundle.sh --type gpu
# 或生成 CPU 离线交付目录
./export_offline_bundle.sh --type cpu
# 或生成沐曦 GPU 离线交付目录
./export_offline_bundle.sh \
--type metax \
--metax-base cr.metax-tech.com/public-ai-release/maca/vllm-metax:0.17.0-maca.ai3.5.3.307-torch2.8-py312-ubuntu22.04-amd64 \
--skip-models
./export_offline_bundle.sh --type iluvatar --iluvatar-base registry.iluvatar.com.cn:10443/customer/sz/vllm0.17.0-4.4.0-x86:v5
./export_offline_bundle.sh --type mthreads --mthreads-base registry.mthreads.com/presale/devtech/vllm_musa:s4000_4.3.5_d0519
# 或一次同时生成 GPU + CPU 离线交付目录
./export_offline_bundle.sh --type all
```
生成后的目录形如:
```text
build-file/
20260520_153000-all/
qwen3-asr-cpu-20260520_153000-amd64.tar.gz
qwen3-asr-gpu-20260520_153000-amd64.tar.gz
docker-compose.yml
docker-compose-cpu.yml
docker-compose-metax.yml
.env.example
init_host_dirs.sh
README.md
DEPLOYMENT.md
```
其中会自动包含:
- 对应类型的一份或两份镜像压缩包
- 对应类型的 compose 文件;天数包只包含 `docker-compose-iluvatar.yml`
- 摩尔线程包只包含 `docker-compose-mthreads.yml`
- `.env` 模板
- 宿主机目录初始化脚本
- 离线部署说明文档
模型文件建议使用 `./scripts/download-models.sh --models-dir /opt/dep/asr/models` 单独准备;该脚本增量补齐缺失模型,不删除已有目录,也不依赖 uv。
当前运行时 / 设备默认值以主 README 为准:
- `README.md`
- `docs/README_zh.md`
设计背景与实现思路可参考:
- 当前 Qwen3 后端:`NVIDIA/沐曦 GPU -> vLLM`、`CPU/macOS -> vendored QwenASR Rust`
- 引用项目 [QwenASR](https://github.com/huanglizhuo/QwenASR)
### macOS / Apple Silicon 本地部署
适用于 M1/M2/M3/M4 机器上的本地 Qwen3-ASR 推理。当前 macOS 已统一走 vendored QwenASR Rust CPU backend。
```bash
./scripts/sync_cpu_env.sh
source .venv/bin/activate
python start.py
```
### 验证部署
```bash
# 健康检查
curl http://localhost:17003/stream/v1/asr/health
# 查看可用模型
curl http://localhost:17003/stream/v1/asr/models
# 测试语音识别(阿里云协议)
curl -X POST "http://localhost:17003/stream/v1/asr" \
-H "Content-Type: application/octet-stream" \
--data-binary @test.wav
# 测试 OpenAI 兼容接口
curl -X POST "http://localhost:17003/v1/audio/transcriptions" \
-H "Authorization: Bearer any" \
-F "file=@test.wav" \
-F "model=qwen3-asr-1.7b"
```
## 从源码构建镜像
### 使用构建脚本
项目提供了一个更薄的 `scripts/build_docker.sh` 包装层,用于统一 `docker buildx` 参数:
```bash
# 构建所有版本(CPU + GPU)
./scripts/build_docker.sh
# 仅构建 GPU 版本
./scripts/build_docker.sh -t gpu
# 构建指定版本并推送
./scripts/build_docker.sh -t all -v 1.0.1 -p
# 查看帮助
./scripts/build_docker.sh -h
```
**构建脚本参数:**
| 参数 | 说明 | 默认值 |
|------|------|--------|
| `-a, --arch` | 目标架构: `amd64`, `arm64`, `multi` | `amd64` |
| `-t, --type` | 构建类型: `cpu`, `gpu`, `all` | `all` |
| `-v, --version` | 版本标签 | `latest` |
| `-p, --push` | 构建后推送到 Docker Hub | 否 |
| `-e, --export` | 导出单架构镜像为 tar.gz | 否 |
| `-o, --output` | 导出目录 | `.` |
| `-r, --registry` | 镜像仓库 | `unis` |
| `-n, --no-cache` | 禁用 Docker 构建缓存 | 否 |
### 手动构建
```bash
# 构建 CPU 版本
docker build -t qwen3-asr:cpu-latest -f Dockerfile.cpu .
# 构建绑定当前机器指令集的 CPU 版本(仅适合同构部署)
docker build -t qwen3-asr:cpu-native -f Dockerfile.cpu \
--build-arg QWENASR_RUST_TARGET_CPU=native \
.
# 构建默认 GPU 版本(CUDA 13.0 / PyTorch cu130)
docker build -t qwen3-asr:gpu-cu130 -f Dockerfile.gpu .
# 构建 CUDA 12.6 版本
docker build -t qwen3-asr:gpu-cu126 -f Dockerfile.gpu \
--build-arg PYTORCH_BASE_IMAGE=pytorch/pytorch:2.11.0-cuda12.6-cudnn9-runtime \
--build-arg PYTORCH_CUDA_INDEX=https://download.pytorch.org/whl/cu126 \
--build-arg CUDA_NVCC_PACKAGE=cuda-nvcc-12-6 \
--build-arg TORCH_CUDA_ARCH_LIST="8.0;8.6;8.9" \
.
# 构建 CUDA 13.0 版本
docker build -t qwen3-asr:gpu-cu130 -f Dockerfile.gpu \
--build-arg PYTORCH_BASE_IMAGE=pytorch/pytorch:2.11.0-cuda13.0-cudnn9-runtime \
--build-arg PYTORCH_CUDA_INDEX=https://download.pytorch.org/whl/cu130 \
--build-arg CUDA_NVCC_PACKAGE=cuda-nvcc-13-0 \
--build-arg TORCH_CUDA_ARCH_LIST="12.0+PTX" \
.
```
`Dockerfile.cpu` 可覆盖的 CPU 构建参数:
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `QWENASR_RUST_TARGET_CPU` | `x86-64-v2` | amd64 Rust backend 编译目标;可设为 `native` 构建绑定当前 CPU 的镜像 |
`Dockerfile.gpu` 可覆盖的 GPU 构建参数:
| 参数 | 默认值 | 用途 |
|------|--------|------|
| `PYTORCH_BASE_IMAGE` | `pytorch/pytorch:2.11.0-cuda13.0-cudnn9-runtime` | 选择 PyTorch/CUDA 基础镜像 |
| `PYTORCH_CUDA_INDEX` | `https://download.pytorch.org/whl/cu130` | 选择 PyTorch wheel CUDA 后端 |
| `CUDA_NVCC_PACKAGE` | `cuda-nvcc-13-0` | 安装匹配的 nvcc,用于 vLLM/FlashInfer JIT |
| `TORCH_CUDA_ARCH_LIST` | `12.0+PTX` | 指定 JIT 编译目标架构 |
| `VLLM_PACKAGE` | `vllm==0.20.0` | 覆盖 vLLM 包版本或来源 |
### 模型说明
服务支持以下 ASR 模型:
| 模型 | 说明 | 适用场景 |
|------|------|----------|
| Qwen3-ASR-1.7B ⭐ | 多语言 ASR(52种语言+方言,字级时间戳) | CUDA |
| Qwen3-ASR-0.6B | 轻量版多语言 ASR | CUDA / CPU Rust / macOS |
**运行时模型选择:**
系统根据机器资源自动选择合适的 Qwen3-ASR 模型:
- **显存 >= 32GB**: 自动加载 `qwen3-asr-1.7b`
- **显存 < 32GB**: 自动加载 `qwen3-asr-0.6b`
- **无 CUDA**: 自动加载基于 vendored Rust 的 `qwen3-asr-0.6b`
- **macOS / Apple Silicon**: 无论内存大小多少,默认都加载 `qwen3-asr-0.6b`
- **环境变量覆盖**: 设置 `QWEN3_ASR_MODEL=qwen3-asr-1.7b` 或 `QWEN3_ASR_MODEL=qwen3-asr-0.6b` 可硬覆盖自动选择
### 模型下载
启动时会先检测当前运行计划所需模型;如果本地缓存缺失,会自动从 ModelScope 下载。离线部署请提前准备模型缓存。
手动准备方式:
```bash
# 增量补齐离线部署所需模型,不删除已有文件
./scripts/download-models.sh --models-dir /opt/dep/asr/models
# 如果本机缺少 Python 依赖,也可以使用已构建镜像下载
ASR_IMAGE=unis/qwen3-asr:iluvatar-vllm0.17.0-4.4.0-v5 \
./scripts/download-models.sh --mode docker --models-dir /opt/dep/asr/models
```
离线部署时,推荐目录结构:
```text
/opt/dep/asr/models/
Qwen/
iic/
damo/
```
然后保持与 compose 文件一致的挂载:
```yaml
volumes:
- ${MODEL_STORAGE_DIR:-/opt/dep/asr/models}:/app/models
- ${DATA_STORAGE_DIR:-/opt/dep/asr/data}:/app/data
```
## 环境变量配置
### 基础配置
| 环境变量 | 默认值 | 说明 |
|----------|--------|------|
| `HOST` | `0.0.0.0` | 服务绑定地址 |
| `PORT` | `8000` | 服务端口 |
| `DEBUG` | `false` | 调试模式(启用后可访问 /docs) |
| `LOG_LEVEL` | `INFO` | 日志级别:DEBUG, INFO, WARNING, ERROR |
| `WORKERS` | `1` | 工作进程数(多进程会复制模型,显存成倍增加) |
| `MAX_AUDIO_SIZE` | `2048` | 最大音频文件大小(MB,支持单位如 2GB) |
| `API_KEY` | - | 服务端统一鉴权密钥 |
### 设备配置
| 环境变量 | 默认值 | 说明 |
|----------|--------|------|
| `DEVICE` | `auto` | 设备选择:`auto`, `cpu`, `cuda:0` |
| `ASR_VISIBLE_DEVICES` | `0` | 统一可见 GPU 设备配置,程序会按当前 accelerator 自动映射到底层变量 |
| `ASR_DEPLOY_TOPOLOGY` | `isolated` | 部署拓扑:`isolated`, `sharded`, `auto` |
### 内置 Nginx 与限流配置
| 环境变量 | 默认值 | 说明 |
|----------|--------|------|
| `NGINX_RATE_LIMIT_RPS` | `0` | 全局每秒请求上限,`0` 表示关闭 |
| `NGINX_RATE_LIMIT_BURST` | `0` | 全局突发请求数,`0` 时自动取 `NGINX_RATE_LIMIT_RPS` |
### ASR 模型配置
| 环境变量 | 默认值 | 说明 |
|----------|--------|------|
| `ASR_ENABLE_REALTIME_PUNC` | `true` | 是否启用实时标点模型 |
### 性能优化配置
| 环境变量 | 默认值 | 说明 |
|----------|--------|------|
| `ASR_BATCH_SIZE` | `4` | 长音频分段后的 ASR 批处理大小 |
| `INFERENCE_THREAD_POOL_SIZE` | 自动 | 推理线程池大小;默认按 CPU 核数自动设置 |
| `MAX_SEGMENT_SEC` | `60` | 音频分段最大时长(秒) |
| `QWEN_GPU_MEMORY_UTILIZATION` | `0.9` | vLLM 可保留的 GPU 显存上限,KV cache 不足时可适当调高 |
| `QWEN_VLLM_ENFORCE_EAGER` | `true` | 强制 vLLM eager 执行以提高兼容性;NVIDIA 性能测试可设为 `false` 允许 CUDA Graph 优化 |
| `WS_MAX_BUFFER_SIZE` | `160000` | WebSocket 音频缓冲区大小(样本数) |
| `QWEN_RUST_CPU_WORKERS` | `4` | CPU Rust backend worker 数;Rust ASR / forced align 默认按该数量并行 |
| `QWEN_RUST_ASR_CONCURRENCY` | `0` | Rust ASR 阶段批内并行度;`0` 表示跟随 `QWEN_RUST_CPU_WORKERS` |
| `QWEN_RUST_ALIGN_CONCURRENCY` | `0` | Rust forced align 阶段批内并行度;`0` 表示跟随 `QWEN_RUST_CPU_WORKERS` |
| `QWENASR_LIBRARY_PATH` | 自动探测 | 覆盖 vendored Rust 动态库路径 |
### 远场过滤配置
流式 ASR 远场声音过滤功能,自动过滤远场声音和环境音:
| 环境变量 | 默认值 | 说明 |
|----------|--------|------|
| `ASR_ENABLE_NEARFIELD_FILTER` | `true` | 启用远场声音过滤 |
| `ASR_NEARFIELD_RMS_THRESHOLD` | `0.01` | RMS 能量阈值 |
| `LOG_LEVEL=DEBUG` | - | 需要观察过滤细节时打开调试日志 |
调优建议:
- `ASR_NEARFIELD_RMS_THRESHOLD=0.01` 是当前默认值,也是推荐起点
- 嘈杂环境可以适当调高,增强背景语音过滤
- 安静环境如果出现小声说话漏识别,可以适当调低
- 需要观察过滤行为时,可临时设置 `LOG_LEVEL=DEBUG`
### 鉴权配置
| 环境变量 | 默认值 | 说明 |
|----------|--------|------|
| `API_KEY` | - | 服务端统一鉴权密钥;同时兼容 `Authorization: Bearer` 和 `X-NLS-Token` |
**使用示例:**
```bash
# 使用 Token
curl -H "X-NLS-Token: your_token" http://localhost:8000/stream/v1/asr/health
# 使用 Bearer Token(OpenAI 兼容)
curl -H "Authorization: Bearer your_token" http://localhost:8000/v1/models
```
### 日志配置
| 环境变量 | 默认值 | 说明 |
|----------|--------|------|
| `LOG_LEVEL` | `INFO` | 日志级别:`DEBUG`, `INFO`, `WARNING` |
| `LOG_FILE` | `data/logs/qwen3-asr.log` | 日志文件路径 |
| `LOG_MAX_BYTES` | `20971520` | 单个日志文件最大大小(20MB) |
| `LOG_BACKUP_COUNT` | `50` | 日志备份文件数量 |
## Docker Compose 配置
### 基础配置(GPU)
```yaml
services:
qwen3-asr:
image: unis/qwen3-asr:gpu-latest
container_name: qwen3-asr
ports:
- "17003:8000"
volumes:
- /opt/dep/asr/models:/app/models
- /opt/dep/asr/data:/app/data
environment:
- DEBUG=false
- LOG_LEVEL=INFO
- DEVICE=auto
- QWEN_GPU_MEMORY_UTILIZATION=0.3
- QWEN_VLLM_ENFORCE_EAGER=true
- ASR_BATCH_SIZE=4
- WORKERS=1
- INFERENCE_THREAD_POOL_SIZE=4
restart: unless-stopped
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
```
### CPU 版本配置
```yaml
services:
qwen3-asr:
image: unis/qwen3-asr:cpu-latest
container_name: qwen3-asr
ports:
- "17003:8000"
volumes:
- /opt/dep/asr/models:/app/models
- /opt/dep/asr/data:/app/data
environment:
- DEBUG=false
- LOG_LEVEL=INFO
- DEVICE=cpu
- WORKERS=1
- INFERENCE_THREAD_POOL_SIZE=1
restart: unless-stopped
```
### 生产环境配置(内置 Nginx,推荐)
```yaml
services:
qwen3-asr:
image: unis/qwen3-asr:gpu-latest
container_name: qwen3-asr
ports:
- "17003:8000"
volumes:
- /opt/dep/asr/models:/app/models
- /opt/dep/asr/data:/app/data
environment:
- DEBUG=false
- LOG_LEVEL=INFO
- DEVICE=auto
- CUDA_VISIBLE_DEVICES=0,1
- QWEN_GPU_MEMORY_UTILIZATION=0.3
- QWEN_VLLM_ENFORCE_EAGER=true
- NGINX_RATE_LIMIT_RPS=20
- NGINX_RATE_LIMIT_BURST=40
- WORKERS=1
- INFERENCE_THREAD_POOL_SIZE=4
- ASR_BATCH_SIZE=4
restart: unless-stopped
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
```
## 服务监控
### 健康检查
```bash
curl http://localhost:17003/stream/v1/asr/health
```
### 日志监控
```bash
# 实时查看日志
docker logs -f qwen3-asr
# 查看错误日志
docker logs qwen3-asr 2>&1 | grep -i error
```
### 资源监控
```bash
# 容器资源使用
docker stats qwen3-asr
# GPU 使用情况
docker exec -it qwen3-asr nvidia-smi
```
## 资源需求
### 最小配置(CPU 版本)
- CPU: 4 核
- 内存: 8GB
- 磁盘: 10GB
### 推荐配置(GPU 版本)
- CPU: 8 核
- 内存: 16GB
- GPU: NVIDIA GPU (12GB+ 显存,含说话人分离模型)
- 磁盘: 25GB
## 故障排除
### 常见问题
| 问题 | 症状 | 解决方案 |
|------|------|----------|
| GPU 内存不足 | CUDA OOM 错误 | 设置 `DEVICE=cpu` 或使用更大显存的 GPU |
| 模型加载失败 / 缓慢 | 本地模型缓存缺失 | 先运行 `./scripts/download-models.sh --models-dir /opt/dep/asr/models` 预准备模型 |
| 端口被占用 | 端口冲突错误 | 修改端口映射:`"8080:8000"` |
| 说话人分离失败 | CAM++ 模型错误 | 检查模型是否完整下载,显存是否充足 |
### 调试模式
```bash
# 启用调试模式
docker run -e DEBUG=true -e LOG_LEVEL=DEBUG ...
# 进入容器调试
docker exec -it qwen3-asr /bin/bash
```
## 更新服务
```bash
# 拉取最新镜像(GPU 版本)
docker pull unis/qwen3-asr:gpu-latest
# 拉取最新镜像(CPU 版本)
docker pull unis/qwen3-asr:cpu-latest
# 重启服务
docker-compose down && docker-compose up -d
```