7
8

More than 3 years have passed since last update.

Windows10 + WSL2 + DockerDesktop + docker-compose +GPU(Nvidia)+Jupyterlabの環境構築

Last updated at Posted at 2021-01-09

はじめに

本記事は私がタイトル通りの環境を構築するために行った事を記したレポートです。
使用する環境のWindows10、Docker Desktop、Docker-composeがプレビュー版となっているため安定しているかは不明です。
※Qiita初投稿のため作法がなっていなかったら申し訳ございません。
※Dockerも勉強期間1ヶ月程度の知識のため、誤っている内容が含まれておりましたら指摘頂けると幸いです。

Qiita内外の情報をかき集めてタイトルの環境を構築できたので、環境構築の手順を記載いたします。

※2021年1月10日現在の内容です。
 DockerDesktop、WSL2、GPU(nvidia)周りはアップデートが早いため注意が必要です。

※2021年1月20日追記
Docker-composeの1.28.0がリリースされました。
docker-compose.ymlは当記事のままでも問題なく動いております。
Githubリリースページ

※私が見つけられていないだけで既に同様の記事が存在していたら指摘頂けると幸いです。
 直ぐに記事を削除致します。

Qiitaが無ければ環境構築できていませんでした。
参考になる方が居たら幸いです。

構成

OS:Windows 10 Pro Insider Preview ビルド:21286.1000
CPU:Ryzen5900X
GPU:GeForce RTX 3070
WSL2:ubuntu 20.04LTS
DockerDesktop:テクニカルプレビュー版
Docker:version 20.10.0
Docker-compose:1.28.0

構築手順

1.Windows10 Insider Preview Buildのインストール
2.WSL2のインストール
3.Docker Desktopのプレビューバージョンのインストール
4.Nvidiaドライバのベータ版をインストール
5.NGCコンテナイメージをpull
6-1.コンテナを起動して必要なパッケージをインストール後、イメージを作成
6-2.Dockerfileを使って新たなイメージを作成
7.作成したイメージでGPUが有効か確認
8.docker-composeのymlファイルを作成、docker-composeでコンテナを立ち上げ

手順1:Windows10 Insider Preview Buildのインストール

Windowsの設定から更新とセキュリティ、Windows Insider Programを選択
「Devチャネル/ベータ/リリースプレビュー」の「Devチャネル」を選択
※Microsoft アカウントが必要です。
※インストールに時間がかかります。
インサイダービルド.png

手順2:WSL2のインストール

下記の記事を参考にWSL2のインストールを実施する。
※Windows10 proでも問題ないです。
※LinuxのディストリビューションはUbuntu-20.04LTSを選択
Windows 10 Home で WSL 2 + Docker を使う

Windows Power shellで以下のコマンドを実行した際に

PowerShell
wsl --set-default-version 2

WSL 2 を実行するには、カーネル コンポーネントの更新が必要です。詳細については https://aka.ms/wsl2kernel を参照してください

と表示された場合は下記の記事の「カーネル コンポーネントの更新」以降を参照する
WSL2導入|WinアップデートからWSL2を既定にするまでのスクショ

手順3:Docker Desktopのプレビューバージョンのインストール

GPUサポートした旨を記載したDocker公式ブログ

To get started with Docker Desktop with Nvidia GPU support on WSL 2, you will need to download our technical preview build from here.

hereからプレビューバージョンのDockerDesktopをインストールする
※インストール後にWSL2 backendを有効にするのを忘れないようにする

手順4:Nvidiaドライバのベータ版をインストール

以下のリンクから、NVIDIAドライバのベータ版をインストールします
https://developer.nvidia.com/cuda/wsl/download

gefo.png

NVIDIA Developer Program Membership Required

The file or page you have requested requires membership in the NVIDIA Developer Program. Please either log in or join the program to access this material. Learn more about the benefits of the NVIDIA Developer Program.

と表示されるためNVIDIA Developer Program Membershipに登録している方はログインしてドライバのダウンロード、インストールを行ってください。
※登録していない方は登録の上ダウンロード願います。

手順5:NGCコンテナイメージをpull

