1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[AWS / EC2 / CUDA] GPU対応のEC2上で、CUDA入りDockerイメージを動かす (DEPRECATED)

Last updated at Posted at 2022-09-16

0. 🚧🚧注意事項🚧🚧

以下の通り、 nvidia-docker はすでに廃止されてました (2024.1.22 らしい)

そのため、この記事には古くて使えない箇所が含まれています。途中までは参考になると思うのですが、 nvidia-docker という単語やコマンドが登場するところからは使えませんので、ご注意ください。

1. 配置状況

1-1. Hostマシン(EC2)にインストールするもの

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-docker 2.11.0
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)

その場合は、以下のようにセレクトボックスを選択して、検索ボタンを押します。

image.png

すると以下のように、470.141.03というバージョンのnvidia-driverを使うのが適切だと表示されました。

2022-09-08_13h02_28.png

nvidia-driverはコマンド経由でインストールするので、ここでダウンロードボタンを押す必要はありません。

3-1-3. nvidia-driverインストール

公式ドキュメントの「2. Runfile Installers」と書かれているところに従ってやりました。

事前準備

  1. Pre-Installation Requirement
    上記公式ドキュメントの「1.1. Pre-Installation Requirements」をまだ実行していない方は、先にやっておいた方がいいかもしれません。
  2. 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上で上記コマンドを実行した場合

image.png

ここでは、キーボードを使って対話的にインストールを進める感じになる。

3-1-4. nvidia-docker nvidia-container-toolkit インストール

nvidia-container-toolkitも公式のインストール手順に従ってインストールしました。
コマンドひたすら打つだけ。私は全部コピーandペーストでも正常にインストールできました。

Dockerコンテナ内じゃなくて、ホストマシン(EC2)側にインストールしてねo(。>∆<)o

3-2. Docker側の準備

CUDAcuDNNについては、これらがインストール済みの専用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。

Dockerfile
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しておくとよいです。

nvidia-docker を実行する必要があるので、以下のコマンドもホストマシン側(EC2)で実行しますよ!|電柱|∀゜`)ジー

# 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とかできるのかも....?

未確認ですが、良い方向に進んでいると期待しています。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?