十分钟把语音识别搬上显卡:whisper.cpp CUDA 加速教程
【免费下载链接】whisper.cppPort of OpenAI's Whisper model in C/C++项目地址: https://gitcode.com/GitHub_Trending/wh/whisper.cpp
昨晚试着转录一段两小时的播客,纯 CPU 跑 whisper-cli,第二天早上起来还没跑完。转折其实很简单:whisper.cpp 是 OpenAI Whisper 语音识别模型的 C/C++ 移植,它对 NVIDIA GPU 有一等公民级别的支持,开启 CUDA 做 GPU 加速后,同样的音频几分钟就能转完,精度也基本不掉。这篇就是带你从零走到"看到显卡真的在干活"的那一步。
三步编译出 CUDA 版本
动手前先花一分钟确认环境:终端里跑一下nvidia-smi,能看到显卡型号和显存就说明驱动正常;再跑nvcc --version,能看到 CUDA 工具链的版本说明编译器也装好了。两样齐了,编译本身只有两行:
cmake -B build -DGGML_CUDA=1 cmake --build build -j --config Release第一个参数就是全部关键:-DGGML_CUDA=1告诉构建系统把计算卸载到 GPU,缺了它编译出来的就是纯 CPU 版本。如果没有仓库代码,先克隆下来:
git clone https://gitcode.com/GitHub_Trending/wh/whisper.cpp cd whisper.cpp跑通第一条最小命令
模型不用自己训练或转换,仓库带了现成的下载脚本,一行拿到 ggml 格式的 base 英语模型:
./models/download-ggml-model.sh base.en然后用仓库自带的示例音频跑一条最小命令:
./build/bin/whisper-cli -m models/ggml-base.en.bin -f samples/jfk.wav几秒后终端会输出"Ask not what your country can do for you..."这段转录结果。想确认 GPU 真的参与了计算,最简单的办法是换一段长一点的音频,跑起来的同时另开一个终端看nvidia-smi:你能看到 whisper-cli 进程挂在进程列表里,显存占用和 GPU 利用率都会动。如果跑完了显存纹丝不动,别急着怀疑显卡,先往下翻到排查那节,九成是编译时 CUDA 没开。
模型按显存档位选
whisper.cpp 的模型从 tiny 到 large 一共五档,精度和速度大致正相关,选哪个基本由你的显存决定。下表是实践中的粗档位,供你直接对号入座:
| 模型 | 显存档位 | 适合的卡 | 一句话点评 |
|---|---|---|---|
| tiny / tiny.en | 约 1 GB | 2 GB 以上随便 | 跑通流程、快速验证首选 |
| base / base.en | 约 2 GB | 4 GB 卡 | 速度和精度的平衡点 |
| small / small.en | 约 4 GB | 6 GB 以上 | 日常转录够用,推荐起步 |
| medium / medium.en | 约 6 GB | 8 GB 卡 | 专业级精度 |
| large-v3 | 8 GB 以上 | 12 GB 以上 | 精度最高,速度最慢 |
两点小提醒:一是带.en后缀的模型只支持英语,如果你的音频是中文或混合语言,选不带后缀的版本;二是下载脚本的模型列表里本身就有一批量化版,比如base.en-q5_1、small.en-q5_1,显存紧张时可以直接下载量化版,省去自己量化的步骤。
显存不够时先翻这三个开关
如果你的卡比表格推荐的档位小一圈,或者报CUDA out of memory,按这个顺序试,每个开关都很便宜:
第一个开关是量化。把 fp16 的原始模型压成 q5_0 或 q8_0,显存占用能明显下降,q8_0 的精度损失几乎无感,q5_0 能省得更多、偶尔会掉一点字:
./build/bin/quantize models/ggml-base.en.bin models/ggml-base.en-q5_0.bin q5_0第二个开关是 flash attention。命令行加一个-fa参数即可开启,注意力部分的显存开销会降下来,长音频上尤其明显,代价是可以忽略的耗时变化。
第三个开关是把长音频切成小段。whisper-cli 支持偏移和时长两个参数(-ot和-od),你可以把两小时的音频按 10 分钟一段循环处理,每段处理完显存就释放掉,代价是需要自己写个循环拼结果,但这是最稳的兜底方案。
跑挂了:两类高频问题按顺序排查
编译了,但 CUDA 其实没生效。先看运行时的nvidia-smi:显存和利用率纹丝不动,就是信号。再往下查两件事,一是有没有装 CUDA 工具链(nvcc --version给不出版本就要先装),二是构建缓存里GGML_CUDA到底是不是 ON——去build/CMakeCache.txt里搜一下这个关键字就知道。确认没开后,用-DGGML_CUDA=1重新 configure 并完整重编一遍,注意别复用旧的 build 目录,删掉重来最省心。
显存爆掉了(CUDA out of memory)。先看nvidia-smi里还剩多少空闲、被谁占着,有时候只是浏览器或别的推理进程把显存吃光了,关掉就好。空间确实不够再改:换小一档或量化后的模型、开-fa、把音频切片分批跑,就是上一节三个开关的顺序,基本都能救回来。
继续深挖的三个方向
跑通之后,想理解 GPU 上到底发生了什么,可以直接读 ggml/src/ggml-cuda/ 里的 CUDA 内核实现,注意力、矩阵乘都有对应的.cu文件,配合编译选项(比如 FP16 计算、cuBLAS 与自研内核的取舍)看很有意思。想要完整应用而不是命令行,examples/ 目录下有流式识别、HTTP 服务端、基准测试等现成示例,每个都带自己的说明。想对照不同硬件的性能预期,scripts/bench-all-gg.txt 里沉淀了历次的基准数据。社区层面,仓库的 Discussions 和 issue 区是 CUDA 相关问题反馈最集中的地方,遇到奇怪的现象先去搜一遍,大概率有人踩过。
【免费下载链接】whisper.cppPort of OpenAI's Whisper model in C/C++项目地址: https://gitcode.com/GitHub_Trending/wh/whisper.cpp
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考