お手軽でカンタンなFaster-Whisper環境構築(3)

# はじめに

Faster-Whisperを使ってみたいけど、環境構築が面倒だなーと感じている私のような輩のために、比較的カンタンでクリーンな環境構築の方法を紹介します。
ここで"クリーンな環境"とは「OSのパッケージを汚さずに設定できてカンタンに元通り」という意味合いです。

この記事は、前回の記事の追加情報です。

https://qiita.com/hanaya/items/f6ae5253ac3c3e14ff3d

https://qiita.com/hanaya/items/3dd345a6b51a623986d6

# 結論
pipコマンドのパッケージだけで、お手軽にFaster-Whisperの実行環境が作れます。
nvidiaからdudaのパッケージをダウンロードシてインストールという超絶面倒な手順は不要です。

# 前回の記事からの続き
VoiceVoxのライブラリを間借りしたり、NVIDIAのパッケージからファイルを抽出したりして、Faster-Whisperを動かしてみましたが、やっぱりもっと簡単にできるのでは？

情報収集して試行錯誤した結果、本家Whisperでは、CUDAとCUDNNがOSにインストールされていなくても大丈夫なようです。そしてどうやら、cudaとdudnnのpipパッケージがあるらしい。
今回はこのpipパッケージを使って、faster-whisperを動くようにしてみます。

## 試した環境
OS: Ubuntu 22.04 LST
GPU: nvidia t1000 8GB (nvidia-driver-535)

この記事はLinux環境向けです。Windowsの場合は以下が参考になりそうです。

https://github.com/SYSTRAN/faster-whisper/issues/153

## 発見したパッケージ

ネットを徘徊してパッケージを発見しました。なんか怪しいぞ？と思ったけれど、よくみたらメンテナはnvidiaさん。つまり公式です。だよね？

https://pypi.org/project/nvidia-cudnn-cu11/

https://pypi.org/project/nvidia-cublas-cu11/

## 手順

それでは、このパッケージをつかって環境構築していきます。一応全部の手順を書いていきます。

まずは、恒例のpython仮想環境を作成。
```
$ mkdir ~/LLM/faster-whisper                         #ディレクトリを作る
$ cd ~/LLM/faster-whisper                            #ディレクトリに移る
$ python3 -m venv .venv --prompt 'Whisp'             #プロンプトを指定して仮想環境を作る
$ source .venv/bin/activate                          #仮想環境に入る
$ .venv/bin/python3 -m pip install -U pip setuptools #念の為pipを最新版へ
```
次に、faster-whisperのインストール。もちろんpython仮想環境で。

```
$ pip install faster-whisper
```

そしてに、cublasとcudnnをインストール。(cublasは11と12が必要でした)
 nvidia-cudnn-cu11は依存関係でインストールされます。
```
$ pip install nvidia-cublas-cu11 nvidia-cublas-cu12
```