pullするイメージは何でも良いのですが、Nvidia提供のDockerイメージ(NGCコンテナ)があるためそちらをpullします。
フレームワークはTensorflow,Pytorchが選択できます。

以下のリンクから、TensorFlowを選び最新のDockerイメージのtagを探す
https://www.nvidia.com/ja-jp/gpu-cloud/containers/

NGC.png

NGCコンテナ.png

最新のイメージを以下のコマンドでpull
※少々時間がかかります。
※最新のイメージは変わると思いますので都度確認願います。

bash
#TensorFlow1の場合
$docker pull nvcr.io/nvidia/tensorflow:20.12-tf1-py3
#                                     ↑(20.12)←ここがver毎に変わると思います。
#TensorFlow2の場合
$docker pull nvcr.io/nvidia/tensorflow:20.12-tf2-py3

手順6-1:コンテナを起動して必要なパッケージをインストールした後に、Dockerイメージを作成(手順6-2のどちらかを実施)

TensorFlowとKerasはインストール済みですが
pandas、matplotlib、Seabornなどのパッケージがインストールされていないため
一度コンテナを立ち上げ必要なパッケージをインストールした後に、新たなイメージを作成します。
※Dockerfileでイメージを作成するのが一般的だと思いますがまだ出来ておらず...
2021/1/23:Dockerfileを用いたイメージ作成を追記(後述)

先ほどpullしたイメージのコンテナを、WSL2のターミナルで立ち上げた後に
必要なパッケージをインストールします。

bash
#WSL2のターミナルで以下コマンドを実施
$docker run -it nvcr.io/nvidia/tensorflow:20.12-tf2-py3 bash
bash
#-------コンテナ内--------------
================
== TensorFlow ==
================

NVIDIA Release 20.12-tf2 (build 18110405)
TensorFlow Version 2.3.1

Container image Copyright (c) 2020, NVIDIA CORPORATION.  All rights reserved.
Copyright 2017-2020 The TensorFlow Authors.  All rights reserved.

#~~~中略~~~~

root@9f1a8350d911:/workspace#pip install 必要なパッケージ(matplotlibとか)
#必要なパッケージがインストール出来たら一旦コンテナを停止
root@9f1a8350d911:/workspace#exit
bash
#-------ここからWSL2のターミナル--------------
#psコマンドでコンテナのIDを取得する
$docker ps -a
CONTAINER ID   IMAGE                                     COMMAND                  CREATED         STATUS                     PORTS     NAMES
5dc0ae8981bf   nvcr.io/nvidia/tensorflow:20.12-tf2-py3   "/usr/local/bin/nvid…"   3 minutes ago   Exited (0) 3 seconds ago             confident_noether

#コンテナIDが確認出来たらcommitコマンドでイメージを作成
#イメージの名前はDockerhub等にpushする場合は、リポジストリと名前を合わせる必要があります。ローカルで使うだけであれば好きな名前で問題ないです)
$docker commit 5dc0ae8981bf hogehoge:latast 
#問題なくイメージを作成できれば以下のような画面が出力されます。
sha256:8461579f0c2adf2a052b2b30625df0f48d81d3ab523635eb97b360f03096b4

#docker imagesコマンドでイメージを確認
#問題なければ以下のような出力
$docker images
REPOSITORY                  TAG             IMAGE ID       CREATED        SIZE
hogehoge                    latest          9d3ea0900f00   29 hours ago   13.4GB
nvcr.io/nvidia/tensorflow   20.12-tf2-py3   21d1065bfe8f   5 weeks ago    12.2GB

手順6-2:Dockerfileでのイメージ作成(手順6-1のどちらかを実施)

以下のようなDockerfileを作成してイメージを作成

#↓ベースイメージを記載(今回はNGCコンテナのイメージ名)
#ベースイメージが無かったらpullしてくれます
FROM nvcr.io/nvidia/tensorflow:20.12-tf2-py3 
#↓aptをアップデートしてから必要なパッケージをインストールするRUNを追記
RUN apt update && apt upgrade -y \ 
    && yes | pip install -U pip \
    matplotlib \ 
    pandas \
    scikit-learn \
    seaborn
