Ubuntu22.04 LTS での Deep Learning 環境の構築

# 概要
本記事は Ubuntu22.04 LTS 上でのDeepLearning環境の構築方法について記載します。
nvidia-driverのインストール方法や、UbuntuとNvidiaGPUの相性などが改善されてきており
困ることが少なくなってきましたが、良く行う作業のため、設定方法を記事とします。


# 以前の記事や Ubuntu 20.04 LTS との影響のある変更点
- Ubuntu の Desktop System が X11 から Wayland がデフォルト設定となりました。 (が、設定をする途中で、X11に切り替わります。）
- pyenv の Path の設定が変わりました (2021/05 あたりからPathの通し方が変わっています。)

# 関連記事
https://qiita.com/k_ikasumipowder/items/14a7976f12c0b8c55dd3

https://qiita.com/k_ikasumipowder/items/e711186c329b36f53833

https://qiita.com/k_ikasumipowder/items/0dfeb8646c5044e5fa3a

# Install USB の作成
iso イメージを利用して Install USB を作成してください
http://www.ubuntulinux.jp/News/ubuntu2204-ja-remix

# Ubuntuのインストール
画面の指示に従ってインストールを行います。
- 予めどのアプリケーションをインストールしますか？
    - →通常のインストール
- Ubuntuのインストール中にアップデートをダウンロードする
    - →✓
- グラフィックとWi−Fiハードウェアと追加のメディアフォーマットのサードパーティ製ソフトウェアをインストールする
    - →✓せず

# (option) RustDeskのインストール
RustDeskを利用すると、TeamViewer のように
インターネット接続を利用してリモートデスクトップアクセスが可能です。

VPN設定前や、SSH接続ができないケースで便利です。
▼RustDesk 公式ページ
https://rustdesk.com/



# 主要ライブラリのインストール

```
sudo apt-get update
sudo apt-get upgrade

sudo apt-get install -y vim csh flex gfortran g++ \
                 cmake xorg-dev patch zlib1g-dev libbz2-dev \
                 libboost-all-dev openssh-server libcairo2 \
                 libcairo2-dev libeigen3-dev lsb-core \
                 lsb-base net-tools network-manager \
                 git-core git-gui git-doc xclip gdebi-core libffi-dev \
                 make build-essential libssl-dev zlib1g-dev libbz2-dev \
                 libreadline-dev libsqlite3-dev wget curl llvm \
                 libncurses5-dev libncursesw5-dev \
                 xz-utils tk-dev libffi-dev liblzma-dev

sudo apt update
sudo apt upgrade
```


# Nvidia driver のインストール

Ubuntu 22.04 LTS とは関係なく、Nvidia のリポジトリの問題ですが、
古い手順で実行すると以下のエラーが出るため注意してください。

※ RTX 4090 の場合はこちらの公式の手順を参照してください

```
wget https://jp.download.nvidia.com/XFree86/Linux-x86_64/550.135/NVIDIA-Linux-x86_64-550.135.run
chmod +x NVIDIA-Linux-x86_64-550.135.run
sudo ./NVIDIA-Linux-x86_64-550.135.run
```

その後以下の手順を実行します。
https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Ubuntu&target_version=22.04&target_type=deb_local

```
W: GPG エラー: https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY A4B469963BF863CC
E: リポジトリ https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64 InRelease はもう署名されていません。
N: このようなリポジトリから更新を安全に行うことができないので、デフォルトでは更新が無効になっています。
N: リポジトリの作成とユーザ設定の詳細は、apt-secure(8) man ページを参照してください。
```

※ RTX 4090 以外の場合はこちらの公式の手順を参照してください
※冒頭の NVIDIA package repositories の .pin や .pub の設定が新しくなっています。
```
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/3bf863cc.pub
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/ /"
sudo apt-get update


wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb

sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
sudo apt-get update

wget https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/libnvinfer7_7.1.3-1+cuda11.0_amd64.deb
sudo apt install ./libnvinfer7_7.1.3-1+cuda11.0_amd64.deb
sudo apt-get update

sudo apt-get install --no-install-recommends \
    cuda-11-8 \
    libcudnn8 \
    libcudnn8-dev


# 一旦ここで再起動を行う

sudo apt-get install -y --no-install-recommends libnvinfer7=7.1.3-1+cuda11.0 \
    libnvinfer-dev=7.1.3-1+cuda11.0 \
    libnvinfer-plugin7=7.1.3-1+cuda11.0

```


# pyenvのインストール
```
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```
パスを通します。

```
# ~/.bashrc にPATHを通す (2021/05 あたりに内容が変わりました。 )
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc

```

再起動します。
```
source ~/.bashrc
```

好きなバージョンをインストールして設定します。
```
pyenv install 3.10.9
pyenv global 3.10.9
pyenv rehash
python -V
> Python 3.10.9
```

# Docker のインストール

```
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 run hello-world
```

# nvidia-container-toolkit のインストール
container 内から GPU を使うための設定です。

公式ドキュメントの手順に従います。
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-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` を叩いて、ホストマシンのGPUが見えたら成功です。