LoginSignup
4
8

More than 1 year has passed since last update.

WSL2 + Dockerに入門してJupterLabの開発環境を作る

Last updated at Posted at 2022-11-12

誰向けの記事?

  • WSL2 + DockerをでJupterLabを用いたPythonの開発環境を作りたい。
  • WSL2って何?Dockerって何?状態なのでそこら辺の入門をしたい。
  • WSL2 + DockerからGPUを使った開発環境(PyTorch)を作りたい。

筆者自身が全てに当てはまっていたので、やったことのメモ的な側面もあります。

WSL2 + Dockerの環境を作る

INTEL VIRTUALIZATION TECHNOLOGYを有効化する

BIOSを立ち上げて、INTEL VIRTULIZATION TECHNOLOGYを有効化します。
これをサボったことにより後でエラーが出て調べる羽目になりました。必ず確認しておくと良いでしょう!

WSL2インストール

1. インストール

 PowerShellで以下のコマンドを打つだけ。簡単。

PowerShell
wsl --install

Windowsの機能の有効化または無効化」の設定が必要。自動で設定されるらしいという情報もあったが、結局手動で以下をチェックした。

  • Linux用Windowsサブシステム(wsl2インストール前は無かった気がする)
  • Windowsハイパーバイザープラットフォーム
  • 仮想マシンプラットフォーム

2. 利用可能なディストリビューションの一覧の確認

PowerShell
wsl -l -o

 ubuntu 20.04を使うことにする。。

3. Ubuntu20.04で環境構築

PowerShell
wsl --install -d Ubuntu-20.04

 これでUbuntuのターミナルがスタートメニューに追加される。
Ubuntu(WSL)に入りたければ、スタートメニューから叩けば入れる。この時点でVirtual Boxより圧倒的に使いやすくて感動。

 とりあえずでaptのアップデートをしておく@WSL2

WSL
sudo apt update
sudo apt upgrade

Docker Desktopのインストール

公式からインストーラー入手してインストール

ライセンスが気になる場合は「Docker Engine」をWSL2に入れる。なお、この先の手順には互換性があるはず。

開発用コンテナのイメージをビルドする

1. Dockerfileの作成

 WSL2上の/home/user/Dockerfile/Python-BaseDockerfileを作成する。(パスは好みでOK)

Dockerfile
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. コンテナをビルドする。

WSL
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. 以下のコマンドでコンテナを起動する。

WSL
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. いったんコンテナを止める

WSL
docker container stop jupyter

 別にこのままでも良いのですが、docker-composeを使ってお手軽に実行したいので。

イメージビルド~コンテナ起動をdocker-composeで簡略化する。

1. 以下のファイルを作る。Dockerfileと同じ場所でOK。

docker-compose.yml
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 ビルドの情報。contextdocker image buildのときの最後の"."
ports ホスト側18888とコンテナ側8888を繋げる
volumes ホスト側のsourceをコンテナ側のtargetにマウント(bind)する

2. docker compose upする

docker-compose.ymlがある場所で以下のコマンドを打つだけ。

WSL
docker compose up

 初回はdocker image build ⇒ docker container run相当の動きをします。次からはdocker container runから始まります。長いコマンドが簡単になって嬉しいです。
 docker-composeは複数のコンテナをまとめてbuildしたりrunしたり出来るところがメリットです。実は必要なかったのですが、入門ということでやってみました。

 コンテナを停止させるときはdocker-compose.ymlがある場所で

WSL
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です。

WSL
/usr/local/cuda/bin/nvcc --version

Dockerfileにpytorchのpipを追加

PyTorch公式でpipのコマンドを教えてくれる。Windowsじゃなくて、Linux版のコマンドを参照して、Dockerfileを以下のように変更する。

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以下が追記した部分。(サービス名やコンテナ名も変更してる)

docker-compose.yml
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. コンテナの立ち上げ(再掲)

WSL
docker compose up

2. コンテナのjupyterに接続する。(再掲)

ホストPC(Windows)のブラウザでlocalhost:18888にアクセス。

3. 適当なnotebookを作成して以下を実行

test.ipynb
import torch
torch.cuda.is_avalilable()

True

これでDocker上でPyTorchをGPUで動かす準備ができた!

参考リンク

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8