beatF5run

技術系の話とか、勉強会とか

WhisperをWSL2で動かそうとしたらCUDA errorが出た際の対処作業メモ

元ネタ

github.com

はじめに

OpenAIが発表した音声認識モデルをGPU付きのローカルのWSL2で動かそうとしてCUDA errorが出た対処の作業メモです。

手軽にWhisperを動かしたいだけならGoogle Colabで動くので

qiita.com

上記のブログ等を参考に手を動かしてみると早いです。ほんとWhisperすごい。

本ページではローカルのWSL2で動かしたときに遭遇したエラーへの対処を書きます。

環境

環境作成

今回はvenvを利用して環境を作りました。

$ mkdir whisper_run
$ cd whisper_run
$ python3 -m venv whisper_test
$ source ./whisper_test/bin/activate

ドライバ、CUDA Toolkitのアップデート

公式からたどって最新にしておきました。

learn.microsoft.com

Whisperのインストール

公式

GitHub - openai/whisper

こちらも公式にしたがいます。

$ pip install git+https://github.com/openai/whisper.git 
$ sudo apt update && sudo apt install ffmpeg

音声ファイルの準備

今回テスト用に『青空朗読』から音声ファイルをお借りしました。

※音声ファイルはダウンロードできますが、フリー音源ではないのでご注意ください

aozoraroudoku.jp

テストコード

これも公式から。

import whisper

model = whisper.load_model("small")
result = model.transcribe("rd745.mp3")
print(result["text"])

公式からmodelとファイル名を書き換えてます。 上記をsample.pyとして保存。

実行

$ python3 sample.py

実行結果(エラー)

$ python3 sample.py
Traceback (most recent call last):
  File "/home/yiw/dev/whisper_run/sample.py", line 4, in <module>
    result = model.transcribe("rd745.mp3")
  File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/whisper/transcribe.py", line 88, in transcribe
    _, probs = model.detect_language(segment)
  File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/torch/autograd/grad_mode.py", line 27, in decorate_context
    return func(*args, **kwargs)
  File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/whisper/decoding.py", line 43, in detect_language
    mel = model.encoder(mel)
  File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl
    return forward_call(*input, **kwargs)
  File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/whisper/model.py", line 156, in forward
    x = block(x)
  File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl
    return forward_call(*input, **kwargs)
  File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/whisper/model.py", line 127, in forward
    x = x + self.mlp(self.mlp_ln(x))
  File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl
    return forward_call(*input, **kwargs)
  File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/torch/nn/modules/container.py", line 139, in forward
    input = module(input)
  File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl
    return forward_call(*input, **kwargs)
  File "/home/yiw/dev/whisper_run/whisper_test/lib/python3.10/site-packages/whisper/model.py", line 36, in forward
    return F.linear(
RuntimeError: CUDA error: CUBLAS_STATUS_EXECUTION_FAILED when calling `cublasGemmEx( handle, opa, opb, m, n, k, &falpha, a, CUDA_R_16F, lda, b, CUDA_R_16F, ldb, &fbeta, c, CUDA_R_16F, ldc, CUDA_R_32F, CUBLAS_GEMM_DFALT_TENSOR_OP)`

RuntimeError: CUDA error

torchでCUDA使おうとして使えてない。

調査

$ pip list | grep torch
torch              1.12.1

torchはpip install git+https://github.com/openai/whisper.gitしたときに一緒にインストールされたようだけど、cudaに対応していないものでは?

対策

torchをアンインストール

$ pip uninstall torch

pytorch.org

を参考にcuda対応のtourchをインストール。

$ pip install torch --extra-index-url https://download.pytorch.org/whl/cu116

インストール後

$ pip list | grep torch
torch                   1.12.1+cu116

再実行

$ python3 sample.py
Detected language: japanese
グリムサク 矢崎玄黒役赤ずきんむかしむかし あるところにちっちゃなかわいい女の子がおりました。その子はちょっと見ただけでどんな人でもかわいくなってしまうような子でしたが、誰よりも一番かわいがっていたのはこの子のおばあさんでした。おばあさんはこの子の顔を見ると何でもやりたくなってしまって、一体何をやったらいいのかわからなくなってしまうほどでした。あるとき、おばあさんはこの子に赤いビロードでかわいいずきんをこじらえてやりました。するとそれがまたこの子にとっても役に合いましたので、それからはもう他のものはちっともかぶらなくなってしまいました。それでこの子はみんなに赤ずきんちゃん、赤ずきんちゃんと呼ばれるようになりました。
(以下略)

動いた!

まとめ

(私の環境では)公式手順だとcuda対応ではないtorchがインストールされてしまっていたので、cuda対応のtourchを入れなおすことで動作しました。

Whisperは多少変な認識もありますが、手軽に日本語の音声認識を使えたことを考えるととても面白いですね。 しかも多言語対応してるって、なんて強力なんだ……。