インストール結果
```
(Voice) hogehoge@mx130:~/LLM/CrabVoice$ pip list | grep nvidia
nvidia-cublas-cu11     11.11.3.6
nvidia-cublas-cu12     12.4.2.65
nvidia-cuda-nvrtc-cu11 11.8.89
nvidia-cudnn-cu11      8.9.6.50
```
コレだけでは、まだ動きません。LD_LIBRARY_PATHを指定しないとライブラリを読んでくれないようです。では、ライブラリはどこにあるのか？
```
(Voice) hogehoge@mx130:~/LLM/CrabVoice$ find . -name 'libcublas.so*' -o -name 'libcudnn_ops*'
./.venv/lib/python3.11/site-packages/nvidia/cublas/lib/libcublas.so.11
./.venv/lib/python3.11/site-packages/nvidia/cublas/lib/libcublas.so.12
./.venv/lib/python3.11/site-packages/nvidia/cudnn/lib/libcudnn_ops_infer.so.8
./.venv/lib/python3.11/site-packages/nvidia/cudnn/lib/libcudnn_ops_train.so.8
```
２箇所に別れてますね。これをLD_LIBRARY_PATHに設定します。
```
export LD_LIBRARY_PATH=$(find $PWD \( -name 'libcublas.so*' -o -name 'libcudnn_ops*' \) -printf '%h\n' | sort -u | paste -sd ':')
```
実行してみましょう
```
(Voice) hoge@mx130:~/LLM/CrabVoice$ python3 transcribe_simple.py 
#Load model
#Start
Detected language 'ja' with probability 1.000000
[0.00s -> 5.12s] はいすいませんどちらまで
[5.12s -> 6.84s] ナンバーグランドカ月まで
[6.84s -> 7.66s] ナンバーグランドカ月
[7.66s -> 9.38s] 1000日前の
[9.38s -> 11.08s] 1000日前の
[11.08s -> 14.62s] ナンバーグランドカ月さんお願いします
[14.62s -> 18.50s] 帰りましたでしょ新大阪のタクシー乗り場
[18.50s -> 22.62s] そうですねあそこなんか行き先とかいろいろ分かれてたのか
[22.62s -> 24.64s] もう今全部一緒になりましたね
[24.64s -> 29.80s] 小型の乗り場ももうなくなりましたね
　：
```
出来ました。あとは、LD_LIBRARY_PATHをどこで設定するか？
仮想環境の中に設定できるファイル等があるか調べたのですが、私の調査では発見出来ませんでした。今回は、activateスクリプトを修正することにします。


```diff:.venv/bin/activateの修正箇所
# This file must be used with "source bin/activate" *from bash*
# you cannot run it directly

deactivate () {

    (途中省略)

    if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
        PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
        export PYTHONHOME
        unset _OLD_VIRTUAL_PYTHONHOME
    fi

+    if [ -n "${_OLD_LD_LIBRARY_PATH:-}" ] ; then
+        export LD_LIBRARY_PATH="${_OLD_LD_LIBRARY_PATH#EMPTY}"
+        unset _OLD_LD_LIBRARY_PATH
+    fi

    # This should detect bash and zsh, which have a hash command that must

    (途中省略)
}

(途中省略)

_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH

+_OLD_LD_LIBRARY_PATH="${LD_LIBRARY_PATH:-EMPTY}"
+export LD_LIBRARY_PATH="$(find $PWD \( -name 'libcublas.so*' -o -name 'libcudnn_ops*' \) -printf '%h\n' | sort -u | paste -sd ':'):$LD_LIBRARY_PATH"

# unset PYTHONHOME if set
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
# could use `if (set -u; : $PYTHONHOME) ;` in bash
(途中省略)
```

うまく働くか、試してみます。
仮想環境へ入る前にLD_LIBRARY_PATHへ目印となる文字列を設定しておきます。
```
hoge@mx130:~/LLM/CrabVoice$ export LD_LIBRARY_PATH="関西電気保安協会"
hoge@mx130:~/LLM/CrabVoice$ echo $LD_LIBRARY_PATH
関西電気保安協会
```
仮想環境に入って、LD_LIBRARY_PATHが設定されているか確認します。
```
hoge@mx130:~/LLM/CrabVoice$ source .venv/bin/activate
(Voice) hoge@mx130:~/LLM/CrabVoice$ echo $LD_LIBRARY_PATH
/home/hoge/LLM/CrabVoice/.venv/lib/python3.11/site-packages/nvidia/cublas/lib:/home/hoge/LLM/CrabVoice/.venv/lib/python3.11/site-packages/nvidia/cudnn/lib:関西電気保安協会
```
仮想環境を抜けて、LD_LIBRARY_PATHが復元されるか確認します。
```
(Voice) hoge@mx130:~/LLM/CrabVoice$ deactivate 
hoge@mx130:~/LLM/CrabVoice$ echo $LD_LIBRARY_PATH
関西電気保安協会
```
うまく設定と復帰ができているようです。これで仮想環境でのFaster-Whisperの動作環境が出来上がりました。