🧠
Ubuntu22.04のDockerでTensorflowをGPUで動かしてみた.
環境
- 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_ID
かCONTAINER_NAME
- Dockerのコンテナを停止する。引数は
-
docker ps
- Dockerのコンテナの一覧を表示する。
-a
オプションですべて表示する。
- Dockerのコンテナの一覧を表示する。
コンテナでGPUを認識しているか確認する
コンテナ内のBashでPythonを実行して,下のコードを実行する.
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
表示されるデバイス一覧にGPUの表示があれば認識されている。CPUしかなかったら、認識されてない。nvidia-smi
を実行しても確認することができる。
Discussion