🗣️

whisper.cppのGPU対応を試す

2023/05/02に公開

前提

whisper.cppのGPU対応の兆しが前々からあったのですが、昨日ついにmainブランチにマージされたみたいなので早速試してみます。
https://github.com/ggerganov/whisper.cpp/commit/5fd1bdd7fc501d1a94dcedf80ec539f696deaf3f

https://github.com/ggerganov/whisper.cpp#nvidia-gpu-support-via-cublas

また、環境は以下です。

  • Ubuntu 22.04
  • RTX3060(12GB)
  • DockerにてGPU利用環境構築済み

whisper.cppのセットアップ

https://github.com/ggerganov/whisper.cpp.git

git clone https://github.com/ggerganov/whisper.cpp.git
cd whisper.cpp

今回はDockerを使うので、以下のDockerfileを追加します。

FROM nvidia/cuda:12.1.1-cudnn8-devel-ubuntu22.04

WORKDIR /app
COPY . .

RUN make clean
RUN WHISPER_CUBLAS=1 make -j

CMD ["make", "large"]

最後にビルドします。

sudo docker build -t ${USER}:whisper.cpp . # sudoを付けるかは環境による

実行

$ sudo docker run --gpus all -it --rm ${USER}:whisper.cpp
<中略>

[00:00:00.000 --> 00:00:11.000]   And so my fellow Americans, ask not what your country can do for you, ask what you can do for your country.

whisper_print_timings:     load time =  2863.66 ms
whisper_print_timings:     fallbacks =   0 p /   0 h
whisper_print_timings:      mel time =   174.98 ms
whisper_print_timings:   sample time =    11.01 ms /    27 runs (    0.41 ms per run)
whisper_print_timings:   encode time =  9552.53 ms /     1 runs ( 9552.53 ms per run)
whisper_print_timings:   decode time =  3025.21 ms /    27 runs (  112.04 ms per run)
whisper_print_timings:    total time = 15830.64 ms

実行できました。
GPUを使っていることもnvtopで確認できました。

任意の音源の書き起こしをする場合は、volumeをマウントしてください。

sudo docker run --gpus all -it --rm -v $(pwd)/voices:/app/voices ${USER}:whisper.cpp \
 ./main -m models/ggml-large.bin -l ja -f /app/voices/audio.wav

ざっくりのパフォーマンス考察

僕の環境だと10分の音源の書き起こしにCPUだと24分、今回のGPUありで11分でした。
GPU使っていると2倍強速かったことにはなりますが、GPUを全然使い切れていないのが気になりました。

書き起こし中も停止している時間が断続的にあり、GPUを利用したとしても100%になってないので、今後に期待という感じですね(もしかしたら最適なパラメータを渡せば速くなるのかもしれませんが)

ちなみにwhisper高速化兄弟のwhisper-jaxだとGPUをほぼに使ってくれるので、RTX3600環境で10分の音源を3分程度で書き起こししてくれました。

GPU環境があるのであれば、whisper-jaxが最速の可能性があります。
faster-whisperもあるので、速度比較してみたいです。
https://github.com/guillaumekln/faster-whisper

→ 試しました。速報値としてはGPUを使うと10分の書き起こしが1分でした。10倍すごい…。

Discussion