#コンテナ起動時のデフォルトのコマンドを追記
CMD ["/bin/bash"]

Dockerfileがあるフォルダに移動して以下コマンドでイメージを作成

bash
#WSL2のターミナルで以下コマンドを実施
docker build -t <イメージの名前>:<tagの名前> <directory>
#例
docker build -t hogehoge:latest . #←カレントディレクトリを表す「.」

手順7:作成したイメージでコンテナを作成してGPUが有効か確認

※GPUを有効にする場合はdocker runコマンドのオプションに「--gpus all」が必要です。

bash
#WSL2のターミナルで以下コマンドを実施
#--rmはコンテナ停止時に自動で削除するオプションです。
docker run -it --rm --gpus all -p 8888:8888 hogehoge:latest jupyter lab


#---ここからコンテナ内---
================
== TensorFlow ==
================

NVIDIA Release 20.12-tf2 (build 18110405)
TensorFlow Version 2.3.1

#~~~中略~~~
 To access the notebook, open this file in a browser:
        file:///root/.local/share/jupyter/runtime/nbserver-1-open.html
    Or copy and paste one of these URLs:
        http://hostname:8888/?token=[トークン]
     or http://127.0.0.1:8888/?token=[トークン]

#終了する場合はWSLのターミナル上でCtrl+Cを実行

上記のように出力されるためWebブラウザ(私はChrome)でhttp://127.0.0.1:8888/?token=[トークン]にアクセス
Jupyterlabに接続できるので、新しいノートブックで以下のコードを実行
device_type: "GPU"が表示されていればGPUが有効

from tensorflow.python.client import device_lib
device_lib.list_local_devices()

#GPUが有効であれば以下のように出力
[name: "/device:CPU:0"
 device_type: "CPU"
 memory_limit: 268435456
 locality {
 }
 incarnation: 16078152362305136132,
 name: "/device:XLA_CPU:0"
 device_type: "XLA_CPU"
 memory_limit: 17179869184
 locality {
 }
 incarnation: 6904616874393552950
 physical_device_desc: "device: XLA_CPU device",
 name: "/device:XLA_GPU:0"
 device_type: "XLA_GPU"
 memory_limit: 17179869184
 locality {
 }
 incarnation: 13161252575635162092
 physical_device_desc: "device: XLA_GPU device",
 name: "/device:GPU:0"
 device_type: "GPU"
 memory_limit: 5742592000
 locality {
   bus_id: 1
   links {
   }
 }
 incarnation: 2330595400288827072
 physical_device_desc: "device: 0, name: GeForce RTX 3070, pci bus id: 0000:2b:00.0, compute capability: 8.6"]

#--gpuをオプションにつけていない場合や、どこかでうまくいっておらずgpuを認識できていない場合は以下のような出力になる
[name: "/device:CPU:0"
 device_type: "CPU"
 memory_limit: 268435456
 locality {
 }
 incarnation: 68886281224950509,
 name: "/device:XLA_CPU:0"
 device_type: "XLA_CPU"
 memory_limit: 17179869184
 locality {
 }
 incarnation: 13575954317913527773
 physical_device_desc: "device: XLA_CPU device"]

手順8:docker-composeの利用

docker runコマンドでコンテナを作成するのであれば手順7まで問題ないですが
毎回長いコマンドを打つのが大変なのでdocker-composeを利用したいと思います。

docker-composeの安定版は--gpus allがサポートされていないため
runtime:"nvidia"を利用する方法となっております。
※私はこの方法では、うまくいきませんでした...

参照記事:
docker-composeでgpuを使う方法
docker-compose内でGPUを走らせる(2020年2月2日時点)
githubのissue
githubのissue

途方に暮れていた所、docker-copmoseのプレビュー版でGPUをサポートしたとのことですのでそちらのやり方で行きます。
Githubのリリースページ
↑はverが1.28.0-rc1ですが、一番新しいプレビュー版が1.28.0-rc2のためそちらをインストールします。

※2021/1/20追記※
正式版(1.28.0)がリリースされました。
リリースページ

