Ubuntu 24.04 LTSでTITAN Vを使えるようにした

この前Ubuntu 24.04 LTSがリリースされたので、これの上でTITAN VというGPUを動かせるようにしていきます。

TITAN V について

TITAN Vは、2018年にNVIDIA社が発売した非常に高価なコンシューマー向けGPUです。 国内代理店の菱洋(りょうよう)エレクトロからの発売価格は税込み39万8000円でした*1。 HBM2を搭載していてメモリバンド幅が大きいため機械学習の研究者向けとして売られていたみたいです。 倍精度浮動小数点数演算性能が(コンシューマー向けGPUとしては)高いことも特徴で、7 TFLOPS以上あります。

TITAN Vを超える倍精度演算能力を持つGPUは、NVIDIA社のV100・A100・H100またはその亜種、AMD社のMI100以降、くらいしかありませんが、これらのプロフェッショナル向けGPUは非常に高価です。 おそらくTITAN Vは、現時点で価格あたりの倍精度演算能力が最も高いGPUであり、今後もかなり長い間その座に居座り続けると思われます(単精度を二つ組み合わせた疑似倍精度でよければ、16倍のコストで実行可能*2なため、GeForce RTX 5090の時点で並ばれそうです*3)。

NVIDIA社が最近出したGPUのうち、高性能なものをまとめてみました。 性能はテンソルコア非使用時の値です(GH100とGA100には倍速のFP64TensorCoreがあります)。

Hopper GH100コア (2022):  144 SMs, 128×FP32 Units/SM, 64×FP64 Units/SM; H100 SXM5: 132 SMs, 1980 MHz, 66.9 TFLOPS(fp32), 33.5 TFLOPS(fp64); Ada Lovelace AD102コア (2022):  144 SMs, 128×FP32 Units/SM, 2×FP64 Units/SM; L40: 142 SMs, 2490 MHz, 90.5 TFLOPS(fp32), 1.41 TFLOPS(fp64); RTX 6000 Ada Generation: 142 SMs, 2505 MHz, 91.1 TFLOPS(fp32), 1.42 TFLOPS(fp64); GeForce RTX 4090: 128 SMs, 2520 MHz, 82.6 TFLOPS(fp32), 1.29 TFLOPS(fp64); Ampare GA100コア (2020):  128 SMs, 64×FP32 Units/SM, 32×FP64 Units/SM; A100: 108 SMs, 1410 MHz, 19.5 TFLOPS(fp32), 9.75 TFLOPS(fp64); A800: 108 SMs, 1410 MHz, 19.5 TFLOPS(fp32), 9.75 TFLOPS(fp64); Ampare GA102コア (2020):  84 SMs, 128×FP32 Units/SM, 2×FP64 Units/SM; A40: 84 SMs, 1740 MHz, 37.4 TFLOPS(fp32), 585 GFLOPS(fp64); RTX A6000: 84 SMs, 1800 MHz, 38.7 TFLOPS(fp32), 605 GFLOPS(fp64); GeForce RTX 3090 Ti: 84 SMs, 1860 MHz, 40.0 TFLOPS(fp32), 625 GFLOPS(fp64); GeForce RTX 3090: 82 SMs, 1695 MHz, 35.6 TFLOPS(fp32), 556 GFLOPS(fp64); Turing TU102コア (2018):  72 SMs, 64×FP32 Units/SM, 2×FP64 Units/SM; Quadro RTX 6000: 72 SMs, 1770 MHz, 16.3 TFLOPS(fp32), 510 GFLOPS(fp64); TITAN RTX: 72 SMs, 1770 MHz, 16.3 TFLOPS(fp32), 510 GFLOPS(fp64); GeForce RTX 2080 Ti: 68 SMs, 1545 MHz, 13.4 TFLOPS(fp32), 420 GFLOPS(fp64); Volta GV100コア (2017):  84 SMs, 64×FP32 Units/SM, 32×FP64 Units/SM; Tesla V100 SXM2: 80 SMs, 1530 MHz, 15.7 TFLOPS(fp32), 7.83 TFLOPS(fp64); Quadro GV100: 80 SMs, 1627 MHz, 16.7 TFLOPS(fp32), 8.33 TFLOPS(fp64); TITAN V: 80 SMs, 1455 MHz, 14.9 TFLOPS(fp32), 7.45 TFLOPS(fp64); Pascal GP100コア (2016):  60 SMs, 64×FP32 Units/SM, 32×FP64 Units/SM; Tesla P100 SXM2: 56 SMs, 1480 MHz, 10.6 TFLOPS(fp32), 5.30 TFLOPS(fp64); Quadro GP100: 56 SMs, 1442 MHz, 10.3 TFLOPS(fp32), 5.17 TFLOPS(fp64); Pascal GP102コア (2016):  30 SMs, 128×FP32 Units/SM, 2×FP64 Units/SM; Tesla P40: 30 SMs, 1531 MHz, 11.8 TFLOPS(fp32), 367 GFLOPS(fp64); Quadro P6000: 30 SMs, 1645 MHz, 12.6 TFLOPS(fp32), 395 GFLOPS(fp64); TITAN Xp: 30 SMs, 1582 MHz, 12.1 TFLOPS(fp32), 380 GFLOPS(fp64); GeForce GTX 1080 Ti: 28 SMs, 1582 MHz, 11.3 TFLOPS(fp32), 354 GFLOPS(fp64);
NVIDIA社が最近出したハイエンドGPUをまとめた表

