【環境構築】WSLとDockerを使った機械学習用環境構築の仕方

# はじめに
はじめまして、声質変換の研究をしていた@tkmo0807です。機械学習の環境構築は本当に大変ですよね。私も、利用したいモデルの環境構築に多くの時間を費やし、メインの研究が疎かになってしまった経験があります。
この記事は、私と同じように環境構築で苦戦している方々のために、私の環境構築方法をまとめたものです。卒業研究中などで環境構築に悩んでいる方は、ぜひご覧ください。

## 注意
この記事では、DockerとNVIDIA Container Toolkitがインストール済みの環境でコンテナを作成する手順に焦点を当てています。WSL2のインストール、WSL2へのDockerのインストール、およびNVIDIA Container Toolkitのインストール方法については、今回は取り上げませんのでご注意ください。


## Dockerを使うメリット
Dockerを使って機械学習の環境を構築するメリットはいくつかあります。

1. 利用するGPUに合わせて簡単に環境構築ができる
NVIDIAがDocker対応のImageを公開しているため、簡単に環境を作成できます。
2. 複数の環境を単一のパソコンで運用できる
コンテナを使えば、複数の環境を一つのパソコン内に構築できます。これは、モデルの違いや環境の違いを調べたいときに便利です。
3. Dockerをインストールすることで環境を汚さずにすむ
仮想環境を使った開発を行うため、元の環境を汚すことはありません。

Dockerを利用すれば、面倒なCUDAのインストールやパス設定をすべて省略できるので、非常に便利です。面倒な作業はツールを使って時短しましょう。


## 今回利用する環境
 - OS：Windows11
 - GPU：NVIDIA製 (Ada Lovelace)
 - メモリ：32GB
 - ストレージ：500GB
 - GPUドライバ：560.70
 - Docker Desktop：4.18.0



## Imageの選択
本来、Linux上でGPUを使うにはNVIDIAドライバ、CUDA、cudnnの三つが必要です。WSL2とDockerを使う場合、NVIDIAドライバはWindowsのアプリケーション「GeForce Experience」からインストールできます。残る二つのCUDAとcudnnは、NVIDIAが公開しているImageファイルを使用してコンテナを作成することで実現できます。

次に、Imageファイルの選択方法について説明します。NVIDIAはCUDAとcudnnが組み込まれたImageファイルを公開しています。これらのImageファイルは、以下のサイトから取得できます。

https://hub.docker.com/r/nvidia/cuda/tags

上記のサイトから、自分の環境に合ったImageファイルを取得します。どの環境が使えるかはNVIDIAドライバのバージョンによって変わります。NVIDIAドライバとCUDAの対応関係は、以下のサイトから確認できます。

https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html



https://docs.nvidia.com/deeplearning/cudnn/latest/reference/support-matrix.html

今挙げた二つのサイトはCUDAに対し、対応するGPUドライバのverを示してくれます。私の環境ではGPUがNVIDIA Ada Lovelace architecture、NVIDIAドライバが560.70なのでCUDA11.0～12.6まで利用可能です。今回はCUDA12.1を利用します。利用するImageファイルが決まったらWSL2上で下記のコマンドを実行します。
 実行する際は最初に挙げたdockerのページから利用したい環境のコマンドを選らんでください。


```docker:WSL2
 docker pull nvidia/cuda:12.1.1-cudnn8-devel-ubuntu20.04
```


## コンテナを建てる
必要なImageをダウンロードしたら、コンテナを作成します。今回はコンテナ内でJupyter Labを利用できるようにしたいので、以下のコマンドを実行して、コンテナ内でGPUとJupyter Labを使えるようにします。


```docker:WSL2
  docker run -it -d --gpus all --name anaconda --shm-size 24g -p 8889:8888 -e JUPYTER_ENABLE_LAB=yes nvidia/cuda:12.1.1-cudnn8-devel-ubuntu20.04
```

`docker run`はコンテナを作成するためのコマンドになります。このコマンドに対しオプションをつけることで、GPUやjuputer labを使えるようにします。ここでは重要なオプションだけを説明します。

+ `--name anaconda`はコンテナに名前を付けるオプションです。この場合`anaconda`が名前になります。

+ `--gpus all`はコンテナ内でGPUを使えるようにするオプションです。

+ `--shm-size 24g`はコンテナが使用できる共有メモリのサイズを指定するオプションです。この場合、コンテナは24GBの共有メモリを使用します。

+ `-p 8889:8888`はホストとコンテナのネットワークポートをマッピングするオプションです。コンテナ内でJupyter Labがポート8888で起動した場合、ホストのブラウザからはポート8889でアクセスできます。


+ `-e JUPYTER_ENABLE_LAB=yes`はコンテナの環境変数を設定するコマンドです。この場合コンテナ内でjuputer labが有効化されます。

## コンテナ内で学習環境の準備
コンテナを作成できたら、次はコンテナ内で初期設定を行います。コンテナに入るコマンドは次の通りです。

```docker:WSL2
docker exec -it anaconda bash
```

上記のコマンドを実行してコンテナに入れたら、以下のコマンドを順番に実行していきます。コンテナを立ち上げたばかりの状態では何もインストールされていないため、必要なファイルをダウンロードしていきます。

```:コンテナ内
apt update 
apt upgrade 
apt install git zip unzip python3 pip
pip install jupyter lab 
jupyter lab 
```

ここまで完了したら、環境構築は終了です。あとは動かしたいモデルをコンテナにダウンロードして実行してみてください。
お疲れ様でした。



## (column) 便利なアプリケーション
ここではDockerを使った学習に便利なアプリケーションを紹介します。

https://azure.microsoft.com/ja-jp/products/visual-studio-code


おなじみのVisual Studio Codeです。Visual Studio Codeでは様々な拡張機能がサポートされています。その中にはDockerの拡張機能もあります。この拡張機能を使えば、コンテナ内のファイルをVisual Studio Code経由でホストにダウンロードしたり、編集することができます。ログを確認したいときにも便利なので、ぜひインストールしてみてください。