🚜

GPUを使った機械学習の環境を作るためにすること/しないこと(Ubuntu 22.04/24.04編)

2024/11/27に公開

はじめに

私は2016年から機械学習に関する仕事をしています。
8年の時を経た現在(2024年11月)でも、NVIDIA製のGPUとPythonを使って機械学習を行うという大きなトレンドは変わっていないと思いますが、その環境の構築方法は少なからず変わっています。
当時は正しかった情報でも、現在では正しくなかったり、あるいは不要だったりする作業も多く、特にGPU周りは環境が整備されたおかげでかなり楽になっています。
「環境構築のためにすること」を記した記事は多くありますが「しないこと」を記した記事はあまり見当たりませんでしたので、ここに筆を執ることにしました。

対象読者

本記事は、以下のすべてを満たす方を主な対象読者としています。

  • Ubuntu 22.04 LTS、24.04 LTSを使っている方
  • NVIDIA製のGPUを使っている方
  • GPUを機械学習に使っている方

本記事の内容は、機械学習に限らずそれ以外の用途(画像生成など)にも応用できるとは思いますが、私はあまり詳しくないので質問されても回答はできかねます。
また、他のバージョンのUbuntuにも応用できるとは思いますが、新規に環境構築をするのであればUbuntu 22.04以降を使うと思われるので、それ以前のバージョン向けの情報は割愛しています。

NVIDIAドライバのインストール

機械学習ライブラリ(PyTorch、TensorFlowなど)からGPUを利用するためには、相変わらずNVIDIAドライバのインストールが必要です。
NVIDIAドライバをインストールするための方法は複数ありますが、個人的には「Ubuntu標準リポジトリからのインストール」を好んで使っています。

すること: Ubuntu標準リポジトリからNVIDIAドライバをインストールする

現在ではUbuntuの標準パッケージリポジトリにNVIDIAドライバのパッケージが存在するため、aptコマンドを使って簡単にインストールすることができます。具体例を以下に示します。

sudo apt update
sudo apt install nvidia-headless-550-server nvidia-utils-550-server

NVIDIAドライバのパッケージには、以下のようなバリエーションがあります。

パッケージ名 GUI/CUI 通常版/サーバ版
nvidia-driver-XXX デスクトップ環境あり(GUI環境向け) 通常版
nvidia-driver-XXX-server デスクトップ環境あり(GUI環境向け) サーバ版
nvidia-headless-XXX デスクトップ環境なし(CUI環境向け) 通常版
nvidia-headless-XXX-server デスクトップ環境なし(CUI環境向け) サーバ版

XXXはバージョン番号です。現時点(2024年11月26日)では550535のどちらかを使うことが多いかと思います。
550はPB(Production Branch)でサポート期間は1年です。535はLTSB(Long Term Support Branch)でサポート期間は3年です。
最新のPB、LTSB、サポート終了時期などは、以下のページから確認できます。

https://docs.nvidia.com/datacenter/tesla/drivers/#lifecycle

また、機械学習ライブラリでよく使用されるCUDA、cuDNNは、NVIDIAドライバのバージョンとの組み合わせを考慮する必要があり、バージョン要件は以下のページから確認できます。

https://docs.nvidia.com/deploy/cuda-compatibility/#minor-version-compatibility

https://docs.nvidia.com/deeplearning/cudnn/latest/reference/support-matrix.html

通常版(*-serverなし)とサーバ版(*-serverあり)は、サーバ版の方がより安定したバージョンが配布されるようですが、あまり詳しくは知りません。

*-driver-*は、デスクトップ環境向けのパッケージです。X.org関係の依存関係を含みます。
*-headless-*は、ディスプレイ/キーボード/マウスなどが接続されていないヘッドレス環境向けのパッケージです。
*-headless-*の方が依存関係が少なく、ファイルサイズも小さいため、ヘッドレス環境ではこちらを使うことをオススメします。
ただし、*-headless-*ではnvidia-smiなどのコマンドなどもインストールされないため、nvidia-utils-XXX-serverも同時にインストールすることをオススメします。

しないこと: runファイルからインストールする

