700 lines
22 KiB
Markdown
700 lines
22 KiB
Markdown
# 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
|
||
```
|