GPUを使った機械学習の環境を作るためにすること/しないこと(Ubuntu 22.04/24.04編)
はじめに
私は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日)では550
と535
のどちらかを使うことが多いかと思います。
550
はPB(Production Branch)でサポート期間は1年です。535
はLTSB(Long Term Support Branch)でサポート期間は3年です。
最新のPB、LTSB、サポート終了時期などは、以下のページから確認できます。
また、機械学習ライブラリでよく使用されるCUDA、cuDNNは、NVIDIAドライバのバージョンとの組み合わせを考慮する必要があり、バージョン要件は以下のページから確認できます。
通常版(*-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を利用できる場合があります。
これについては別の記事を書きましたので、そちらをご参照ください。
なお、コンシューマ向け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のインストールについての詳細は、公式サイトをご参照ください。
しないこと: Ubuntu標準リポジトリからインストールする
前述の通り、DockerはUbuntuの標準パッケージリポジトリでも提供されていますが、バージョンが古いため個人的にはオススメしません。
オススメはしませんが、Ubuntuの標準パッケージリポジトリからインストールする方法は以下の通りです。
sudo apt update
sudo apt install docker.io
sudo adduser ${USER} docker
docker-compose
をインストールする
しないこと: Pythonパッケージ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のインストール方法については、以下をご参照ください。
cuda-toolkit-XX-Y
をインストールする
方法1: NVIDIA公式リポジトリから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
パッケージを利用する点に注意が必要です。
run
ファイルからインストールする
方法2: 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
cuda
、cuda-drivers
パッケージをインストールする
しないこと: cuda
、cuda-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が必要になる場合があります。
nvidia-smi
を使用する
しないこと: CUDA Toolkitのバージョン確認に記事の本題からは少し外れますが、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で提供されているイメージと合わせて適宜利用しています。
おわりに
「たまにGPU開発環境を整備することもあるし、NVIDIAドライバのインストール方法を整理しておこう」くらいの気持ちで本記事を書き始めましたが、書き始めると色々な項目が出てきて、思ったよりも長くなってしまいました。
本記事が何らかの参考になれば幸いです。
また、随時アップデートしていきたいと思いますので「今はこちらの方が良いよ!」という情報があれば、コメント頂けると幸いです。
Discussion