Docker、はじめてみました (Part 4)

「Docker、はじめてみました」シリーズの続編です。
※この記事はWSL2での動作のみ確認済みです

## 本記事で目指すところ
今回はDockerでPytorch環境を構築して実際にGPU認識を行います。
これまでよりはかなり応用編になっています。
※pytorch公式サイトで最新のcuda v12.4を使います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740370/8f4cce03-d112-5712-8977-bdea40b9e64a.png)
https://pytorch.org/get-started/locally/
(2024/12/26執筆時点)

# (A) NVIDIA
## 1. NVIDIAドライバ
まずNVIDIAドライバをホストマシンにインストールします。下記URLの「Get CUDA Driver」をクリック（https://developer.nvidia.com/cuda/wsl）するとhttps://www.nvidia.com/en-us/drivers/に移動する。
※OSでWindows11を選択すること。Linuxではない。Windows11用のドライバにWSL用のドライバも含まれている。

後は指示に従ってインストールを進めていき、下記コードが動作すればokです！
```bash:bash
nvidia-smi
```

## 2. NVIDIAコンテナツールキット
NVIDIAコンテナツールキットをインストールします。
下図をみるとToolkitはコンテナごとに含まれるみたいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740370/f639b62d-008a-f48f-e059-f7615bbedd3e.png)
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/index.html より引用

```bash:bash
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/stable/deb/nvidia-container-toolkit.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
# deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://nvidia.github.io/libnvidia-container/stable/deb/$(ARCH) /
# deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://nvidia.github.io/libnvidia-container/experimental/deb/$(ARCH) /

sudo apt-get update

sudo apt-get install -y nvidia-container-toolkit
```
これでコンテナツールキットのインストールはできたはずです

## 3. Dockerで認識させる
```bash:bash
sudo nvidia-ctk runtime configure --runtime=docker
# INFO[0000] Config file does not exist; using empty config
# INFO[0000] Wrote updated config to /etc/docker/daemon.json
# INFO[0000] It is recommended that docker daemon be restarted.
```
※ここでsystemctlを使ったdocker再起動が推奨されているが、そもそもWSL2ではsystemctlコマンドがないので、docker desktopを再起動させておく。

最後に以下でcuda認識の確認を行いましょう。cuda12.4のサンプルイメージを選択します。※
※nvccコマンドを使いたいので-develイメージを選択したため少し重いです、、
```bash:bash
docker run --rm --runtime=nvidia --gpus all nvidia/cuda:12.4.0-devel-ubuntu20.04 bash -c "nvcc --version"
# Unable to find image 'nvidia/cuda:12.4.0-devel-ubuntu20.04' locally
# 12.4.0-devel-ubuntu20.04: Pulling from nvidia/cuda
# 9ee6bdb31195: Download complete
# 9dd75d06a091: Download complete
# 533b4aebf169: Download complete
# 30bfca4dd349: Download complete
# ebfec18059b9: Download complete
# 1b57ce94cad9: Download complete
# Digest: sha256:7dbb60f0821f40989e22e554c37fc6dcfa17a62f6c710b2ab23115dee03f5477
# Status: Downloaded newer image for nvidia/cuda:12.4.0-devel-ubuntu20.04
# 
# ==========
# == CUDA ==
# ==========
# 
# CUDA Version 12.4.0
# 
# Container image Copyright (c) 2016-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# 
# This container image and its contents are governed by the NVIDIA Deep Learning Container License.
# By pulling and using the container, you accept the terms and conditions of this license:
# https://developer.nvidia.com/ngc/nvidia-deep-learning-container-license
# 
# A copy of this license is made available in this container at /NGC-DL-CONTAINER-LICENSE for your convenience.
# 
# nvcc: NVIDIA (R) Cuda compiler driver
# Copyright (c) 2005-2024 NVIDIA Corporation
# Built on Thu_Mar_28_02:18:24_PDT_2024
# Cuda compilation tools, release 12.4, V12.4.131
# Build cuda_12.4.r12.4/compiler.34097967_0
```
※ホストマシンはCUDA v12.6だが、コンテナはv12.4となっていることが確認できた。