docker-composeのアップデート方法
docker-composeの公式を参照

bash
#WSLのターミナルで以下を実施
$sudo curl -L "https://github.com/docker/compose/releases/download/1.28.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

#ダウンロード出来たら以下を実施
$sudo chmod +x /usr/local/bin/docker-compose

#docker-composeのverを確認
$docker-compose -version
#問題なければ以下が出力
docker-compose version 1.28.0-rc2, build f1e3c356

プレビュー版をインストール出来たらdocker-compose.ymlを作成します。
参照:Github Enable GPU access with DeviceRequests
※deploy:のコメントの意味が分かっていません。

docker-compose.yml
version: '3.7'
services:
  jupyterlab:
    image: hogehoge:latest #自分が作成したイメージ名を記載
    deploy:
      resources:
        reservations:
          devices:
          - 'driver': 'nvidia'
            'capabilities': ['gpu']
    container_name: jupyterlab
    ports:
      - '8888:8888'
    #↓ホストとコンテナのボリュームをマウントします ホストのボリューム:コンテナのボリュームの表記
    #./がカレントディレクトリのためWSL2のターミナルでdocker-compose.ymlが置いてあるディレクトリに移動してから使う
  volumes:
      - './ds_python:/workspace' #フォルダ名は適当に変える
    command: jupyter lab
    tty: true
    stdin_open: true

docker-compose.ymlが作成出来たら
以下のディレクトリ構成にする

└── ./適当なフォルダ
    ├──── docker-compose.yml(適当なフォルダの直下)
        └── ds_python(ds_pythonの下にコンテナに持っていきたいファイルを格納する)
          ├── ~~~~.py 
          ├── ~~~~.ipynb 

ディレクトリが構成出来たら、WSLのターミナルで以下を実施
※WSL2でWindows側のディレクトリを表現するにはmnt/c/users~のように記載します。(例はCドライブ)

bash
#WSLのターミナルで以下を実施
#docker-compose.ymlのあるディレクトリに移動
$cd /mnt/c/~

#ディレクトリを移動できたらdocker-composeでコンテナ起動 -dはバックグラウンドで実施
$docker-compose up -d
#問題なければ以下が出力
Creating network "docker_default" with the default driver
Creating jupyterlab ... done

#jupyter labのアドレスがわからないので以下で確認
$ docker logs jupyterlab
#docker runコマンドの時と同様の内容が出力されるので
#Webブラウザ(私はChrome)でhttp://127.0.0.1:8888/?token=[トークン]にアクセス

#コンテナを削除したい場合は、docker-compose downで終了
$docker-compose down

Jupyterlabにアクセス後、docker-runコマンドと同様の手順でGPUデバイスが表示されていれば完了です。

おわりに

・いろいろ調べたけど、アップデートが早い分野のため構築手順がすぐに陳腐化しそう。

参照記事

手順1,3,4の参照記事
WSL2 + Docker Desktop + GPU で快適開発生活
https://www.docker.com/blog/wsl-2-gpu-support-is-here/

手順2の参照記事
Windows 10 Home で WSL 2 + Docker を使う
WSL2導入|WinアップデートからWSL2を既定にするまでのスクショ

手順5の参照記事
NGC(nVIDIA GPU Cloud)を試してみた!(Qiita外)

手順6の参照記事
Dockerコマンド よく使うやつ
Dockerコンテナの作成、起動〜停止まで
Dockerの作業済みコンテナからイメージを作って移植を楽にする
Dockerfileを書いてみる

手順7の参照記事
【Docker】3分でjupyterLab(python)環境を作る!
Dockerを使って5分でJupyter環境を構築する
TensorFlowからGPUが認識できているかを2行コードで確認する(Qiita外)

手順8の参照記事
docker-composeでgpuを使う方法
docker-compose内でGPUを走らせる(2020年2月2日時点)
docker-composeの公式
jupyterをdocker-composeで起動1
docker-compose.ymlの書き方について解説してみた
複数のDockerコンテナを自動で立ち上げる構成管理ツール「Docker Compose」(Dockerの最新機能を使ってみよう:第7回)

7
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
7
8