こうまとめてみると、TITAN Vはコンシューマー向けGPUとして唯一「100系」コアを使っているということがわかります。

最近は以下の三通りの世代が混在していて、世代名がわかりづらい状況にあるようです。

  • 100系」コアも「102系」コアもある世代(Pascal世代とAmpare世代)
  • 100系」コアだけある世代(Volta世代とHopper世代)
  • 100系」コアがなくて「102系」コアがある世代(Turing世代とAda Lovelace世代。コアの名前がGで始まらない)

他にも、次のことがわかります。

  • 「102系」コアはフルスペック(コアが持つSMをすべて使えるモデル*4)が発売される一方、「100系」コアはそうではない
    • かなり高額であるため、歩留まりを上げなくても十分な収益が確保できることによる?
  • 100系」コアも「102系」コアもある世代においては、「100系」コアはfp32性能とfp64性能が2:1であるのに対し、「102系」コアはその2倍のfp32性能を持つ代わりにfp64が2 Units/SMに減らされている
    • NVIDIAのwhitepaperには、fp64 Unitはfp64命令を含むプログラムを動かせる互換性のために配置していると書かれている。積極的に使うべきものではなさそう

セットアップ

大幅に話題が脱線しましたが、セットアップの手順は以下の通りです。

うまくいった方法

Ubuntu 24.04 LTSをUSBメモリから普通にインストールします。

以下、Ubuntu 22.04マシンでGPUを使えるようにする #深層学習 - Qiitaを参考に、以下のようにコマンドを実行すればGPUを使えるようになりました。

sudo apt update
echo 'blacklist nouveau' | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf
echo 'options nouveau modeset=0' | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf
sudo update-initramfs -u
sudo apt install nvidia-driver-535
sudo shutdown -r now

インストール途中でセキュアブートのパスワードを決めることを促されるので、適当な文字列に決めます。 再起動後、Enroll MOKから決めたパスワードを入力することで、インストールしたドライバを使用することができるようになります(セキュアブートが有効なので、これをしなければ信頼できないドライバは使用できません)。

失敗集

実際には一発で上のようにうまくいったのではなく、何回も失敗したので、その記録です。

NumLockがかかってしまう(?)

どうにもパスワードが合いませんでした。 あやしいのはNumLockランプが点灯していることですが、NumLockを解除する方法が見当たりませんでした。

とりあえず、キーボードの左側のキーだけを使うパスワードを設定することで乗り切りました。

ディスプレイに×印が表示される

ログイン画面が表示されるべきところで、ディスプレイに×印が表示されて何もできなくなります。 Ctrl+Alt+F2を押すと画面表示がなくなり、Ctrl+Alt+F1を押すと画面表示が出てきます(×印が表示される画面に戻るだけです)。 sshログインはできるのでいろいろ設定ファイルをいじってみましたが、うまくいきません。

あきらめてUbuntuを再インストールしようとしましたが、それすらうまくいかなくなりました。 ただし、safe graphicsモードでならインストールだけはできました(結局×印が表示されます)。