# (B) Docker
docker hub (https://hub.docker.com/r/nvidia/cuda/tags) から必要なイメージを参考にしてみます。
もともと最新のUbuntu24.04を使っていたのですが、CUDA v12.4はUbuntu24.04には対応していないみたいので12.4.1-cudnn-devel-ubuntu22.04をベースにします。

## 1. Ubuntuのインストール
```bash
wsl -l -v
#   NAME              STATE           VERSION
# * Ubuntu-24.04      Running         2

wsl -l -o
# インストールできる有効なディストリビューションの一覧を次に示します。
# 'wsl.exe --install <Distro>' を使用してインストールします。

# NAME                            FRIENDLY NAME
# Ubuntu                          Ubuntu
# Debian                          Debian GNU/Linux
# kali-linux                      Kali Linux Rolling
# Ubuntu-18.04                    Ubuntu 18.04 LTS
# Ubuntu-20.04                    Ubuntu 20.04 LTS
# Ubuntu-22.04                    Ubuntu 22.04 LTS
# Ubuntu-24.04                    Ubuntu 24.04 LTS
# OracleLinux_7_9                 Oracle Linux 7.9
# OracleLinux_8_7                 Oracle Linux 8.7
# OracleLinux_9_1                 Oracle Linux 9.1
# openSUSE-Leap-15.6              openSUSE Leap 15.6
# SUSE-Linux-Enterprise-15-SP5    SUSE Linux Enterprise 15 SP5
# SUSE-Linux-Enterprise-15-SP6    SUSE Linux Enterprise 15 SP6
# openSUSE-Tumbleweed             openSUSE Tumbleweed

wsl --install -d ubuntu-22.04

wsl -s Ubuntu-22.04
# この操作を正しく終了しました。

wsl -l -v
#   NAME              STATE           VERSION
# * Ubuntu-22.04      Running         2
#   Ubuntu-24.04      Running         2
```

## 2. dockerfileの作成

```plaintext:pytorch_cu124_ubuntu2204
# ベースイメージ
FROM nvidia/cuda:12.4.1-cudnn-runtime-ubuntu22.04

# 環境変数設定
ENV DEBIAN_FRONTEND=noninteractive

# 作業ディレクトリを設定
WORKDIR /home/jupyter

# 必要な依存関係をインストール
RUN apt update && apt install -y --no-install-recommends \
    wget \
    bzip2 \
    build-essential \
    git \
    curl \
    ca-certificates \
    libsndfile1-dev \
    libgl1 \
    python3 \
    python3-pip && \
    apt clean && rm -rf /var/lib/apt/lists/*

# Pythonパッケージの依存関係をインストール
RUN pip3 install --no-cache-dir -U pip

# PyTorchをインストール
RUN pip3 install --no-cache-dir \
    torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

# Jupyter Labのインストール
RUN pip3 install --no-cache-dir jupyterlab

# ポート設定
EXPOSE 8888

# デフォルトのコマンド
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root"]
```

## Dockerイメージの作成
作成したDockerfileがあるディレクトリに移動しておく
```bash:bash
docker build \
> -f pytorch_cu124_ubuntu2204 \
> -t torch:cu124 \
> .

docker images
# REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
# torch        cu124     7ff9d0f7a96e   2 minutes ago   15GB
```
イメージサイズは15GBもある！

## Dockerコンテナ作成
```bash:bash
docker run \
> --gpus all \ # GPUを利用可能に設定する
> --name <Dockerコンテナ名> \
> -p 8888:8888 \ # この部分でポートを割り当てている
> -v /home/<ユーザー名>/<マウントしたいディレクトリ>:/home/jupyter/<マウントしたいディレクトリ> \
> -d <Dockerイメージ名>
```

## Dockerコンテナ起動
```bash:bash
docker start <コンテナ名>

docker logs <コンテナ名>
```
上記で表示されるURLにアクセスするとJupyter Labが立ち上がっている
→ ブラウザのお気に入りにでも入れておきましょう♪

## Pytorch GPU動作確認
参考にさせていただきました！
https://qiita.com/Haaamaaaaa/items/d237456302ef9332f6e4
```py:py
import torch

print(torch.__version__)
print(f"cuda, {torch.cuda.is_available()}")
print(f"compute_{''.join(map(str,(torch.cuda.get_device_capability())))}")
device_num:int = torch.cuda.device_count()
print(f"find gpu devices, {device_num}")
for idx in range(device_num):
    print(f"cuda:{idx}, {torch.cuda.get_device_name(idx)}")

print("end")
# 2.5.1+cu124
# cuda, True
# compute_86
# find gpu devices, 1
# cuda:0, NVIDIA GeForce RTX 3090
# end
```

# 最後に
ようやくpytorchのdockerを設定できた！

# 追記
```bash:bash
pip --version
# pip 24.3.1 from /usr/local/lib/python3.10/dist-packages/pip (python 3.10)
```
python v3.10が入っていた（2024/12/26現在）

:::note info
**この時点で知っておくべきTipsや基本的内容があればぜひコメントください！**
:::