NVIDIAのサイトからrunファイルをダウンロードし、NVIDIAドライバをインストールする方法もあります。
ただ、ドライバの検索、ダウンロード、パーミッションの変更、実行、各種設問への回答・・・などが必要で、少々面倒です。
バージョンを完全に固定できるという利点はありますが、固定する必要がなければ、前述のパッケージによるインストールをオススメします。

しないこと: PPAからパッケージをインストールする

前述の通り、現在ではNVIDIAドライバはUbuntuの標準パッケージリポジトリから配布されているため、PPA(Personal Package Archive)を利用する必要はありません。
以下、不要なコマンドの例です。

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update

しないこと: cuda-driversパッケージをインストールする

好みは色々あるとは思いますが、個人的にはcuda-driversパッケージでのインストールはオススメしません。
理由は、NVIDIAドライバのバージョンを制御できないこと、Dockerホスト側にはCUDA Toolkitをインストールしない方針であるためです。

しないこと: nouveauドライバを無効化する

現在ではnouveauは自動的に無効化されるため、特別な作業は不要です。
以下、不要なコマンドの例です。

lsmod | grep nouveau
echo "blacklist nouveau" | sudo tee /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 reboot

NVIDIAドライバのアップデート

必要に応じてすること: 新しいCUDAを使うためにNVIDIAドライバをアップデートする

CUDAにはNVIDIAドライバの最低バージョンの要件があります。
そのため、新しいCUDAを使うためにNVIDIAドライバをアップデートする場合がありますが、データセンター向けGPU(Teslaなど)では「Forward Compatible Upgrade」という仕組みが用意されており、NVIDIAドライバのバージョンを上げずに新しいCUDAを利用できる場合があります。
これについては別の記事を書きましたので、そちらをご参照ください。

https://zenn.dev/yuyakato/articles/f93b35d269d245

なお、コンシューマ向けGPU(GeForceなど)ではこの方法は使えませんので、NVIDIAドライバをアップデートする必要があります。

Docker、Docker Composeのインストール

記事の本題からは少し外れますが、多くの場合はDockerを併用すると思いますので、Dockerについても述べます。

すること: Docker公式リポジトリからインストールする

Dockerは、Ubuntuの標準パッケージリポジトリにも含まれていますが、バージョンが古いため、Dockerの公式パッケージリポジトリからインストールすることをオススメします。

Docker本体、BuildXプラグイン、Composeプラグインをインストールする具体例は以下の通りです。

sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
  | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo adduser ${USER} docker

Dockerのインストールについての詳細は、公式サイトをご参照ください。

https://docs.docker.com/engine/install/ubuntu/

しないこと: Ubuntu標準リポジトリからインストールする

前述の通り、DockerはUbuntuの標準パッケージリポジトリでも提供されていますが、バージョンが古いため個人的にはオススメしません。

オススメはしませんが、Ubuntuの標準パッケージリポジトリからインストールする方法は以下の通りです。

sudo apt update
sudo apt install docker.io
sudo adduser ${USER} docker

しないこと: Pythonパッケージdocker-composeをインストールする

Docker Composeはdocker-composeコマンドからdocker composeコマンドに変わり(ハイフンがなくなってサブコマンドになり)ました。
Docker公式パッケージリポジトリのパッケージもdocker-compose-pluginというプラグインパッケージに変わっています。

オススメはしませんが、Pythonパッケージをインストールする方法は以下の通りです。

pip install docker-compose

しないこと: docker-composeバイナリをインストール

Docker Composeは、GitHubのdocker/composeリポジトリからバイナリファイルをダウンロードし、インストールできます。
管理者権限がなく、一般ユーザ権限しか持っていない場合には相変わらず有用ですが、通常はdocker-compose-pluginパッケージによるインストールをオススメします。

オススメはしませんが、バイナリをホームディレクトリ以下にインストールする方法は以下の通りです。

mkdir ~/bin/
cd ~/bin/
wget -O docker-compose https://github.com/docker/compose/releases/download/v2.30.3/docker-compose-linux-x86_64
chmod +x docker-compose
./docker-compose version

NVIDIA Container Toolkitのインストール

DockerとNVIDIA製のGPUを組み合わせて使用する場合、NVIDIA Container Toolkitのインストールが必要です。

すること: NVIDIA公式リポジトリからインストールする

