えむのメモして満足するLog

どうも私です。

Compute EngineのNVIDIA Tesla K80に最終更新のドライバをぶち込みたい

どうも人工知能では無い方のえむです。

GCPのCompute EngineでGPUを載せたインスタンスにドライバをインストールする手順はGCP公式ドキュメントの「GPU ドライバをインストールする」に従えばできるんです。
個人的にNVIDIA Tesla K80を選択しているのだがK80は最終対応ドライバがR470と決まっている。

CUDA and Architecture Matrix

何が言いたいかというと、ドキュメントに書かれているインストールスクリプトに従うと少し古いドライバがインストールされる。K80の最終対応ドライバのメジャーバージョンは決まっているが、マイナーな更新が続いて、インストールスクリプトの更新が追いついてない。できるなら最新版にしておきたいのだ。

というわけで手動でドライバのインストール/アップデート、ついでにCUDA Toolkitもぶち込む。

前提環境

  • 自己責任でどうぞ
    • 無理にアップデートする必要ありません。
    • ディープラーニング用のイメージも用意されてるのでそちらも検討してみて下さい。
  • NVIDIA Tesla K80搭載のインスタンス
    • 機械学習するならn1-standard-4以上を見積もった方が良い
    • なおGCPGPUを使うにはGoogleに申告が必要で、既に各自で申請済みの体とする
    • よい子ならT4だろうP4だろうが差し替えればほぼ手順は同じ(CUDAの最新版にはご注意を)
  • Ubuntu 20.04 LTS Minimal (x86/64, amd64)
    • ↑Tesla K80に限ってはこれが最終対応。これ以上は対応するドライバが無い。なおUbuntu 20.04 LTSは一般の更新が2024年の中頃までとなっている

ドライバ

ドライバは下記のリンクからData Center / TeslaK-SeriesTesla K80Linux 64-bit Ubuntu 20.0411.4で検索する。結果一覧から日付が新しいものをwgetなどでダウンロードする。

https://www.nvidia.co.jp/Download/Find.aspx?lang=jp

ドライバをインストールする(ファイル名は全て差し替えるように)。
インストール終了手前で「パブリック ??? GPG keyが無いから次のコマンド使ってインストールして」のような旨のメッセージが表示されているので、提示されているcpコマンドなどを使って鍵のインストールを終えたら再起動sudo rebootする。

### ファイル名は全て差し替えろ ###

# インストール
sudo dpkg -i nvidia-driver-local-repo-ubuntu2004-470.?_amd64.deb
# GPGキーのインストール
sudo ln -s /var/nvidia-driver-local-repo-ubuntu20?????????????/nvidia-driver-local-????????-keyring.gpg /usr/share/keyrings/nvidia-driver-local-????????-keyring.gpg
# アップグレード
sudo su -c 'apt update && apt upgrade -y'
# 再起動
sudo reboot

余談だがドライバ一覧が出たとき2022年度は4回ほど更新がある。偶にドライバの更新が無いかチェックしておくのが良いだろう。

CUDA Toolkit

K80の場合、CUDA 11.4 Update 4が(恐らく)最終対応のCUDAとなる。

CUDA 11.4 Update 4の対応条件としてドライバ>=470.82.01で、この記事が書かれた時点で既に470.161.03なので条件を満たしている。下記のリンクからCUDA 11.4 Update 4を使う(アーカイブ一覧)。

https://developer.nvidia.com/cuda-11-4-4-download-archive

各プラットフォームすべて選択するとCUDA Toolkitのダウンロードとインストール手順が表示される。

  • Operating System: Linux
  • Architecture: x86_64
  • Distribution: Ubuntu
  • Version: 20.04
  • Installer Type: deb (local)

CUDA Toolkit 11.4 Update 4 Downloads

やり方が悪いのかネットワークインストール、ランファイル共に何故か失敗する。なのでローカルインストール一択である(ローカル以外で成功したら教えて)。

最後に

成功していればnvidia-smiコマンドでGPU情報を確認できる。

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.161.03   Driver Version: 470.161.03   CUDA Version: 11.4     |
|-------------------------------+----------------------+----------------------+
| 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  Tesla K80           On   | 00000000:00:04.0 Off |                    0 |
| N/A   51C    P0   151W / 149W |  11130MiB / 11441MiB |     99%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1389      C   python3                         11125MiB |
+-----------------------------------------------------------------------------+

K80が活性化しているのが分かる。

なおCUDA コンパイラバージョンはnvcc -Vコマンド確認できるがコマンドが見つからない病となる。

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Mon_Oct_11_21:27:02_PDT_2021
Cuda compilation tools, release 11.4, V11.4.152
Build cuda_11.4.r11.4/compiler.30521435_0

これは環境変数Pathの登録が無い場所にあるため、/usr/local/cuda/bin/nvcc -Vとフルパスで実行する必要がある。 毎度のフルパスが面倒なら~/.local/binの中にln -s /usr/local/cuda/bin/nvcc nvccnvccシンボリックリンクを貼って対処する。

ただK80の場合、CUDA 11.4 Update 4から変わることが無いので見ても仕方無い。見たい人だけどうぞ。


Ubuntu 20.04の標準Pythonは3.8なので新しいPythonのインストール方法をと思ったが、他所で幾らでも紹介されているので、この記事では書かないことにした。各自で探そう。

余計なプロセスは潰そう

NVIDIA-SMIのProcessesにxorggnome-shellが稼働していると示されたときの対処方(CUI環境前提)。
プロセスが無駄にGPU側のメモリを消費すると、機械学習のプログラムが強制停止してしまう。CUIのみで行うなら要らない子である。

GCEのインスタンス停止→編集し、「表示デバイス」を無効にして保存→インスタンス開始。Ubuntuの起動が完了したらパッケージgdm3をリムーブさせて再起動。再度nvidia-smiコマンドで各プロセスが消えていれば成功。