Manjaro LinuxとDockerでTensorflow+CUDA+Jupyter環境を構築(後編)

Manjaro LinuxとDockerでTensorflow+CUDA+Jupyter環境を構築(後編)

Manjaro LinuxとDockerでTensorflow+CUDA+Jupyter環境を構築(後編)

どうもfkdm(@fkdm88)です。

前回はCUDAの導入までをこの記事で説明しました。今回はDockerを用いてTensorflow+CUDA+Jupyter環境を構築します。

Docker+Tensorflow+CUDA構築 〜後編〜

Dockerのインストールは省きます。まだの方はArchwiki – Dockerなど参照してインストールしましょう。

NVIDIA container runtimeをインストール

DockerでGPUを使うためのパッケージをインストールします。AURリポジトリのパッケージになりますので、yayを使います。(前編でも断りなしで使ってましたね。便利ですのでぜひ導入を)

インストール後はDockerサービスを再起動しておきましょう。

$ yay -Sy nvidia-container-runtime
$ sudo systemctl restart docker.service

nvidiaが提供しているDockerイメージを使用して動作確認します。こんな出力が返ってきたら、Docker上でGPU認識しCUDA動かせている証拠です。

$ docker run --gpus all --rm nvidia/cuda nvidia-smi
Sat Jan 16 13:13:06 2021       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 455.45.01    Driver Version: 455.45.01    CUDA Version: 11.1     |
|-------------------------------+----------------------+----------------------+
| 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  GeForce GT 750M     Off  | 00000000:04:00.0 N/A |                  N/A |
| N/A   48C    P8    N/A /  N/A |      3MiB /  2002MiB |     N/A      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
​

必要イメージを取得

TensorflowのOfficialイメージが公開されています。便利ですね。GPU+JupyterのDockerイメージがほしいのでxxx-gpu-jupyterのタグがついたイメージを取得します。

ここで注意が1点。筆者環境のGPU(GK107M)が古く、最新のTensorflowを使用することができませんでした。原因はGPUに紐づくCUDA capabilityが3.0であるのに対し、最近のTensorflowのHW Requirementは3.5以上であるためです。試行錯誤したところ1.8.0-rc1-gpuが3.0が使える最後のバージョンでしたのでやむなく、旧版を使用します。py3ではだめです。Jupyterも使えない・・・;;

# CUDA capability >= 3.5
$ docker pull tensorflow/tensorflow:latest-gpu-jupyter
​
# CUDA capability < 3.5
$ docker pull tensorflow/tensorflow:1.8.0-rc1-gpu
​
# 動作確認 (1.8.0)
$ docker run --rm --gpus=all -it tensorflow/tensorflow:1.8.0-rc1-gpu python -c "import tensorflow as tf; from tensorflow.python.client import device_lib; print(tf.__version__); print(device_lib.list_local_devices())"
​
... 中略 ...
​
1.8.0-rc1
​
... 中略 ...
​
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 11330876312730105417
, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 1802371072
locality {
  bus_id: 1
  links {
  }
}
incarnation: 4104563608929056630
physical_device_desc: "device: 0, name: GeForce GT 750M, pci bus id: 0000:04:00.0, compute capability: 3.0"
]

Jupyterサーバとして稼働させる (CUDA capability >= 3.5 only)

仕上げに、以下コマンドでコンテナ立ち上げておけば完了です。http://localhost:8888 にアクセスすればJupyterが開きます。

$ docker run --gpus=all --name tensorflow -p 8888:8888 -it tensorflow/tensorflow:latest-gpu-jupyter
​
# ログインの際に必要なtokenを確認する方法(この出力例だと8120f8ba826c6bb99e8c34c149c9e1a0151802bb3d2c83a9がtoken)
docker exec -it tensorflow jupyter-notebook list
Currently running servers:
http://0.0.0.0:8888/?token=8120f8ba826c6bb99e8c34c149c9e1a0151802bb3d2c83a9 :: /tf

先程書きましたが、CUDA capability=3.0に対応するDockerイメージにはJupyter対応済みのものがない。。GPUを諦めるかJupyterを諦めるか、自作Dockerイメージを作るか、の3択です。余力があれば自作版を書こう。GPU買うかぁ。

まとめ

出たとこ勝負で始めてしまった本記事ですが、結果的に筆者環境ではJupyter立ち上げならず。ということでまとめです。

  • まず先にGPUのCUDA capabilityを確認すべし!
  • capabilityが古いと最新TFは使用できない。Jupyterも。
  • CUDAのインストールはDockerを活用することでかなり楽。

参考文献