これはどうも、私がDell UP3218K(8Kディスプレイ)を使っていたことが原因のようで、普通の解像度のディスプレイであればログイン画面が表示されました。

CUDAを使えるようにする

1. Introduction — Installation Guide for Linux 12.5 documentationを参考にしながら、CUDAを使えるようにしていきます。

まず、sudo apt-get install linux-headers-$(uname -r)を行うと書かれていますが、これは不要そうでした。 次に、sudo apt-key del 7fa2af80を行います。apt-keyはdeprecatedと警告が出ますが、とりあえず大丈夫そうです。

続いて、wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.debとしたくなりますが、実際には対応するCUDA Toolkitがないのでダメです。 wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.debをするのですが、wgetは同じ名前のファイルがあると上書きしないので、その前にrm cuda-keyring_1.1-1_all.depする必要がありました。

その後、以下の手順でCUDA Toolkitを手に入れます。

sudo dpkg -i cuda-keyring_1.1-1_all.dep
sudo apt-get update
sudo apt-get install cuda-toolkit

すると以下のようにエラーになります。

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 nsight-systems-2023.4.4 : 依存: libtinfo5 しかし、インストールすることができません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

これに対しては、Ubuntu 24.04@WSL2にCUDAをインストールする(libtinfo5が見つからない問題) #NVIDIA - Qiitaに対処方法のヒントが記載されていました。 ただし、/etc/apt/sources.list.d/jammy.listというファイルは存在しませんでした。 近くにあった/etc/apt/sources.listというファイルをcatしてみると、# Ubuntu sources have moved to /etc/apt/sources.list.d/ubuntu.sourcesとのことでした。 /etc/apt/sources.list.d/ubuntu.sourcesに以下を追記したところ、うまくインストールできました。

Types: deb
URIs: http://jp.archive.ubuntu.com/ubuntu/
Suites: jammy
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

続いて、以下のコマンドを実行します。

sudo apt-get install nvidia-gds
sudo reboot

インストールできたことを確認するため、並列"Hello World"から始めるCUDA入門 #初心者 - Qiitaに記載されていた以下のプログラムを動かしてみます。

#include <stdio.h>

__global__ void hello(){
    printf("Hello CUDA World !!\n");
}

int main() {
    hello<<< 2, 4 >>>();
    cudaDeviceSynchronize();
    return 0;
}

nvcc test.cuコンパイルします。 sudo apt install nvidia-cuda-toolkitが必要でした。 というかGPUカーネルからprintfなんてできるんですね。

他のプログラムも動かしてみます。

sudo apt install git
git clone https://github.com/NVIDIA/cuda-samples
cd cuda-samples/Samples/1_Utilities/bandwidthTest
make
cd ../../bin/x86_64/linux/release/
./bandwidthTest

PCIe経由でのメモリ転送が13.5 GB/s、デバイス上のメモリ転送が550.6 GB/sになりました。 PCIe 3.0 x16接続なので理論的な通信速度は片方向15.75 GB/sであり、おおよそあってそうです。 また、メモリ帯域は3072 bit×1455MHzで558.72GB/sなので、ほぼ限界の転送速度が出ていそうです。

まとめ

Ubuntu 24.04 LTSでTITAN Vを使えるようにできました。

*1:すでに終売しているようです。中古品はメルカリとかで5万円くらいで入手できそうです。

*2:椋木大地, 今村俊幸, 「MaxwellアーキテクチャGPUにおける疑似倍精度演算を用いたDGEMMの実装と評価」, 2014.

*3:GeForce RTX 5090の性能はGeForce RTX 4090の1.5倍くらいの性能らしいとの噂に基づけば

*4:一般に半導体製品は、全てのトランジスタが正しく動作するようなものを作ることが難しいです。それでも大半のトランジスタは正しく動作するため、本来持つSM数よりいくつか少ない数のSMがあるようなGPU用には使うことができます。そこで、全てのトランジスタが正しく動作する“完品”はフルスペックモデルとして高く売り、その製造過程でできてしまうわずかな欠陥のある品はグレードが下のモデルとして売る、という方法で歩留まり(良品率)を上げているようです。