📚

UbuntuにDockerをインストールしてGPUを認識させる

2022/09/05に公開

Ubuntu20.04にDockerをインストールして、コンテナ内でNVIDIAのGPUを認識させるまでのメモ。ちなみにGPUはNVIDIA RTX3070の環境でやってます。

NVIDIAドライバインストール

とりあえず最新版入れればOK

> sudo add-apt-repository ppa:graphics-drivers/ppa
> sudo apt update

> sudo apt search nvidia-driver-
:
nvidia-driver-515/focal-security 515.86.01-0ubuntu0.20.04.1 amd64 [upgradable from: 515.65.01-0ubuntu0.20.04.1]
  NVIDIA driver metapackage

> sudo apt install nvidia-driver-515
> sudo reboot

CUDAインストール

Dockerで使う場合はいらないが、ホスト側でも使いたいのでとりあえずインストールしている。バージョンはフレームワークに合わせる必要があるので、ver11.2をインストールした。
(なので、Dockerでやったほうがいい)

> wget https://developer.download.nvidia.com/compute/cuda/11.2.2/local_installers/cuda_11.2.2_460.32.03_linux.run
> sudo sh cuda_11.2.2_460.32.03_linux.run

.bashrcに追加

> vi ~/.bashrc

export CUDA_HOME=/usr/local/cuda
export PATH=$PATH:$CUDA_HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_HOME/lib64

> source ~/.bashrc
> nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Sun_Feb_14_21:12:58_PST_2021
Cuda compilation tools, release 11.2, V11.2.152
Build cuda_11.2.r11.2/compiler.29618528_0

コマンドプロンプトで確認

> nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Mon_May__3_19:41:42_Pacific_Daylight_Time_2021
Cuda compilation tools, release 11.3, V11.3.109
Build cuda_11.3.r11.3/compiler.29920130_0

cuDNNのインストール

cuDNNはCUDAバージョンに対応したものを入れないと動作しない

https://qiita.com/konzo_/items/a6f2e8818e5e8fcdb896

NVIDIAアカウントでログインする必要がある。

https://developer.nvidia.com/compute/machine-learning/cudnn/secure/8.1.1.33/11.2_20210301/cudnn-11.2-linux-x64-v8.1.1.33.tgz

> tar xzvf cudnn-11.2-linux-x64-v8.1.1.33.tgz
> sudo cp cuda/include/cudnn.h /usr/local/cuda/include
> sudo cp -P cuda/lib64/libcudnn /usr/local/cuda/lib64
> sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn

Dockerインストール

NVIDIAドライバ関連がインストールできたらDockerをインストールする

> sudo apt update && sudo apt install ca-certificates curl gnupg lsb-release

> sudo mkdir -m 0755 -p /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

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

> sudo apt update && sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
> docker -v
Docker version 23.0.1, build a5ee5b1

> docker compose version
Docker Compose version v2.16.0

NVIDIA Container Toolkitのインストール

Dockerだけではダメで、これを入れる必要がある。

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#setting-up-nvidia-container-toolkit

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
  && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
  sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

> sudo apt update && sudo apt install -y nvidia-container-toolkit

以下のnvidia-ctkコマンドを実行するのが重要で、docker composeでruntime: nvidiaを指定すると「そんなサービス知らない」と言われた記憶がある。

ここまで来たら、Dockerを再起動してインストールは完了。

> sudo nvidia-ctk runtime configure --runtime=docker

INFO[0000] Loading docker config from /etc/docker/daemon.json 
INFO[0000] Config file does not exist, creating new one 
INFO[0000] Flushing docker config to /etc/docker/daemon.json 
INFO[0000] Successfully flushed config                  
INFO[0000] Wrote updated config to /etc/docker/daemon.json 
INFO[0000] It is recommended that the docker daemon be restarted. 

> cat /etc/docker/daemon.json

{
    "runtimes": {
        "nvidia": {
            "args": [],
            "path": "nvidia-container-runtime"
        }
    }
}

> sudo systemctl restart docker

コンテナ内からGPUベンチマークを計測してみる

認識できてなければ、計測できない。

https://zenn.dev/usagi1975/articles/2023-02-18-1400_docker-gpu-bench

> docker run --rm --gpus all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark -numbodies=640000
GPU Device 0: "Ampere" with compute capability 8.6

> Compute 8.6 CUDA device: [NVIDIA GeForce RTX 3070]
number of bodies = 640000
640000 bodies, total time for 10 iterations: 7012.648 ms
= 584.087 billion interactions per second
= 11681.750 single-precision GFLOP/s at 20 flops per interaction

(その他)Tensorflowのコンテナで確認


> docker run --gpus all -it --rm tensorflow/tensorflow:2.8.1-gpu bash

________                               _______________
___  __/__________________________________  ____/__  /________      __
__  /  _  _ \_  __ \_  ___/  __ \_  ___/_  /_   __  /_  __ \_ | /| / /
_  /   /  __/  / / /(__  )/ /_/ /  /   _  __/   _  / / /_/ /_ |/ |/ /
/_/    \___//_/ /_//____/ \____//_/    /_/      /_/  \____/____/|__/


> python
>>> from tensorflow.python.client import device_lib
>>> print(device_lib.list_local_devices())
:
incarnation: 6470249754415725170
physical_device_desc: "device: 0, name: NVIDIA GeForce RTX 3070, pci bus id: 0000:07:00.0, compute capability: 8.6"
xla_global_id: 416903419
]

(その他)PyTorchのコンテナで確認

> docker pull pytorch/pytorch:1.10.0-cuda11.3-cudnn8-devel

> docker run -it --rm --gpus all pytorch/pytorch:1.10.0-cuda11.3-cudnn8-devel bash

> python
>>> import torch
>>> torch.cuda.is_available()
True
>>> torch.cuda.device_count()
1
>>> torch.cuda.current_device()
0
>>> torch.cuda.get_device_name()
'NVIDIA GeForce RTX 3070'
>>> torch.cuda.get_device_capability()
(8, 6)

Discussion