【初心者向け】Docker + VSCode + Git でPytorchのGPU環境を構築してみた【Windows11】

# はじめに
この記事は、Docker初心者でPytorchをGPUを使って学習させたい方向けに作成しました。Dockerの仮想環境に詳しい方や、ローカル環境で学習させたい方、Macを利用している方は他の記事を参考にすることをおすすめします。

作者の構築前の実行環境は以下の通りになります。
>OS：Windows11
>エディタ：VSCode
>Docker Desktop for Windows
>GeForce RTX 3060 Ti





# Dockerとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/a61ca5bd-ed51-c488-7158-9a9211ca8396.png)

Dockerは、コンテナ仮想化プラットフォームであり、アプリケーションとその依存関係を独立したコンテナとしてパッケージ化し、異なる環境での実行を可能にするツールです。Dockerは以下のような特徴を持っています。

Dockerコンテナは、アプリケーションとその依存関係を一つのパッケージとして包み込むため、異なる環境での動作が一貫しています。開発環境からテスト環境、本番環境まで、アプリケーションのポータビリティが向上し、展開が簡略化されます。

また、Dockerは軽量なコンテナ仮想化を提供し、ホストOS上でコンテナを共有するため、システムリソースの最適な利用が可能です。コンテナは素早く起動し、メモリとCPUの効率的な割り当てができます。



# 1. wsl2の準備

公式のインストール方法はこちらになります。

https://learn.microsoft.com/ja-jp/windows/wsl/install

**Windows11**では、1つのコマンドを使用して、WSLを実行するために必要なすべてのものをインストールできるようになりました。 右クリックして **[管理者として実行]** を選択することで、`PowerShell`または`Windows`コマンド プロンプトを管理者モードで開き、`wsl --install`コマンドを入力し、マシンを再起動します。

```PowerShell:PowerShell
wsl --install
```
実行すると、同時に最新版のUbuntuもインストールされます（とても便利）。

::: note warn
**注意**
Ubuntuをインストールしただけでは起動させようとしてもエラーが発生してしまう。
:::

これに対応するため、**Windowsの設定** を変更する必要があります。

> **①「設定」をクリック**
> **②「アプリ」の「オプション機能」をクリック**
> **③「Windowsのその他の機能」をクリック**
> **④「Linux用Windowsサブシステム」にチェックを入れる**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/b9a47066-cd01-29d9-e036-357dbe92f529.png)

これで事前準備は完了です。

再度、`PowerShell`からUbuntuを起動すると、 **ユーザ名** と **パスワード** の入力を求められます。入力後、以下のコマンドを実行してください。

```PowerShell:PowerShell
wsl -l -v
```
無事、Ubuntuが確認出来たらUbuntuのインストールは完了です（ここではUbuntuさえ表示されていれば問題ありません）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/8c189351-60b2-3721-9a0f-d0768a884f92.png)

これでWSLの設定は完了です。

# 2. VSCodeのインストール
こちらからVSCodeをインストールできます。**Windows版** をインストールしてください。

https://code.visualstudio.com/download

インストールする過程で、環境変数を設定するチェックボックスがあります。こちらに **チェックを入れる** のを忘れないでください。それ以外の項目は **次へ** をクリックして構いません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/40203202-98c9-62fa-2d68-c9f5b581ac43.png)

これでVSCodeのインストールは完了です。

# 3. Gitのインストール

こちらからGitをインストールできます。こちらも **Windows版**をインストールしてください。

https://git-scm.com/


こちらも同様にインストールの過程で注意することがあります。Gitを使用するエディタの選択で、**"Use Visual Studio Code as Git's default editor"** を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/12879e1c-ff54-5123-27f1-97319a7d52d7.png)

これにより、VSCodeからGit Bashをわざわざ起動することなく、開発環境から直接バージョン管理が可能になります。

これでGitのインストールは完了です。

# 4. Docker Desktopのインストール
こちらからDocker Desktopがインストールできます。こちらも**Windows版を** インストールしてください。

https://www.docker.com/products/docker-desktop/

Docker Desktopのインストールの過程では特に注意することはありません。

ただし、インストール完了後に1つ注意することがあります。

> **①Docker Desktopを起動し、右上の設定（歯車マーク）をクリックする。**
> **②"Resources"の"WSL integration"をクリックする。**
> **③"Ubuntu"の項目を有効にする。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/c08d7861-89ae-2824-5b22-f7d3100bfa14.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/49d21421-bda1-1a90-abb1-99e61c090251.png)

これによりUbuntuからDockerを操作することができます。

これで、Docker Desktopのインストールは完了です。

