WindowsゲーミングPCでOpenAI Whisperを使って自動文字起こしを実現する

# はじめに

OpenAI Whisper を Windows ゲーミング PC の GPU を使って実行する手順を紹介します。様々な検証が可能なように、Docker を使って環境を用意してみます。

# 前提条件

- NVIDIA GPU を搭載したゲーミング PC (Windows 11 Home 23H2、12th Gen Intel Core i7-12650H 2.3GHz、32GB Memory、NVIDIA RTX 4060 8GB VRAM)
- NVIDIA Container Toolkit がインストールされていること (手順は[別記事、WindowsゲーミングPCでGPUを使ったコンテナを実行する方法](https://qiita.com/vfuji/items/82d54c421f49794294e5)をご参照下さい)

# 手順

手順は次のようになります。

- CUDA バージョンの確認
- Whisper コンテナのビルド
- Whisper コンテナの起動
- 動作条件の確認
- Whisper の実行

## CUDA バージョンの確認

WSL Ubuntu にて`nvidia-smi`を実行し、CUDA バージョンを確認します。私の環境では、次の通り、CUDA 12.1 でした。

```sh
$ nvidia-smi
Mon Jan 15 22:15:44 2024
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.54                 Driver Version: 531.97       CUDA Version: 12.1     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                  Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf            Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA GeForce RTX 4060 L...    On | 00000000:01:00.0 Off |                  N/A |
| N/A   32C    P3               14W /  N/A|      0MiB /  8188MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+
```

## Whisper コンテナのビルド

[github/openai/whisper/Setup の項目](https://github.com/openai/whisper?tab=readme-ov-file#setup)にWhisper は、Python 3.9.9、PyTorch 1.10.1 でトレーニングとテストを実施しているとのことです。また、Python 3.8 - 3.11 と最新の PyTorch で動作するでしょう、と記載があります。
私の環境は CUDA 12.1 ですので、[nvidia/cuda:12.1.1-base-ubuntu22.04](https://hub.docker.com/layers/nvidia/cuda/12.1.1-base-ubuntu22.04/images/sha256-d1dc3827959f1b5d38b5cf07256ed146fa498801345af39c76ae341b47ef1775?context=explore)を利用しました。それぞれの環境似合わせて適切なコンテナイメージを [nvidia/cuda](https://hub.docker.com/r/nvidia/cuda/tags)より選択して下さい。

```sh
$ mkdir whisper1
$ cd whisper1
```

下記を`Dockerfile`として作成します。

```Dockerfile
FROM nvidia/cuda:12.1.1-base-ubuntu22.04 AS env_base
# Prepare env_base
RUN apt-get update && apt-get install --no-install-recommends -y \
    git vim build-essential python3-dev python3-venv python3-pip
RUN pip3 install --upgrade pip setuptools && \
    pip3 install torch torchvision torchaudio

# config whisper
FROM env_base AS whisper_base
# Install openai-whisper
RUN pip3 install -U openai-whisper
RUN apt-get update && apt-get install --no-install-recommends -y ffmpeg
```

上記を使って whisper が含まれた CUDA 処理が可能なコンテナをビルドします。

```sh
docker build . -t whisper1
```

上記を実行すると whisper1 という名前の image が作成されます。

```sh
$ docker image ls
REPOSITORY                                      TAG                             IMAGE ID       CREATED         SIZE
whisper1                                        latest                          d34d27ba6d55   3 hours ago     8.94GB
```

## Whisper コンテナの起動

場所を確認し、`data`ディレクトリを作成します。Whisper コンテナと Windows でファイルをやり取りする場所となります。エクスプローラにて`\\wsl.localhost\Ubuntu\home\ubuntu\whisper1\data`のようなディレクトリを探し、音声ファイルを保存します。

```sh
$ pwd whisper1
/home/ubuntu/whisper1
$ mkdir data
```

`run.sh`を準備してコンテナを起動します。実行の際は、`chmod 755 run.sh`を行なって`./run.sh`などと実行して下さい。

```sh
#!/usr/bin/env bash

DOCKER_ROOT="/whisper1" # specidy docker directory
CONTAINER_IMAGE="whisper1"  # set your image name
USER_COMMAND="/bin/bash"

# generate mount commands
DATA_VOLUME=" \
--volume $PWD/data:$DOCKER_ROOT/data"

# run docker with GPU
docker run -it --rm --gpus all \
      $DATA_VOLUME $USER_VOLUME $DEV_VOLUME \
      $CONTAINER_IMAGE $USER_COMMAND
```

## 動作条件の確認

コンテナ内にて`/bin/bash`の状態となっているはずです。Python と Torch のバージョンが Whisper の動作条件を満たしていることを確認します。

```sh
$ python3 --version
Python 3.10.12
$ pip3 list|grep torch
torch                    2.1.2
torchaudio               2.1.2
torchvision              0.16.2
```

念の為`torch.cuda.is_available()`が`True`を返すことも確認しましょう。

```sh
$ python3
Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.cuda.is_available())
True
>>> exit()
```

## Whisper の実行

`/whisper1`に`data`がマウントされています。次を実行すると GPU を使った処理が行われます。`--device cpu`とするとCPUのみで処理を行います。上で作成した環境は、GPU がデフォルトで動作する状態なので、`--device`を入力しない場合は、GPU が動作します。
次のコマンドでは、出力先が同じく data となっています。抽出したテキストはいくつかの形式で出力されています。

```sh
whisper {your_file_name} --language Japanese --model medium --device cuda --output_dir data
```


# おまけ、処理時間

以前作成した記事では、Apple Macbook Pro にて whisper を動作させてみました。同一ファイルを用いて参考までに、比較してみました。次の内容は、[# OpenAI Whisperを使ってノーコードで自動文字起こしを実現する、しかもタダ](https://qiita.com/vfuji/items/72083b8e64d8a509be67)および[Google ColabでOpenAI Whisperを使って自動文字起こしを実現する](https://qiita.com/vfuji/items/e836f432ed5fb75f4306)から部分出来に抜粋したものです。最後の2つが今回の環境で測定した結果です。

|ファイル種別|ファイルサイズ|audio尺|モデル|処理時間|CPU/GPU|
|---|---|---|---|---|---|
|audio (m4a)|3.3MB|3分26秒|small|3分1秒|M1 CPU|
|audio (m4a)|3.3MB|3分26秒|medium|5分44秒|M1 CPU|
|audio (m4a)|3.3MB|3分26秒|large|12分41秒|M1 CPU|
|audio (m4a)|3.3MB|3分26秒|large-v2|9分55秒|M1 CPU|
|audio (m4a)|3.3MB|3分26秒|medium|1分20秒|Google Colab T4 16GB VRAM|
|audio (m4a)|3.3MB|3分26秒|medium|29秒|GeForce RTX4060 8GB VRAM|
|audio (mp4)|3.3MB|3分26秒|medium|3分52秒|Core i7-12650H|

また、VRAM 8GB ですと`--model large-v2 --device cuda`や`--model large-v3 --device cuda`は起動できませんでした。VRAM 10GB 程度は必要なようです。ということで、今回の比較は、medium を使った場合の結果を追加しています。

large-v3 を使おうとした際のエラーメッセージはこちらです。

```sh
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 26.00 MiB. GPU 0 has a total capacty of 8.00 GiB of which 0 bytes is free. Of the allocated memory 6.90 GiB is allocated by PyTorch, and 354.72 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
```

# 所感

Apple Macbook Pro M1 や Google Colab の NVIDIA T4 16GB 環境よりも GeForce RTX4060 8GB の方が高速なようです。[NVIDIA GeForce RTX 4060 Laptop GPU](https://www.nvidia.com/ja-jp/geforce/laptops/compare/) は CUDA コアが 3072、8GB GDDR6 となります。一方 Google Colab に搭載されているデータセンター向けの [NVIDIA T4](https://www.nvidia.com/ja-jp/data-center/tesla-t4/) は CUDA コアが 2560、16G GDDR6 となります。T4 は 2018 年にリリースされた Turing 世代、GeForce RTX 4060 はコンシュマー向けとはいえ Ada Lovelace 世代の方が半分以下の時間で動作するとは、びっくりでした。この 5年ほどで GPU の性能が大幅に向上していることがわかりました。

# 参考

- [github/openai/whisper](https://github.com/openai/whisper)