perf: ASR GPU 利用率优化 — batch_size 16→32 + beam_size 5→2

faster-whisper 的 GPU 利用率呈尖刺波(峰=批量解码满载,谷=CPU 提取 Mel
特征 + 处理结果时 GPU 空闲),平均利用率低。瓶颈不在算力而在 CPU/GPU
未重叠。

- batch_size 16→32:拉长单次 GPU 解码时间,相对掩盖 CPU 特征提取间隙,
  尖刺变宽变平,平均利用率上升。turbo FP16 仅 ~1.6GB,3090 24G 充裕。
- beam_size 5→2:turbo 模型鲁棒,候选数 5→2 大幅减少解码步数,让 GPU
  峰更密、间隙更短。保留 1 个候选做歧义发音保险,质量损失小。
- beam_size 从硬编码提到 config 可调,CPU/CPU 模板/GPU/示例 四份配置对齐
- /health 增加 asr_beam_size,模型加载日志同步输出 batch+beam

word_timestamps 保留 True:segmenter 强依赖词级时间戳做精确断句,
关闭会触发匀速估算退化路径,得不偿失。
This commit is contained in:
audio2text dev
2026-07-06 22:28:37 +08:00
parent e0dd987dba
commit a6b5c7231c
7 changed files with 10 additions and 4 deletions

View File

@@ -48,6 +48,7 @@ class AsrConfig(BaseModel):
word_timestamps: bool = True word_timestamps: bool = True
vad_filter: bool = True vad_filter: bool = True
batch_size: int = 8 # BatchedInferencePipeline 的音频块批大小GPU 建议 16 batch_size: int = 8 # BatchedInferencePipeline 的音频块批大小GPU 建议 16
beam_size: int = 5 # beam search 宽度GPU turbo 可降到 2 加速(候选数↓ 解码步数↓),质量损失小
class TranslationConfig(BaseModel): class TranslationConfig(BaseModel):

View File

@@ -171,6 +171,7 @@ def create_app() -> FastAPI:
info["asr_model"] = s.asr.model info["asr_model"] = s.asr.model
info["asr_compute_type"] = s.asr.compute_type info["asr_compute_type"] = s.asr.compute_type
info["asr_batch_size"] = s.asr.batch_size info["asr_batch_size"] = s.asr.batch_size
info["asr_beam_size"] = s.asr.beam_size
info["asr_language"] = s.asr.language info["asr_language"] = s.asr.language
info["translation_device"] = s.translation.device info["translation_device"] = s.translation.device
info["translation_model"] = s.translation.model info["translation_model"] = s.translation.model

View File

@@ -37,7 +37,7 @@ def transcribe(wav_path: Path) -> list[Segment]:
language=s.language, language=s.language,
word_timestamps=s.word_timestamps, word_timestamps=s.word_timestamps,
vad_filter=s.vad_filter, vad_filter=s.vad_filter,
beam_size=5, beam_size=s.beam_size, # beam search 宽度config 可调GPU turbo 建议降到 2 加速
batch_size=s.batch_size, # 批量解码:多音频块一次性送 GPU batch_size=s.batch_size, # 批量解码:多音频块一次性送 GPU
without_timestamps=False, # BatchedInferencePipeline 默认 True需显式关闭以生成段级时间戳 without_timestamps=False, # BatchedInferencePipeline 默认 True需显式关闭以生成段级时间戳
) )

View File

@@ -65,7 +65,8 @@ class ModelManager:
) )
self._asr = BatchedInferencePipeline(model=whisper) self._asr = BatchedInferencePipeline(model=whisper)
self._current = "asr" self._current = "asr"
logger.info("ASR 模型已就绪batched, batch_size=%d)。", s.batch_size) logger.info("ASR 模型已就绪batched, batch_size=%d, beam_size=%d)。",
s.batch_size, s.beam_size)
return self._asr return self._asr
def unload_asr(self) -> None: def unload_asr(self) -> None:

View File

@@ -31,6 +31,7 @@ asr:
word_timestamps: true word_timestamps: true
vad_filter: true vad_filter: true
batch_size: 8 # CPU 无 GPU 并行收益,保持小批 batch_size: 8 # CPU 无 GPU 并行收益,保持小批
beam_size: 5 # tiny.en CPU 质量优先,保持默认 beam无加速诉求
translation: translation:
model: Helsinki-NLP/opus-mt-en-zh # 最轻量英译中(~300MBNLLB-600M 需 ~2.4GB2GB 机 OOM model: Helsinki-NLP/opus-mt-en-zh # 最轻量英译中(~300MBNLLB-600M 需 ~2.4GB2GB 机 OOM

View File

@@ -32,7 +32,8 @@ asr:
language: en # 仅英语 language: en # 仅英语
word_timestamps: true # 词级时间戳:让断句精确而非纯匀速估算 word_timestamps: true # 词级时间戳:让断句精确而非纯匀速估算
vad_filter: true # 过滤静音段,提升质量与速度 vad_filter: true # 过滤静音段,提升质量与速度
batch_size: 8 # CPU: 8 | GPU: 16BatchedInferencePipeline 批量解码音频块) batch_size: 8 # CPU: 8 | GPU: 32BatchedInferencePipeline 批量解码音频块,拉长单次 GPU 解码掩盖 CPU 特征提取间隙
beam_size: 5 # CPU: 5默认| GPU: 2turbo 鲁棒可降,候选数↓解码步数↓,加速明显质量损失小)
translation: translation:
# CPU devHelsinki-NLP/opus-mt-en-zh~300MB2GB 内存可跑) # CPU devHelsinki-NLP/opus-mt-en-zh~300MB2GB 内存可跑)

View File

@@ -29,7 +29,8 @@ asr:
language: en language: en
word_timestamps: true word_timestamps: true
vad_filter: true vad_filter: true
batch_size: 16 # BatchedInferencePipeline每批解码 16 个 30s 音频块,填充 GPU batch_size: 32 # BatchedInferencePipeline每批解码 32 个 30s 音频块,拉长单次 GPU 解码掩盖 CPU 特征提取间隙
beam_size: 2 # turbo 鲁棒beam=2 留一个候选做保险vs beam=5 候选数↓ 解码步数↓,加速明显质量损失小)
translation: translation:
model: facebook/nllb-200-distilled-1.3B # 质量最好 model: facebook/nllb-200-distilled-1.3B # 质量最好