# 5. NVIDIA Driver & CUDA Toolkitのインストール
PytorchをGPU環境で実行するには、主に二つの準備が必要です。
>**①NVIDIA Driver**
>**②CUDA Toolkit**

## NVIDIA Driver

まずは **NVIDIA Driver** のインストールから始めていきましょう。

インストールはこちらからできます。

https://www.nvidia.com/Download/index.aspx?lang=en-us

作者は `Windows11` で `GeForce RTX 3060Ti` のGPUを使用しているので以下のような設定になります。この設定は、自身の環境を調べて入力してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/cf76e271-9a38-2f03-5b39-c9635d9bbca4.png)

ダウンロード完了後、そのままインストールまで行って構いません。

これで、NVIDIA Driverのインストールは完了です。

## CUDA Toolkit

次は **CUDA Toolkit** のインストールから始めていきましょう。

インストールの手順は、こちらの **ガイド** から確認できます。

https://docs.nvidia.com/cuda/wsl-user-guide/index.html#cuda-support-for-wsl-2

他の方の記事を見ると、Windowsのターミナルから実行できるようですが、作者は **Ubuntu** から実行しました。

まずは、Ubuntuから以下のコマンドを実行します。

```Ubuntu:Ubuntu
sudo apt-key del 7fa2af80
```
これは古いGPG鍵を削除しているようです。これを行わないとインストールの過程で、エラーが発生する可能性があります。

次に、UbuntuにCUDA Toolkitをインストールしていきます。

ガイドを見ると、２つのインストール方法があるようですが、作者は`Option1`を選択しました。

::: note warn
**注意**
`Option2`の場合だと、インストールしたWidnowsのドライバを上書きしてしてしまう。
:::


> **Option 1**: 
>Installation of Linux x86 CUDA Toolkit using WSL-Ubuntu Package - Recommended
>The CUDA WSL-Ubuntu local installer does not contain the NVIDIA Linux GPU driver, so by following the steps on the CUDA download page for WSL-Ubuntu, you will be able to get just the CUDA toolkit installed on WSL.

>**Option 2**: 
>Installation of Linux x86 CUDA Toolkit using Meta Package
If you installed the toolkit using the WSL-Ubuntu package, please skip this section. Meta packages do not contain the driver, so by following the steps on the download page for Ubuntu, you will be able to get just the CUDA toolkit installed on WSL.
The installation instructions for the CUDA Toolkit can be found in the CUDA Toolkit download page for each installer. But DO NOT choose the “cuda”, “cuda-12-x”, or “cuda-drivers” meta-packages under WSL 2 as these packages will result in an attempt to install the Linux NVIDIA driver under WSL 2. Install the cuda-toolkit-12-x metapackage only.
You can also install other components of the toolkit by choosing the right meta-package.

CUDA Toolkitのインストールは、Ubuntuにコマンドを入力する必要があります。以下のサイトに移動し、実行環境（この記事の方法であれば、画像と同じ環境で問題無ありません）を入力後、表示されたコマンド群をUbuntuに入力します。

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=WSL-Ubuntu&target_version=2.0&target_type=deb_local

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/615284a2-71b5-b90a-ec92-ead1e307a7a6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/d2435865-f5d4-c73b-d5cc-1ce1f71c502e.png)


```Ubuntu:Ubuntu
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.0.0/local_installers/cuda-repo-wsl-ubuntu-12-0-local_12.0.0-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-12-0-local_12.0.0-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-12-0-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda
```
インストールには十数分ほど時間はかかります。

Ubuntuに以下のコマンドを実行してみましょう。

```Ubuntu:Ubuntu
cat  /usr/local/cuda/version.json
```

以下が表示されたらCUDA Toolkitのインストールは完了です。

