Whisper模型并发提升时性能下降问题求助
问题分析与优化方案
核心原因
你遇到的并发反而变慢的问题,本质是GPU显存耗尽触发了显存-内存交换:
- 每个Whisper medium模型占5GB显存,3个并发任务就占用15GB,接近你的16GB显存上限,此时GPU不得不把部分数据换到内存中,而内存的读写速度比显存慢几个数量级,直接导致每个进程的推理速度暴跌,总耗时反而增加。
- 额外的GPU进程上下文切换开销,进一步放大了性能损耗。
具体优化建议
1. 避免每个任务重复加载模型(最关键优化)
你的代码中每个Celery任务都会加载一次模型,这不仅浪费显存,还增加了大量加载时间。应该在Celery Worker启动时预加载模型,每个Worker进程只加载一次:
# 全局变量,每个Worker进程初始化时加载一次模型 model = None @celery.on_after_configure.connect def init_model(sender, **kwargs): global model # 可选:开启float16量化,大幅降低显存占用 model = whisper.load_model("medium", device="cuda", compute_type="float16") @celery.task(name="whisper") def whisper_task(datas): all_results = [] for audio in datas: # 关闭verbose减少IO开销 res = model.transcribe(audio, verbose=False) all_results.append(res) return all_results
2. 严格控制并发数(匹配显存容量)
- 未量化的medium模型:每个占5GB,16GB显存最多支持2个Worker进程(预留1-2GB给系统和推理临时数据),设置Celery并发数为
--concurrency=2。 - 开启float16量化后:模型显存占用降至2.5GB左右,可支持4-5个Worker进程,进一步提升并发效率。
3. 其他细节优化
- 音频预处理前置:把音频的加载、采样率转换等操作放到任务提交前完成,避免每个任务重复处理。
- 禁用不必要的功能:
transcribe时设置word_timestamps=False(如果不需要词级时间戳),减少计算量。 - 清理显存:任务结束后可手动调用
torch.cuda.empty_cache()释放临时显存,但预加载模型的情况下必要性较低。
预期效果
- 预加载模型后,每个Worker进程省去了模型加载时间,显存占用稳定在可控范围,不会触发内存交换。
- 并发数设为2时,总耗时应该能降到10-12分钟左右;开启量化后,并发4个的话耗时可进一步压缩到6-8分钟。
内容的提问来源于stack exchange,提问作者UnPapeur
相关产品推荐
相关产品推荐

