cuda out of memory

这个报错出现在 Windows 上使用 Faster Whisper 加载 CUDA 模型转写音频时,进程会在模型卸载(变量离开作用域或手动释放)的瞬间以 -1073740791 (0xC0000409) 退出;如果加载显存过大的模型也可能直接出现 cuda out of memory。优先排查的方

快速结论:这个报错出现在 Windows 上使用 Faster Whisper 加载 CUDA 模型转写音频时,进程会在模型卸载(变量离开作用域或手动释放)的瞬间以 -1073740791 (0xC0000409) 退出;如果加载显存过大的模型也可能直接出现 cuda out of memory。优先排查的方向是显存占用与模型生命周期,而不是音频格式或语言本身。

适用环境:Issue 中已确认的复现环境为 Windows 10、RTX 3060 Laptop(显存约 6000MB,运行时占用 4000-5000MB)、CUDA 11.7、cuDNN 8.8.0、Python 3.10.10(也尝试过 3.9.16),模型为 large-v2,语言 zh。维护者一方在 Windows 11、CUDA 11.8.0、cuDNN 8.8.1 上未能复现。

最快修复方案:Issue 中提问者最终采用的可行做法是把转写逻辑放到单独的子进程中运行,让崩溃只发生在子进程退出时,不影响主脚本。Issue 中明确给出的验证过的工作示例是使用 multiprocessing.Process + Manager 包装 model.transcribe()。

注意事项:子进程方案只是隔离崩溃,并非修复根因;Issue 中始终没有查出模型卸载时崩溃的确切原因。提问者还发现改用 compute_type="int8_float16" 无效,而 compute_type="float32" 会直接返回 cuda out of memory;手动 del model 有时不崩溃。维护者建议的 cuDNN 检查与显存不足只是可能方向,均未被最终确认。

问题场景

用户在 Windows 10 上用 Faster Whisper 的 WhisperModel 加载 large-v2 模型(device=”cuda”),对从视频中提取的中文音频(先用 ffmpeg 转成 16kHz 的 aac 或 mp3)执行 model.transcribe()。大约 90 个文件中有 5 个会稳定触发崩溃;一旦某个文件触发,重复处理该文件必然复现。用户把模型定义为函数内局部变量,函数结束时模型自动卸载,此时进程以 -1073740791 (0xC0000409) 退出。后续测试发现:把模型改为全局变量、只在程序结束时卸载,崩溃会推迟到全部任务完成之后;手动 del model 有时则不崩溃。

报错原文

Windows process returns -1073740791 (0xC0000409)
It returns -1073740791 (0xC0000409) when dealing with a audio file in chinese.

When I tried using compute_type = "float32", it failed and returned "cuda out of memory".

原因分析

可能原因是模型卸载阶段的显存/资源释放引发了 Windows 进程异常退出。Issue 中的证据链是:报错与显存相关(维护者怀疑显存不足,用户实测运行时占用 4000-5000MB,float32 直接报 cuda out of memory),并且崩溃时机与模型卸载强相关(局部变量退栈、全局变量程序结束、手动 del 三种卸载方式表现不同)。但提问者也指出 int8_float16 未解决问题,手动 del model 也不一定崩溃,因此显存不足与卸载崩溃的确切机制在 Issue 中并未定论。

另一条可能线索是 cuDNN 相关,同仓库 #64 报告过相同错误,维护者建议检查 cuDNN 安装;但提问者按 NVIDIA 文档安装后问题仍在,改用 medium-ct2 模型、切换语言或处理其他文件均正常,说明该错误对特定文件和特定模型配置敏感。

环境排查

  • 确认 Windows 版本(Issue 中复现环境为 Windows 10;维护者在 Windows 11 未复现)。
  • 确认 CUDA 与 cuDNN 版本,Issue 中复现环境为 CUDA 11.7、cuDNN 8.8.0,维护者验证环境为 CUDA 11.8.0、cuDNN 8.8.1。
  • 确认 Python 版本,Issue 中尝试过 3.10.10 与 3.9.16,均存在该问题。
  • 确认显卡与显存占用,Issue 中为 RTX 3060 Laptop,约 6000MB 显存,运行时占用 4000-5000MB。
  • 确认 faster-whisper 版本,提问者表示出错后第一时间已更新到当时最新版本。
  • 确认模型与 compute_type,Issue 中主要使用 large-v2 与 float16,另测试过 int8_float16 与 float32。
  • 确认是否已重新下载模型、重装 Python 环境,Issue 中这两项均已尝试,问题依旧。

解决步骤

  1. 先排除显存侧问题:确认转写时的显存占用,Issue 中怀疑模型对特定文件的内存需求超出可用显存。可优先尝试更小模型(提问者使用 medium-ct2 时未出现该问题),但这不是 Issue 中确认的修复方案。
  2. 在排查阶段可尝试切换 compute_type,但请注意 Issue 中 int8_float16 无效、float32 直接报 cuda out of memory,因此不要把它当作确定解法。
  3. 检查 cuDNN 安装是否符合当前 CUDA 版本(维护者建议,对应同仓库 #64),但提问者安装后问题仍存在。
  4. 采用 Issue 中验证可行的隔离方案:把模型加载与 model.transcribe() 放到单独子进程中执行,通过 multiprocessing.Manager() 把 segments 与 info 回传到主进程。
  5. 示例结构(来自 Issue 讨论):在子进程内创建 WhisperModel(model_size, device="cuda", compute_type="float16"),调用 model.transcribe(*argsList, beam_size=5),把 list(segments), info 写入 manager.list();主进程 p.join()、p.close() 后取出结果。
  6. 保留手动 del model 的测试结果:Issue 中提问者发现手动卸载有时不崩溃,可作为进一步定位模型卸载路径的线索。

验证方法

用之前必然触发崩溃的同一批音频文件(Issue 中约 90 个文件里有 5 个)重跑。采用子进程方案后,即使子进程因模型卸载以 -1073740791 退出,主脚本仍能继续运行并拿到转写结果,即视为规避成功。同时确认不再出现 cuda out of memory,且转写文本与 info 内容正常。

参考来源

SYSTRAN/faster-whisper #71

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29177

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注