🧠

Ubuntu22.04のDockerでTensorflowをGPUで動かしてみた.

2023/05/18に公開

環境

  • PC
    • CPU: Intel(R) Core(TM) i7-10875H CPU @ 2.30GHz
    • GPU: NVIDIA GeForce RTX 3060 Laptop GPU
  • OS
    • Ubuntu Desktop 22.04.2 LTS

nvidia-driverのインストール

driver listの取得

利用可能なドライバーの一覧を表示する.

sudo apt install -y ubuntu-drivers-common
ubuntu-drivers devices

私の環境ではこうなった.

== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00002520sv00001D05sd00001116bc03sc00i00
vendor   : NVIDIA Corporation
model    : GA106M [GeForce RTX 3060 Mobile / Max-Q]
driver   : nvidia-driver-525-open - distro non-free
driver   : nvidia-driver-525-server - distro non-free
driver   : nvidia-driver-515 - distro non-free
driver   : nvidia-driver-530-open - distro non-free recommended
driver   : nvidia-driver-470 - distro non-free
driver   : nvidia-driver-530 - distro non-free
driver   : nvidia-driver-470-server - distro non-free
driver   : nvidia-driver-515-open - distro non-free
driver   : nvidia-driver-515-server - distro non-free
driver   : nvidia-driver-525 - distro non-free
driver   : nvidia-driver-510 - distro non-free
driver   : xserver-xorg-video-nouveau - distro free builtin

大抵はrecommendedのものをインストールすればいい.
ただし,末尾に-openまたはserverとあるものは避ける.

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

driver listの中で良さげなものを選んだらaptでインストールする.
今回は-openがついているものを除いて一番新しそうなものをインストールした.

sudo apt install nvidia-driver-530

インストールできたら,再起動する.

reboot

ドライバーの確認

再起動したら,ドライバーがインストールされたか確認する.

nvidia-smi

実行後にこのような画面が出たら成功.

+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 530.41.03              Driver Version: 530.41.03    CUDA Version: 12.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  NVIDIA GeForce RTX 3060 L...    Off| 00000000:01:00.0 Off |                  N/A |
| N/A   39C    P0               N/A /  N/A|      6MiB /  6144MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|    0   N/A  N/A      2124      G   /usr/lib/xorg/Xorg                            4MiB |
+---------------------------------------------------------------------------------------+

Dockerのインストールとセットアップ

Dockerのインストール

dockerのリポジトリをセットアップする.

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg

GPG-keyの登録.

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

リポジトリの設定

echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

続いて,Dockerのインストール

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

インストールできたか確認するために,テスト用のコンテナを起動してみる.

sudo docker run hello-world

実行結果

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
719385e32844: Pull complete 
Digest: sha256:fc6cf906cbfa013e80938cdf0bb199fbdbb86d6e3e013783e5a766f50f5dbce0
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

ユーザーグループの設定

このあとvscodeの設定に必要なのと、dockerのコマンドを打つたびにsudoするのは面倒なので、dockerのユーザーグループを設定する.

sudo gpasswd -a <ユーザー名> docker

<ユーザー名>のところをdockerを利用するUbuntuのユーザー名に変更する.
ユーザーグループに登録できたか確認する.

getent group docker

実行結果例

docker:x:999:ユーザー名

設定出来たら再起動する.

reboot

nvidia-container-runtimeのインストール

tensorflowのコンテナでGPUを使うにはこのランタイムが必要.
wikiの通りにインストールする.

sudo apt-get install nvidia-docker2
sudo pkill -SIGHUP dockerd

Tensorflowのイメージの取得と起動

まずはTensorflowのイメージをダウンロードする

docker pull tensorflow/tensorflow:latest-gpu 

ダウンロードできたら起動する.

docker run --gpus all -it tensorflow/tensorflow:latest-gpu
  • docker pull
    • Dockerのイメージをリモートからダウンロードする。
  • docker run
    • Dockerのコンテナを作成し、起動する。
  • docker start
    • Dockerのコンテナを起動する。一度作ったコンテナを起動するときに使う。
  • docker stop
    • Dockerのコンテナを停止する。引数はCONTAINER_IDCONTAINER_NAME
  • docker ps
    • Dockerのコンテナの一覧を表示する。-aオプションですべて表示する。

コンテナでGPUを認識しているか確認する

コンテナ内のBashでPythonを実行して,下のコードを実行する.

from tensorflow.python.client import device_lib
device_lib.list_local_devices()

表示されるデバイス一覧にGPUの表示があれば認識されている。CPUしかなかったら、認識されてない。nvidia-smiを実行しても確認することができる。

Discussion