📚
UbuntuにDockerをインストールしてGPUを認識させる
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バージョンに対応したものを入れないと動作しない
NVIDIAアカウントでログインする必要がある。
> 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だけではダメで、これを入れる必要がある。
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ベンチマークを計測してみる
認識できてなければ、計測できない。
> 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