GPUちゃんと動いてますか？ CUDAのステータスを確認しよう。

## はじめに
プロダクトでも[個人の興味](https://qiita.com/naoto714714/items/f9bbeace5fa55d93e2e8)でも、音声データを扱うことが増えてきたし、SLMも本格的に検証したいため、GPU環境を整えていきたいなと思ったときの初心者向け備忘録です。

~~CloudRun も GPUサポート開始したので（若手に試してもらう前に）自分で手を動かしてみたら、いまいちフィットしなく書くことがなくなったわけではありません。~~

## torch.cuda.is_available() の結果確認してますか？

デフォルトでは CUDA無効のPyTorchがインストールされます。

CUDA有効のPyTorchをインストールするためには、https://pytorch.org/get-started/locally/ から、環境を選択して有効なコマンドを指定してインストールする必要があります。

CUDA無効のPyTorchを気づかずにインストールしてしまっている場合は、GPUの恩恵を受けることができません。

CUDAバージョンの選び方は以下のまとめがオススメです。

https://zenn.dev/yumizz/articles/73d6c7d1085d2f

## どのバージョンを利用すれば良いのか？

:::note info
PyTorchで利用したいCUDAバージョン ≦ CUDA ToolKitのバージョン ≦ GPUドライバーの対応CUDAバージョン
:::

全部のCUDA バージョンを揃えておくのがハズレないとのことです。
（僕はまだハマってません）

cuda-toolkit のリリースノートやサポートマトリクスに目を通しておくのもオススメです。

https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html

https://docs.nvidia.com/deeplearning/frameworks/support-matrix/index.html

## どうやって調べるの？

自分でコマンドを打てる環境では良いのですが、CloudRunやGKEではちょっと不便です。

ステータスを表示するエンドポイントを用意しておくと捗ります。[^1]

```python
from flask import Flask, Response
import subprocess

@app.route('/gpu-status', methods=['GET'])
def gpu_status():
    try:
        result = subprocess.run(['nvidia-smi'], stdout=subprocess.PIPE)
        res = result.stdout.decode('utf-8')
    except FileNotFoundError:
        return Response("No nvidia-smi", mimetype='text/plain', status=404)
    except Exception as e:
        return Response(f"Unexpected: {e=}", mimetype='text/plain', status=500)
    return Response(res, mimetype='text/plain')
```

nvidia-smi で表示される CUDAバージョンはドライバーが対応している最大のCUDAバージョンが表示されます。
以下は CloudRun GPU での表示です。

```
Wed Dec 25 00:00:00 2024       
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.129.03             Driver Version: 535.129.03   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| 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 L4                      Off | 00000000:00:06.0 Off |                    0 |
| N/A   59C    P0              N/A /  72W |      1MiB / 23034MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+
```

:::note warn
ちゃんと外から叩かれないように権限管理を忘れずにしましょう。
:::

これであなたも `torch.cuda.is_available() ` を ONになる環境をかんたんに構築・確認できるようになりました！

## おまけ

CloudRun GPU は手元で検証をしていたところ、SLMを動かすという用途の方がやはり合いそうでしたが、

https://cloud.google.com/run/docs/configuring/services/gpu-best-practices?hl=ja

を読みつつ、Whisperを利用して試してみた所感です。

- GKE を利用する場合 Image Streaming が使えるので、Image内部にモデルを抱いてあげるのも悪くない。
  - とはいえ、あまりに大きすぎるとパフォーマンスに影響しそう
  - Artifact Registry のストーレジ料金 $0.10/GB。古いイメージはちゃんと掃除しましょう。
- 基本的には起動時に Cloud Storage よりダウンロードが無難そう。
  - 東京リージョンで $0.023/GB
  - たいていはオプションでデータのキャッシュ先が指定できるようになっているのでコードを読みましょう。

## 最後に

この記事がGPU環境をあまり構築したことがない方のヒントになって、本質的な課題解決に当てる時間が増えたらうれしいです。

今年のインティメート・マージャーのアドベントカレンダーはいかがでしたでしょうか？
参加2年目なんとか全日を埋めることができました。

https://qiita.com/advent-calendar/2024/intimatemerger

少しでも弊社に興味をもってくれる人が増えたらうれしいです。

https://recruit.intimatemerger.com/

[^1]: nvcc -V も CloudRun GPU で出したかったのですがうまくいきませんでした。ドキュメントに明記されてるので不要ではありますが、良い確認方法があったら教えてください。