NVIDIA Container ToolkitをNVIDIAの公式パッケージリポジトリからインストールする方法は以下の通りです。

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \
  | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \
  | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \
  | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt update
sudo apt install nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
cat /etc/docker/daemon.json
sudo systemctl restart docker.service
systemctl status docker.service
docker info | grep -i runtime

必要に応じてすること: デフォルトランタイムをnvidiaに変更する

コンテナの実行時にGPUを使用したい場合、docker runコマンドの--gpusオプションを指定することでGPUを使用できます。
しかし、コンテナのビルド時にGPUを使用したい場合、デフォルトランタイムの変更が必要です。

具体的には/etc/docker/daemon.json"default-runtime": "nvidia"を追加する必要があります。具体例は以下の通りです。

$ sudo vim /etc/docker/daemon.json
$ cat /etc/docker/daemon.json
{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

$ sudo systemctl reload docker.service
$ systemctl status docker.service
$ docker info | grep -i runtime
 Runtimes: nvidia runc
 Default Runtime: nvidia

しないこと: ランタイムにnvidiaを指定する

docker runコマンドでコンテナを起動する場合に--gpusオプションを指定した場合、--runtime nvidiaを指定してランタイムを指定する必要はありません。

しないこと: nvidia-docker2パッケージをインストールする

nvidia-dockerコマンドは不要になりました。docker run --gpus xxxによりDockerコンテナからGPUを利用することができます。

CUDA Toolkitのインストール

機械学習ライブラリはCUDAを利用するものが多いです。
ただ、多くはCUDAランタイムのみ必要であり、そのビルド環境であるCUDA Toolkitが必要なものはそれほど多くはありません。
この「CUDAランタイム」と「CUDA Toolkit」を混同して扱っている記事が多いため、自分が必要としているものはどちらか確認しつつ、環境構築を進めることをオススメします。

すること: Dockerコンテナの中にCUDA Toolkitをインストールする

色々好みはあるとは思いますが、基本的にはDockerホスト側にはCUDA Toolkitはインストールせず、Dockerコンテナ内だけにインストールすることにしています。
理由は、必要なCUDA Tookkitは各種ソフトウェア、ライブラリによって異なり、1つの環境に複数のCUDA Toolkitをインストールすると混乱するためです。

CUDA Toolkitをインストールする方法は複数ありますが、こちらは個人的に特に好みはありません。
と言うのも、Dockerコンテナ内での話なので、Dockerホストや他のコンテナには影響せず、環境が壊れてしまう危険性も低いためです。

CUDA Toolkitのインストール方法については、以下をご参照ください。

https://docs.nvidia.com/cuda/cuda-installation-guide-linux/

方法1: NVIDIA公式リポジトリからcuda-toolkit-XX-Yをインストールする

Dockerコンテナ内にNVIDIAの公式パッケージリポジトリからインストールする方法は以下の通りです。以下の例ではCUDA Toolkit 12.6をインストールしています。

apt update
apt install wget
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb
dpkg -i cuda-keyring_1.1-1_all.deb
apt update
apt install cuda-toolkit-12-6
/usr/local/cuda-12.6/bin/nvcc --version

nvcc --versionの実行例は以下の通りです。

# /usr/local/cuda-12.6/bin/nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Tue_Oct_29_23:50:19_PDT_2024
Cuda compilation tools, release 12.6, V12.6.85
Build cuda_12.6.r12.6/compiler.35059454_0

NVIDIAドライバを含むcuda-XX-Yパッケージではなく、NVIDIAドライバを含まないcuda-toolkit-XX-Yパッケージを利用する点に注意が必要です。

方法2: runファイルからインストールする

NVIDIAのサイトからUbuntu 24.04向けのrunファイルをダウンロードしてインストールする方法は以下の通りです。以下の例ではCUDA Toolkit 12.6をインストールしています。
インストール中にNVIDIAドライバのインストール有無を選択するオプションが表示されますが、チェックを外し、インストールしないように注意する必要があります。NVIDIAドライバはDockerホスト側の管轄であり、Dockerコンテナ内には不要なためです。

apt update
apt install wget build-essential libxml2
wget https://developer.download.nvidia.com/compute/cuda/12.6.3/local_installers/cuda_12.6.3_560.35.05_linux.run
sh cuda_12.6.3_560.35.05_linux.run
/usr/local/cuda-12.6/bin/nvcc --version

nvcc --versionの実行例は以下の通りです。

# /usr/local/cuda-12.6/bin/nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Tue_Oct_29_23:50:19_PDT_2024
Cuda compilation tools, release 12.6, V12.6.85
Build cuda_12.6.r12.6/compiler.35059454_0

しないこと: cudacuda-driversパッケージをインストールする

cudacuda-driversパッケージはCUDAのバージョン、NVIDIAドライバのバージョンをどちらも指定できず、NVIDIAドライバに対する依存関係もあるため、Dockerコンテナ内へのインストールはオススメしません。

オススメはしませんが、cudaパッケージをインストールする方法は以下の通りです。

apt update
apt install wget
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb
dpkg -i cuda-keyring_1.1-1_all.deb
apt update
apt install cuda
/usr/local/cuda-12.6/bin/nvcc --version

しないこと: DockerホストにCUDA Toolkitをインストールする

前述の通り、1つの環境に複数のCUDA Toolkitをインストールすると混乱するため、可能な限りDockerホスト側にはCUDA Toolkitをインストールしないことにしています。
どうしてもインストールが必要な場合は、パッケージによる管理ができる「NVIDIA公式リポジトリからcuda-toolkit-XX-Yをインストールする」がオススメです。

しないこと: CUDAランタイムのためにCUDA Toolkitをインストールする

PyTorchなど、ビルド済みバイナリとして配布されているパッケージにはCUDAランタイムを含んでいるため、別途、CUDA Toolkitをインストールする必要はありません。
ビルド済みバイナリを含まず、ソースパッケージからビルドする場合は、CUDA Toolkitが必要になる場合があります。

しないこと: CUDA Toolkitのバージョン確認にnvidia-smiを使用する

記事の本題からは少し外れますが、nvidia-smiコマンドはCUDA Toolkitのバージョン確認には使えません。
nvidia-smiコマンドの結果に表示されるCUDA Version: XX.Yは「CUDA Driver API」のバージョン番号であり、別の言い方をすれば「このNVIDIAドライバでサポートされる最大のCUDAバージョン」です。
「CUDA Toolkit」のバージョンとは異なりますので注意が必要です。CUDA Toolkitのバージョンはnvcc --versionで確認できます。

nvidia-smiコマンド、nvcc --versionコマンドの実行例を以下に示します。

$ nvidia-smi | head -n 4
Wed Nov 27 02:06:21 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.127.05             Driver Version: 550.127.05     CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+

$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Tue_Oct_29_23:50:19_PDT_2024
Cuda compilation tools, release 12.6, V12.6.85
Build cuda_12.6.r12.6/compiler.35059454_0

しないこと: DockerHubにあるNVIDIAのベースイメージを使用する

DockerコンテナからGPUを使う場合、以前はDockerHubのnvidia/cudaリポジトリにあるベースイメージを使うことが多くありました。
ただ、こちらのベースイメージは色々なライブラリを含んでいてサイズが大きく、Pythonのバージョンが古めです。
そのため、最近はpythonリポジトリをベースにして、必要なライブラリを追加するスタイルに変えていっています。
Pythonのバージョンを選びやすく、そもそもCUDAランタイムを適切に依存関係に含んでいるPythonパッケージも多いので、わざわざCUDA関係のソフトウェアを含むベースイメージを使う必要がありません。

この項目は完全に好みの話ではありますが、上記の変更により10GB以上サイズを削減した実例もありますので、個人的にはオススメします。

もちろん、NVIDIAのベースイメージも開発時には便利ですので、NGC Catalogで提供されているイメージと合わせて適宜利用しています。

https://catalog.ngc.nvidia.com/

おわりに

「たまにGPU開発環境を整備することもあるし、NVIDIAドライバのインストール方法を整理しておこう」くらいの気持ちで本記事を書き始めましたが、書き始めると色々な項目が出てきて、思ったよりも長くなってしまいました。
本記事が何らかの参考になれば幸いです。

また、随時アップデートしていきたいと思いますので「今はこちらの方が良いよ!」という情報があれば、コメント頂けると幸いです。

Discussion