```Ubuntu:Ubuntu
{
   "cuda" : {
      "name" : "CUDA SDK",
      "version" : "12.3.0"
   },
   "cuda_cccl" : {
      "name" : "CUDA C++ Core Compute Libraries",
      "version" : "12.3.52"
   },
   "cuda_cudart" : {
      "name" : "CUDA Runtime (cudart)",
      "version" : "12.3.52"
   },
   "cuda_cuobjdump" : {
      "name" : "cuobjdump",
      "version" : "12.3.52"
   },
   "cuda_cupti" : {
      "name" : "CUPTI",
      "version" : "12.3.52"
   },
   "cuda_cuxxfilt" : {
      "name" : "CUDA cu++ filt",
      "version" : "12.3.52"
   },
   "cuda_demo_suite" : {
      "name" : "CUDA Demo Suite",
      "version" : "12.3.52"
   },
   "cuda_gdb" : {
      "name" : "CUDA GDB",
      "version" : "12.3.52"
   },
   "cuda_nsight" : {
      "name" : "Nsight Eclipse Plugins",
      "version" : "12.3.52"
   },
   "cuda_nvcc" : {
      "name" : "CUDA NVCC",
      "version" : "12.3.52"
   },
   "cuda_nvdisasm" : {
      "name" : "CUDA nvdisasm",
      "version" : "12.3.52"
   },
   "cuda_nvml_dev" : {
      "name" : "CUDA NVML Headers",
      "version" : "12.3.52"
   },
   "cuda_nvprof" : {
      "name" : "CUDA nvprof",
      "version" : "12.3.52"
   },
   "cuda_nvprune" : {
      "name" : "CUDA nvprune",
      "version" : "12.3.52"
   },
   "cuda_nvrtc" : {
      "name" : "CUDA NVRTC",
      "version" : "12.3.52"
   },
   "cuda_nvtx" : {
      "name" : "CUDA NVTX",
      "version" : "12.3.52"
   },
   "cuda_nvvp" : {
      "name" : "CUDA NVVP",
      "version" : "12.3.52"
   },
   "cuda_opencl" : {
      "name" : "CUDA OpenCL",
      "version" : "12.3.52"
   },
   "cuda_sanitizer_api" : {
      "name" : "CUDA Compute Sanitizer API",
      "version" : "12.3.52"
   },
   "libcublas" : {
      "name" : "CUDA cuBLAS",
      "version" : "12.3.2.9"
   },
   "libcufft" : {
      "name" : "CUDA cuFFT",
      "version" : "11.0.11.19"
   },
   "libcufile" : {
      "name" : "GPUDirect Storage (cufile)",
      "version" : "1.8.0.34"
   },
   "libcurand" : {
      "name" : "CUDA cuRAND",
      "version" : "10.3.4.52"
   },
   "libcusolver" : {
      "name" : "CUDA cuSOLVER",
      "version" : "11.5.3.52"
   },
   "libcusparse" : {
      "name" : "CUDA cuSPARSE",
      "version" : "12.1.3.153"
   },
   "libnpp" : {
      "name" : "CUDA NPP",
      "version" : "12.2.2.32"
   },
   "libnvjitlink" : {
      "name" : "JIT Linker Library",
      "version" : "12.3.52"
   },
   "libnvjpeg" : {
      "name" : "CUDA nvJPEG",
      "version" : "12.2.3.32"
   },
   "nsight_compute" : {
      "name" : "Nsight Compute",
      "version" : "2023.3.0.12"
   },
   "nsight_systems" : {
      "name" : "Nsight Systems",
      "version" : "2023.3.3.42"
   },
   "nvidia_fs" : {
      "name" : "NVIDIA file-system",
      "version" : "2.18.3"
   }
}
```

# 6. コンテナの作成
Dockerの仮想環境を使用するには以下の手順を踏む必要があります。

>①dockerfileの作成。
>②dockerfileからdocker imageを作成。
>③docker imageからdocker container（コンテナ）を構築。

ここで、VScodeには以上の手順を簡略化する**Dev Containers**という拡張機能があります。これはVScode上で `Dockerfile` を作成し、 `devcontainer.json` を使用することで、Dockerコマンドをわざわざ使用することなくコンテナを構築することが出来ます。

メモリを消費する、VSCodeでしか開発できないというデメリットもありますが、VSCodeユーザにはとても便利なのでおすすめです。

説明は以下のサイトに記載されています。

https://code.visualstudio.com/docs/devcontainers/containers

Ubuntuから任意の開発を行いたいディレクトリで以下のコマンドを実行します。

```Ubuntu:Ubuntu
code .
```
これにより、現在のディレクトリでVSCodeを開くことが出来ます。

VSCodeの拡張機能から **Dev Containers** をインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/03ca9c7e-e6bf-b66e-f1d8-b495536944f8.png)

VSCodeを再起動すると、ディレクトリ内に`devcontainer.json`ファイルが作成されているはずです。

まずは、**dockerfile** の作成をしていきます。今回はPytorchがGPU環境で動くことを確認したいので最低限のパッケージやライブラリ、フレームワークをインストールします。

以下は実行した`dockerfile`です。
`requirements.txt`は同ディレクトリにあります。


```dockerfile:dockerfile
FROM  nvidia/cuda:12.2.2-devel-ubuntu22.04

RUN apt update \
    && apt install -y \
    git\
    python3\
    python3-pip

RUN apt-get autoremove -y && apt-get clean && \
    rm -rf /usr/local/src/*

COPY requirements.txt /tmp/

RUN pip install --no-cache-dir -r /tmp/requirements.txt

COPY . /tmp/
```
```text:requirements.txt
torch
torchvision
transformers
```

