test/scripts/benchmark/README.md

199 lines
6.1 KiB
Markdown

# Qwen3-ASR 并发性能测试脚本
测试 ASR/TTS WebSocket 服务在不同并发级别下的性能表现。
## 依赖
```bash
./scripts/sync_cpu_env.sh
```
## 快速开始
### 1. 启动服务
```bash
# 在项目根目录
source .venv/bin/activate
python start.py
```
### 2. 运行测试
```bash
# 完整测试 (ASR + TTS)
.venv/bin/python -m scripts.benchmark.run --audio-file /path/to/audio.wav
# 仅测试 TTS (无需音频文件)
.venv/bin/python -m scripts.benchmark.run --test-type tts
# 仅测试 ASR
.venv/bin/python -m scripts.benchmark.run --audio-file /path/to/audio.wav --test-type asr
# Qwen Rust CPU 固定配置跑测(固定 VAD 分段)
.venv/bin/python -m scripts.benchmark.qwen_rust_sensitivity \
--audio-file /path/to/audio.wav
```
## 命令行参数
| 参数 | 默认值 | 说明 |
|------|--------|------|
| `--host` | localhost | 服务器主机名 |
| `--port` | 8000 | 服务器端口 |
| `--audio-file` | - | ASR 测试音频文件路径 (测试 ASR 时必需) |
| `--test-type` | both | 测试类型: `asr` / `tts` / `both` |
| `--concurrency` | 5 10 20 50 | 并发级别列表 |
| `--output` | ./benchmark_results | 报告输出目录 |
| `--timeout` | 120 | 请求超时时间 (秒) |
| `--voice` | 中文女 | TTS 测试音色 |
## Qwen Rust CPU 固定配置跑测
用于对 vendored Rust backend 做固定 workload 的端到端对比:
- 同一组 VAD 分段
- Rust ASR
- Rust forced align
- 跑当前环境变量指定的 Rust 并发配置
示例:
```bash
# 直接跑当前配置
.venv/bin/python -m scripts.benchmark.qwen_rust_sensitivity \
--audio-file temp/podcast_demo_10min_16k.wav \
--json-out temp/qwen_rust_runtime_config.json
# 通过环境变量切换不同并发配置后再跑
QWEN_RUST_CPU_WORKERS=8 \
QWEN_RUST_ASR_CONCURRENCY=8 \
QWEN_RUST_ALIGN_CONCURRENCY=4 \
.venv/bin/python -m scripts.benchmark.qwen_rust_sensitivity \
--audio-file temp/podcast_demo_10min_16k.wav \
--json-out temp/qwen_rust_runtime_config.json
```
说明:
- 脚本只跑当前一组配置
- 并发度由 `QWEN_RUST_CPU_WORKERS`、`QWEN_RUST_ASR_CONCURRENCY`、`QWEN_RUST_ALIGN_CONCURRENCY` 控制
- 跑完后会输出一条进度日志,并写入 `--json-out`
- 如果传了 `--json-out`,脚本还会自动生成同名 `.md` 中文对比报告
- 也可以显式指定 Markdown 路径:
```bash
.venv/bin/python -m scripts.benchmark.qwen_rust_sensitivity \
--audio-file temp/podcast_demo_10min_16k.wav \
--json-out temp/qwen_rust_runtime_config.json \
--markdown-out temp/qwen_rust_runtime_config_report.md
```
### TTS 流式模拟配置 (config.py)
TTS 测试模拟 LLM 流式输出场景,按标点符号(逗号、句号、顿号等)分割文本逐步发送:
| 配置项 | 默认值 | 说明 |
|--------|--------|------|
| `tts_chunk_interval` | 0.05 | 发送间隔秒数 (模拟 LLM 生成速度) |
## 使用示例
```bash
# 自定义并发级别
.venv/bin/python -m scripts.benchmark.run \
--audio-file test.wav \
--concurrency 5 10 20 50 100
# 连接远程服务器
.venv/bin/python -m scripts.benchmark.run \
--host 192.168.1.100 \
--port 8000 \
--test-type tts
# 使用不同音色测试 TTS
.venv/bin/python -m scripts.benchmark.run \
--test-type tts \
--voice 中文男
```
## 测试指标
### ASR 指标
- **首次响应延迟**: 从开始到收到第一个识别结果的时间
- **总处理时间**: 从开始到识别完成的总时间
- **RTF**: 处理时间 / 音频时长 (小于 1.0 表示快于实时)
### TTS 指标
- **首包延迟**: 从发送文本到收到第一个音频块的时间
- **总合成时间**: 从开始到合成完成的总时间
- **RTF**: 合成时间 / 生成音频时长
### 统计维度
每个指标计算: 平均值 (Avg)、P50、P95、P99、最大值 (Max)
## 输出文件
测试完成后在输出目录生成:
```
benchmark_results/
├── benchmark_report_20241202_143000.md # Markdown 报告
├── first_latency_20241202_143000.png # 首次响应延迟图
├── rtf_20241202_143000.png # RTF 对比图
├── throughput_20241202_143000.png # 吞吐量图
└── total_time_20241202_143000.png # 总时间图
```
## 报告示例
```markdown
## ASR 性能测试结果
### 延迟指标 (毫秒)
| 并发数 | 首次响应 (Avg) | 首次响应 (P95) | 总时间 (Avg) | 总时间 (P95) |
|--------|---------------|---------------|-------------|-------------|
| 5 | 245.3 | 312.5 | 62345.2 | 63521.4 |
| 10 | 289.7 | 425.3 | 63245.8 | 65123.6 |
### RTF 和吞吐量
| 并发数 | RTF (Avg) | RTF (P95) | 吞吐量 (req/s) | 成功率 |
|--------|----------|----------|---------------|--------|
| 5 | 1.04 | 1.06 | 0.08 | 100% |
| 10 | 1.05 | 1.08 | 0.16 | 100% |
```
## 目录结构
```
scripts/benchmark/
├── run.py # 主入口脚本
├── config.py # 测试配置
├── clients/
│ ├── base_client.py # WebSocket 客户端基类
│ ├── asr_client.py # ASR 测试客户端
│ └── tts_client.py # TTS 测试客户端
├── metrics/
│ ├── models.py # 指标数据类
│ └── statistics.py # 统计计算
├── reporters/
│ ├── markdown_reporter.py # Markdown 报告生成
│ └── chart_generator.py # 图表生成
└── utils/
├── audio_utils.py # 音频文件处理
└── text_generator.py # 测试文本生成
```
## 注意事项
1. **ASR 测试需要音频文件**: 建议使用 1 分钟左右的音频,格式支持 wav/mp3 等常见格式
2. **TTS 测试自动生成文本**: 使用内置的中文随机句子生成器,无需额外准备
3. **TTS 模拟流式输入**: 测试会按标点符号(逗号、句号、顿号等)分割文本逐步发送,模拟 LLM 流式输出场景
4. **并发测试会占用资源**: 高并发测试时请确保服务器有足够资源
5. **RTF 解读**:
- RTF < 1.0: 处理速度快于实时,性能良好
- RTF ≈ 1.0: 刚好实时处理
- RTF > 1.0: 处理速度慢于实时,可能出现延迟累积