誰向けの記事?
-
- WSL2 + DockerをでJupterLabを用いたPythonの開発環境を作りたい。
-
- WSL2って何?Dockerって何?状態なのでそこら辺の入門をしたい。
- WSL2 + DockerからGPUを使った開発環境(PyTorch)を作りたい。
筆者自身が全てに当てはまっていたので、やったことのメモ的な側面もあります。
WSL2 + Dockerの環境を作る
INTEL VIRTUALIZATION TECHNOLOGYを有効化する
BIOSを立ち上げて、INTEL VIRTULIZATION TECHNOLOGYを有効化します。
これをサボったことにより後でエラーが出て調べる羽目になりました。必ず確認しておくと良いでしょう!
WSL2インストール
1. インストール
PowerShellで以下のコマンドを打つだけ。簡単。
wsl --install
「Windowsの機能の有効化または無効化」の設定が必要。自動で設定されるらしいという情報もあったが、結局手動で以下をチェックした。
-
- Linux用Windowsサブシステム(wsl2インストール前は無かった気がする)
-
- Windowsハイパーバイザープラットフォーム
- 仮想マシンプラットフォーム
2. 利用可能なディストリビューションの一覧の確認
wsl -l -o
ubuntu 20.04を使うことにする。。
3. Ubuntu20.04で環境構築
wsl --install -d Ubuntu-20.04
これでUbuntuのターミナルがスタートメニューに追加される。
Ubuntu(WSL)に入りたければ、スタートメニューから叩けば入れる。この時点でVirtual Boxより圧倒的に使いやすくて感動。
とりあえずでaptのアップデートをしておく@WSL2
sudo apt update
sudo apt upgrade
Docker Desktopのインストール
公式からインストーラー入手してインストール
ライセンスが気になる場合は「Docker Engine」をWSL2に入れる。なお、この先の手順には互換性があるはず。
開発用コンテナのイメージをビルドする
1. Dockerfileの作成
WSL2上の/home/user/Dockerfile/Python-BaseにDockerfileを作成する。(パスは好みでOK)
FROM python:3.9-slim-buster
RUN pip install --upgrade --no-cache-dir pip && \
pip install --upgrade --no-cache-dir \
jupyterlab
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--allow-root", "--LabApp.token=''"]
これは
-
- Docker Hub上にあるpython:3.9-slim-busterというイメージをベースにして
pip installで必要なモジュールをインストールして
jupyter labを立ち上げる
ということが書かれている。環境の構築手順が明示されているので、誰かに環境を渡すときに便利。
2. コンテナをビルドする。
cd /home/user/Dockerfile/Python-Base
docker image build --tag jupyter:test .
dockerコマンドの意味は以下
docker image build
イメージをビルドするよ--tag jupyter:test
イメージ名 jupyter
が名前, test
がバージョン名 だよ.
Dockerfileがあるディレクトリはここだよコンテナを起動し、ホストPCのブラウザからjupyterに接続する
以下に留意してコンテナを起動する。
-
- jupyterはwebサーバーが立ち上がるので、ホストPCからコンテナ上のwebサーバーにアクセスする必要がある。
- 開発したソースコードはホストPCとコンテナ双方から見える位置に置いておきたい。
1. WSL2上に開発したソースコードを入れるディレクトリを作成する。
/home/usr/test/srcとする。
ちなみに、WSL2上のディレクトリはWindows上の\\wsl$という場所に入っている。ネットワークドライブに割り当てておくと便利!
2. 以下のコマンドでコンテナを起動する。
docker container run \
--name jupyter \
--rm \
--detach \
--publish 18888:8888 \
--volume /home/usr/test/src:/mnt/host_src \
jupyter:test
docker container run
コンテナを起動するよ--name jupyter
コンテナの名前はjupyterだよ--rm
stopと同時にコンテナは消去されるよ。--detach
デタッチするよ(じゃないと、WSLのターミナルが固まる)
--publish 18888:8888
ホスト側の18888ポートとコンテナ側の8888ポートを接続するよ。(jupyterはデフォルトで8888ポートを使う)
--volume /home/usr/test/src:/mnt/host_src
ホスト側の/home/usr/test/src
をコンテナ側の
/mnt/host_src
にマウントするよjupyter:test
起動するイメージはjupyter:test
だよ3. ホストPC(Windows)のブラウザでアクセスする。
localhost:18888にアクセスすると、JupyterLabが開く。ディレクトリ構成をみるとコンテナの世界だということはわかるはず。
4. いったんコンテナを止める
docker container stop jupyter
別にこのままでも良いのですが、docker-composeを使ってお手軽に実行したいので。
イメージビルド~コンテナ起動をdocker-composeで簡略化する。
1. 以下のファイルを作る。Dockerfileと同じ場所でOK。
version: '3.8'
services:
jupyter:
container_name: jupyter
build:
context: .
ports:
- '18888:8888'
volumes:
- type: bind
source: /home/user/test/src
target: /mnt/host_src
version
公式サイトからDocker-Engineに対応したバージョンを書くservices
各サービスごとに定義していく。複数のコンテナを立ち上げることも可能jupyter
サービスの名前container_name
コンテナとしての名前build
ビルドの情報。context
はdocker image build
のときの最後の”.
“ports
ホスト側18888とコンテナ側8888を繋げるvolumes
ホスト側のsource
をコンテナ側のtarget
にマウント(bind
)する2. docker compose upする
docker-compose.ymlがある場所で以下のコマンドを打つだけ。
docker compose up
初回はdocker image build ⇒ docker container run相当の動きをします。次からはdocker container runから始まります。長いコマンドが簡単になって嬉しいです。
docker-composeは複数のコンテナをまとめてbuildしたりrunしたり出来るところがメリットです。実は必要なかったのですが、入門ということでやってみました。
コンテナを停止させるときはdocker-compose.ymlがある場所で
docker compose down
GPUを使った開発環境の構築
更にホストPC上のGPUリソースにDockerからアクセスできるようにカスタムをしていく。
PyTorch使う。
ホストPCはWin11
ドライバのインストール
nVIDEA DEVELOPPERからGPUにあったドライバーを選ぶ。SDインストール済みだと思ってもやっておきましょう。Download Typeは”SD”にしました。
インストール後、wslやDockerDesktop(DockerEngine)を再起動(起動していたら)
WSL2にCUDA Toolkit を入れる。
nVIDEA CUDA Toolkitを手順通りに進めていく。コマンドを写経すればOK。WSL2の環境は作成済みなので、”3. CUDA Support for WSL 2″からやれば良いはず。
動作確認コマンド。WSL上からGPUが認識されてればOKです。
/usr/local/cuda/bin/nvcc --version
Dockerfileにpytorchのpipを追加
PyTorch公式でpipのコマンドを教えてくれる。Windowsじゃなくて、Linux版のコマンドを参照して、Dockerfileを以下のように変更する。
FROM python:3.9-slim-buster
RUN pip install --upgrade --no-cache-dir pip && \
pip install --upgrade --no-cache-dir \
jupyterlab \
torch \
torchvision \
torchaudio
CMD ["jupyter", "lab", "--ip=0.0.0.0", "--allow-root", "--LabApp.token=''"]
docker-compose.ymlにgpuの割り当てを記載する
deploy以下が追記した部分。(サービス名やコンテナ名も変更してる)
version: '3.8'
services:
pytorch:
container_name: pytorch
build:
context: .
ports:
- '18888:8888'
volumes:
- type: bind
source: /home/user/test/src
target: /mnt/host_src
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
コンテナを立ち上げて動作確認する。
1. コンテナの立ち上げ(再掲)
docker compose up
2. コンテナのjupyterに接続する。(再掲)
ホストPC(Windows)のブラウザでlocalhost:18888にアクセス。
3. 適当なnotebookを作成して以下を実行
import torch
torch.cuda.is_avalilable()
True
これでDocker上でPyTorchをGPUで動かす準備ができた!
参考リンク
-
- 実践 Docker – ソフトウェアエンジニアの「Docker よくわからない」を終わりにする本
-
- Windowでデータ分析環境を構築する方法
-
- Windows11 + WSL2 + Docker DesktopでGPU環境を作る
-
- PyTorch公式
- nVIDEA CUDA Toolkit