注意したいのが、ベースの`nvidia/cuda`です。 **Docker hub**からイメージを捜すことになるのですが、自身のUbuntuのバージョンと対応していないと、コンテナの構築の過程でエラーが発生します。

Ubuntuから以下のコマンドを実行して、Ubuntuのバージョンを確認してください。


```Ubuntu:Ubuntu
cat /etc/issue
Ubuntu 22.04.2 LTS \n \l　#自身のバージョンを確認
```

以下のリンクから、最適なイメージを探してください。

https://hub.docker.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/a610e1eb-b76f-dece-5580-be97b1f1b4eb.png)

次は`devcontainer.json`の設定です。

以下が実行した`devcontainer.json`です。これは`devcontainer.json`の初期フォーマットを流用しています。

```devcontainer.json:devcontainer.json
{
	"name": "Existing Dockerfile",
	"build": {
		"context": "..",

		"dockerfile": "../dockerfile"
	},
	"runArgs": ["--gpus", "all","--shm-size","8gb"],

		"customizations": {
		"vscode": {	
			"extensions": [
				"ms-python.python",
				"ms-toolsai.jupyter",
				"mhutchie.git-graph",
				"MS-CEINTL.vscode-language-pack-ja"
			]
		}
	}
}
```
重要なのは  **"runArgs"** と **"extensions"** です。

**"runArgs"** ではコンテナ立ち上げ時のオプションを設定することが出来ます。ここではGPUの設定を行っています。

> **--gpus all** : すべてのGPUを利用できるようにするため。
> **--shm-size 8gb** : コンテナ内の共有メモリ（Shared Memory）のサイズを8ギガバイトに設定。

**"extensions"** では、コンテナ内のVSCodeにインストールする拡張機能を設定することが出来ます。

> "ms-python.python" : Pythonの拡張機能
> "ms-toolsai.jupyter" : Jupyterの拡張機能
> "ms-toolsai.git-graph" : Git-graphの拡張機能。バージョン管理の可視化に便利。
> "MS-CEINTL.vscode-language-pack-ja" :日本語化の拡張機能。

追加で拡張機能をインストールしたい場合は、**"extensions"** に **拡張機能のID** を追記してください。

拡張機能のIDは、拡張機能の項目から **歯車のアイコン** をクリックし、**""拡張機能のIDをコピー""** をクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/8a1f0fe6-046b-1f90-1dde-d6a3cf908b93.png)

これで、準備は完了です。

それでは、`Ctrl + Shift + P`　またはVSCode左下の青いマークから **"Reopen in Container"（コンテナーで再度開く）**　をクリックしてください。コンテナの起動が開始されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/763eb5db-577d-24bf-83c9-c133b32bc387.png)

コンテナの起動が確認出来たら、`.py`ファイルを作成し、pytorhを使用してGPUが使用できるか確認してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/6c08535f-af4d-adbb-3284-2e23280070a0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/72dae557-fffe-6058-d1d4-ba2d54149464.png)

無事に、`Ture`が返されたらPytorchのGPU環境構築は完了です。

お疲れ様でした！

# 余談：Gitのバージョン管理
グループでの活動やプロジェクトの開発において、リモートリポジトリでバージョン管理を行うことはマストです。

この記事では、PytorchでGPUを使って学習させたモデルを管理、アプリに応用させたりするなどの目的で、仮想環境にて作成したファイルをVSCodeからGitで管理できるようにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/835ea255-20b4-cdf7-7bdd-34d7fe89c476.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523467/0345a916-5f91-2f86-48ab-111746264632.png)

# まとめ
ここまでお読みくださり、ありがとうございます。

今回はDocker初心者に向けたPytorchのGPU環境構築について説明しました。

私もDockerを学習して１週間も経っていないので、間違った解釈をしている点もあるかと思いますが何卒ご容赦ください。

この仮想環境を構築できれば、わざわざローカル環境を用意する必要なく、すぐにバージョン管理が可能なpytorchのGPU環境を用意できます。

この記事で皆様の、学習モデル開発へのハードルが少しでも下がれば幸いです。

# 参考文献
[Windows11にWSL２を使ってLinux環境(ubuntu) を構築してみた](https://zenn.dev/satoru_output/articles/daf5d4c85fa2a4)
[Visual Studio Code のインストール](https://pswork.jp/dotnet/visual-studio-code-install/)
[WSL2でCUDAをインストールする](https://qiita.com/cacaoMath/items/65d6a76b545eb662f581)
[]()