Ubuntu 22.04 Docker GPU RTX3090 Pytorch環境 構築メモ

# Nvidia Driver, CUDA, CuDNN Version選定
Pytorchをいれるので、下記からCUDA11.7をいれることにした。

https://pytorch.org/get-started/locally/

下記からCUDA11.7で必要なDriverのVerが>=515.48.07ということがわかる。

https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#cuda-major-component-versions__table-cuda-toolkit-driver-versions

下記からCUDA11.7のときは、cuDnn8.6.0forCUDA 11.xが必要ということがわかる。

https://docs.nvidia.com/deeplearning/cudnn/support-matrix/index.html#cudnn-cuda-hardware-versions



## Docker Install
```sh:Docker の　Install
$ sudo apt-get update
$ sudo apt-get install ca-certificates curl gnupg lsb-release

$ sudo mkdir -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-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
sudoなしでDockerを実行するため、UserGroupにDockerを追加
```sh:Docker Groupへ追加
# Usergroupの確認
$ cat /etc/group | grep docker
# なければUserGroup追加
$ sudo groupadd docker
#
$ sudo gpasswd -a $USER docker
#
$ sudo systemctl restart docker
```
参考URL

https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository

https://qiita.com/DQNEO/items/da5df074c48b012152ee


## Nvidia Driver Install
ソフトウェアとアップデートから　nvidia-driverをInstall
![Screenshot from 2022-06-04 06-10-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432500/11c85854-845a-62b2-d02b-bc811948778d.png)

## CUDA Install
- 下記のCUDA TookKit11.7 Update1　から Linux, x86_64, Ubuntu, 22.04, runfile(local) を選択して表示されたコマンドをbashで実行

https://developer.nvidia.com/cuda-11-7-1-download-archive

```sh:CUDA 11.7.1 Install
$wget https://developer.download.nvidia.com/compute/cuda/11.7.1/local_installers/cuda_11.7.1_515.65.01_linux.run
$sudo sh cuda_11.7.1_515.65.01_linux.run
```

## CuDNN Install
- 下記からCuDNNのTarファイル(ここでは Local Installer for Linux x86_64 (Tar))をDownLoad 

https://developer.nvidia.com/rdp/cudnn-download

- 下記のTar File InstallationにしたがってInstall

https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#installlinux-tar

```sh:CuDNN Install
$ tar -xvf cudnn-linux-x86_64-8.x.x.x_cudaX.Y-archive.tar.xz
$ sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include 
$ sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64 
$ sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
```
## Setting up NVIDIA Container Toolkit
下記を実行してNVIDIA Container ToolKitをInstall
```sh
$ 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-get update
$ sudo apt-get install -y nvidia-docker2
$ sudo systemctl restart docker
$ sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
```
最後に nvidia-smiが表示されればOK

参考URL

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

## Dockerfile作成
下記のDockerfileを適当なフォルダに作成
```dockerfile:DockerFile
FROM nvidia/cuda:11.3.1-base-ubuntu20.04
USER root

RUN apt-get update
RUN apt-get -y install locales && \
    localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
RUN apt-get install -y vim less

ENV LANG ja_JP.UTF-8
ENV LANGUAGE ja_JP:ja
ENV LC_ALL ja_JP.UTF-8
ENV TZ JST-9
ENV TERM xterm

RUN mkdir -p /root/work
WORKDIR /root/work
```

## Docker操作
上記のDockerFileの場所で下記を実行
```sh
$ docker build -t ubuntu:gpu-base ./ 
$ docker run -it --gpus all -v $(pwd)/work:/root/work --name ubuntu_gpu-base ubuntu:gpu-base
```
するとコンテナのbashに入るので、そこで下記を実行して<br>
Python3.10 と Pytorch(CUDA11.3)をInstall
```sh
$ apt -y update
$ apt -y install build-essential libbz2-dev libdb-dev libreadline-dev libffi-dev libgdbm-dev liblzma-dev libncursesw5-dev libsqlite3-dev libssl-dev zlib1g-dev uuid-dev tk-dev
$ apt -y install wget

$ wget https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tar.xz
$ tar xJf Python-3.10.4.tar.xz
$ cd Python-3.10.4
$ ./configure
$ make
$ make install

$ pip3 install torch torchvision torchaudio
```

## GPUの確認
下記を実行してTrueがでればOK。
```sh
$ python3
>>> import torch
>>> torch.cuda.is_available()
```
## コンテナのImages化
上記で、ubuntu_gpu-baseにPytorchのGPU環境ができたので、それを使いまわしするために、そのコンテナをImage化する。
```sh
docker commit ubuntu_gpu-base ubuntu:pytorch-gpu-base
```
これで、ubuntu:pytorch-gpu-baseができているのが確認できる。
```sh
$ docker images
REPOSITORY    TAG                       IMAGE ID       CREATED          SIZE
ubuntu        pytorch-gpu-base          975ed33d3b4f   10 seconds ago   6.44GB
ubuntu        gpu-base                  aac3bb538e10   14 minutes ago   325MB
nvidia/cuda   11.7.1-base-ubuntu22.04   fb867644c24a   3 weeks ago      208MB
```

## ubuntu:pytorch-gpu-base からコンテナをつくる

```sh
cd (作業フォルダ)
mkdir work
docker run -it --gpus all -v $(pwd)/work:/root/work --name pytorch1 ubuntu:pytorch-gpu-base
#これで、コンテナ内のbashにはいるので、exitでいっかい抜ける
root@xxxxxxx:~/work# exit
#止まってるコンテナを確認すると pytorch1という名前のコンテナができていることがわかる。
$ docker ps -a
CONTAINER ID   IMAGE                     COMMAND   CREATED          STATUS                     PORTS     NAMES
0f87d847b8b2   ubuntu:pytorch-gpu-base   "bash"    18 seconds ago   Exited (0) 5 seconds ago             pytorch1
b7dac43a585c   ubuntu:gpu-base           "bash"    17 minutes ago   Exited (2) 8 minutes ago             ubuntu_gpu-base
#次回からは、下記でstartでOK(vs code から起動でもOK)
$ docker start pytorch1

```

## docker compose
```yml:docker-compose.yml
version: '3.9'

services:
    otto:
        image: ubuntu:gpu-pytorch
        hostname: localhost
        ports:
            - 7474:7474
        volumes:
            - ${PWD}/work:/root/work
        tty: true
        runtime: nvidia
```
```sh
$ docker compose up -d
```





## おまけ
##### Docker コンテナの起動
```sh
$ docker start ubuntu_gpu-base
```
##### Docker コンテナにbashではいる
```sh
$ docker exec -it ubuntu_gpu-base bash
```
##### Docker コンテナのImage化
コンテナを停止させてから、　docker commit [コンテナ名] [リポジトリ名:タグ名]
```sh
$ docker commit ubuntu_gpu-base ubuntu:gpu-pytorch
```

Ubuntu Version Check
```sh
lsb_release -a
```

#### Nvidia Driver version 確認
```sh
nvidia-smi
```

## 参考Url

https://www.python.jp/install/ubuntu/index.html