0. 🚧🚧注意事項🚧🚧
以下の通り、 nvidia-docker はすでに廃止されてました (2024.1.22 らしい)
そのため、この記事には古くて使えない箇所が含まれています。途中までは参考になると思うのですが、 nvidia-docker
という単語やコマンドが登場するところからは使えませんので、ご注意ください。
1. 配置状況
1-1. Hostマシン(EC2)にインストールするもの
- docker - 公式インストール手順
- nvidia-driver - 公式インストール手順
-
nvidia-dockernvidia-container-toolkit - 公式インストール手順
1-2. Docker上にあればよいもの
- CUDA
- (cuDNN)
- (python3)
2. Environment
Information | |
---|---|
EC2 instance type | p2 |
GPU | Tesla K80 |
docker | 20.10.17 |
docker image | nvidia/cuda:11.4.1-cudnn8-devel-ubuntu20.04 |
nvidia-driver | 470.141.03 |
NVIDIA Container Toolkit | ??? |
3. install方法
3-1. Hostマシン側
3-1-1. Docker
dockerは公式ドキュメントの通りにインストールしました。
他にいくらでも記事があるので省略。
3-1-2. nvidia-driverのバージョンを確認
次に、どのバージョンのnvidia-driver
をインストールすればよいかを、以下のサイトで確認します。
nvidia-driver
のどのバージョンを使えばよいかは、利用するGPUの種類によって違います。
たとえば私はEC2のp2
マシンを使っていたのですが、以下のコマンドでGPUの種類を確認してみると、tesla K80が載っていることがわかりました。
$ lspci | grep -i nvidia
00:1e.0 3D controller: NVIDIA Corporation GK210GL [Tesla K80] (rev a1)
その場合は、以下のようにセレクトボックスを選択して、検索ボタンを押します。
すると以下のように、470.141.03
というバージョンのnvidia-driverを使うのが適切だと表示されました。
nvidia-driverはコマンド経由でインストールするので、ここでダウンロードボタンを押す必要はありません。
3-1-3. nvidia-driverインストール
公式ドキュメントの「2. Runfile Installers」と書かれているところに従ってやりました。
事前準備
-
Pre-Installation Requirement
上記公式ドキュメントの「1.1. Pre-Installation Requirements」をまだ実行していない方は、先にやっておいた方がいいかもしれません。 -
nouveau
無効化
nouveau
というdriverが既にインストールされているマシンでは
この記事やこの記事に書かれているような方法でnouveau
を無効化しておくとよい。
nouveau
が動いているかどうかは以下のコマンドで確認できるので、何か表示されたら無効化を先に行っておこう。
$ lsmod | grep -i nouveau
インストール開始
公式ドキュメントの2. Runfile Installers
に従ってコマンドを実行していきます。
nvidia-driver
のインストール時は、シェル上にUIっぽいものが出現して、対話的にインストールを進めることになる。
以下のような感じ。
$ sudo sh ./NVIDIA-Linux-x86_64-470.141.03.run ..............
Verifying archive integrity... OK
Uncompressing NVIDIA Accelerated Graphics Driver for Linux-x86_64 470.141.03..................................................
もうちょっと待つと、以下のようなUIが出現する。
※teraterm
上で上記コマンドを実行した場合
ここでは、キーボードを使って対話的にインストールを進める感じになる。
3-1-4. nvidia-docker nvidia-container-toolkit インストール
nvidia-container-toolkitも公式のインストール手順に従ってインストールしました。
コマンドひたすら打つだけ。私は全部コピーandペーストでも正常にインストールできました。
Dockerコンテナ内じゃなくて、ホストマシン(EC2)側にインストールしてねo(。>∆<)o
3-2. Docker側の準備
CUDA
とcuDNN
については、これらがインストール済みの専用docker imageがあるので、それを利用しました。
3-2-1. CUDAバージョン選択
先ほどのnvidia-driverのバージョン確認の画面では、tesla K80を選択するとCUDAバージョンについては11.4までしか選べませんでした。
tesla K80は若干古いんでしょうかね。
少なくとも、あの画面で選択可能なCUDAバージョンのうちのどれかを選ぶのが良さそうです。
...という経緯から、CUDAのバージョンは11.4系にしました。
3-2-2. Docker image選択
選択可能なdocker imageはここで探しました。
私の場合は、CUDA 11.4系で、更にcuDNNを使いたいのと、なるべく新しいUbuntuにしておきたかったので、nvidia/cuda:11.4.1-cudnn8-devel-ubuntu20.04
を選びました。
3-2-3. Dockerfile作成
そして、こんな感じでDockerfileを作成すればOK。
FROM nvidia/cuda:11.4.1-cudnn8-devel-ubuntu20.04
...
cuDNNが不要な場合は、cuDNNなしのイメージもあるっぽいので、それを利用しよう。
あとはいつも通りDockerをbuildするだけ。
4. install結果の確認
4-1. nvidia-driverのバージョン確認
これはホストマシン側(EC2)で実行します。
nvidia-driverはEC2側にインストールしましたよね?|・ω・`)コソッ
$ cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module 470.141.03 Thu Jun 30 18:45:31 UTC 2022
GCC version: gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
4-1. nvidia-dockerのバージョン確認
これもホストマシン側(EC2)で実行。
nvidia-dockerもEC2側にインストールしましたよね?
多分今は、こんな nvidia-docker などというコマンドはなくなっているはず|・`ω・´)チラリッ
$ nvidia-docker version
NVIDIA Docker: 2.11.0 # <----- ここに1行追加されてる
Client: Docker Engine - Community
Version: 20.10.17
API version: 1.41
Go version: go1.17.11
Git commit: 100c701
Built: Mon Jun 6 23:02:57 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.17
API version: 1.41 (minimum version 1.12)
Go version: go1.17.11
Git commit: a89b842
Built: Mon Jun 6 23:01:03 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.8
GitCommit: 9cd3357b7fd7218e4aec3eae239db1f68a5a6ec6
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
🚧🚧以降は工事中🚧🚧
nvidia-docker がなくなったみたいなので、この記事は今は古くて使えないと思われます。もし EC2 で環境構築する事があったら、更新したいと思います。
4-3. 全体の動作確認
これまでインストールしてきたものは相互に関連し合っているので、全体が正常に動くかを確認します。
以下のコマンド実行前に、docker buildしておくとよいです。
を実行する必要があるので、以下のコマンドもホストマシン側(EC2)で実行しますよ!|電柱|∀゜`)ジーnvidia-docker
# docker image名は各自で変更してね
$ nvidia-docker run --rm --gpus all nvidia/cuda:11.4.2-cudnn8-devel-ubuntu20.04 nvidia-smi
Thu Sep 8 04:39:31 2022
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.141.03 Driver Version: 470.141.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 Off | 00000000:00:1E.0 Off | 0 |
| N/A 46C P0 60W / 149W | 0MiB / 11441MiB | 100% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
上記のような表が表示されれば、無事動いているということです。
5. 起動コマンドの注意点
# ダメだった...
$ docker run -it ....
# こうすればOK
$ nvidia-docker run -it ....
上記の通り、いつも通りdockerコマンドを使うと、私の場合はGPUが認識されませんでした。要注意です。nvidia-docker run ...
としておくのが良さそう。
(+α) 皆さんなら大丈夫だと思いますが、nvidia-dockerをインストールした後に sudo systemctl restart docker
くらいは実行して、docker daemonの再起動はしておいた方がいいかもしれません。
6. 思ったこと
これだと、docker-compose
と連携させるの難しいな...
んーーーいや、最近はdockerのアップデートによってコマンドの打ち方が変わって、docker compose
みたいな打ち方に変わったから、nvidia-docker compose up
とかできるのかも....?
未確認ですが、良い方向に進んでいると期待しています。