🐳

Windows11+Docker+VSCodeでGPUを利用する

2022/01/02に公開

2022年、新年あけましておめでとうございます!
本年もマイペースに記事を書いていければと思っています。

はじめに

前回の記事
https://zenn.dev/opamp/articles/c5e200c6b75912
でWindowsにCUDAとPyTorchを導入したのですが、YOLOXを利用しようとしたところWindows特有のバグに引っかかってしまい、泣く泣くDockerに戻ってきました・・・。

ただ、Dockerを立ち上げて、Jupyter Notebookにアクセスし、コーディングするのは面倒だと思ったので、VSCodeのRemoteContainers機能を利用して実行できるようにしました。

作業に移る前に・・・

WindowsでDocker+GPUを利用する際は
https://zenn.dev/mosamosa/articles/b187cb5380be87
の記事を参考にして実装しました。mosamosaさんありがとうございます!!
なにか手順に詰まった際は、本記事と上記記事を参考にしてもらえると!

VSCodeの準備

VSCodeは
https://azure.microsoft.com/ja-jp/products/visual-studio-code/
からダウンロード&インストールします。

VSCodeを起動すると以下のような画面が表示されると思います。(著者はテーマをハイコントラストにしてます)

起動後、赤枠部分をクリックし、表示された検索バーにremoteと入力&Enter。
その中にあるRemote-Containersをクリックし、インストール!

さらに検索バーにjapaneseと入力し、そちらもインストール。

右下のポップアップで再起動を促されるのでVSCodeを再起動します。

これでVSCodeの設定は完了!おつかれさまでしたー!

Dockerの準備

続いてDockerの準備に移ります!
Dockerは次のサイトからWindows版のDocker Desktopをダウンロード&インストール!
https://www.docker.com/get-started
指示に従ってインストールしていきましょう!

WSL2でCUDAが使えるドライバのインストール

WSL2でCUDAを利用するには専用のドライバを準備する必要があります。
https://developer.nvidia.com/cuda/wsl/download
からダウンロード&インストールしましょう!

WSL2の準備

以下のコマンド

wsl --install -d Ubuntu-20.04

で準備完了です!

いざ、環境準備

まずはDockerfileを作成していきます。
mosamosaさんのDockerfileを参考に改造してみました(筆者はPyTorchをよく利用するためPyTorchのみインストールしています。ほかのフレームワークを利用する際はそれらをrequirements.txtに記載してください)

Dockerfile
FROM  nvidia/cuda:11.4.0-cudnn8-devel-ubuntu20.04
ENV NOTO_DIR /usr/share/fonts/opentype/notosans

RUN apt update \
    && apt install -y \
    wget \
    bzip2 \
    # ca-certificates \
    # libglib2.0-0 \
    # libxext6 \
    # libsm6 \
    # libxrender1 \
    git \
    # mercurial \
    # subversion \
    # zsh \
    # openssh-server \
    # gcc \
    # g++ \
    # libatlas-base-dev \
    # libboost-dev \
    # libboost-system-dev \
    # libboost-filesystem-dev \
    curl \
    # make \
    unzip \
    # ffmpeg \
    file \
    xz-utils \
    sudo \
    python3 \
    python3-pip

RUN mkdir -p ${NOTO_DIR} &&\
  wget -q https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip -O noto.zip &&\
  unzip ./noto.zip -d ${NOTO_DIR}/ &&\
  chmod a+r ${NOTO_DIR}/NotoSans* &&\
  rm ./noto.zip

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

COPY requirements.txt /tmp/

RUN pip install --no-cache-dir -U pip setuptools wheel \
    && pip install --no-cache-dir -r /tmp/requirements.txt
requirements.txt
torch
torchvision
pillow
matplotlib

これらを保存すると

になっているかと思います。

これをVSCodeのRemoteContainersで開きます。

左下のマークをクリックし、Reopen in Containerをクリック。

これをクリックするとコンテナの設定ファイルはどこから読み出しますか?と出力されるのでFrom Dockerfileを選択します。

選択するとビルドが開始されます。ちょっと長いのでしばしの辛抱です。

が左下に表示されれば準備オッケーです!

GPUを利用できるように変更

まずGPUがまだ使えていないことを確認します。しなくてもいいのでは?

import torch
torch.cuda.is_available()

#False

やっぱり動いていませんね。

GPUを使ってDockerを起動する際は、一般的に

 #mosamosaさんから
 docker run --rm -it -p 8888:8888 --gpus all --mount source=mlws,target=/mlws -t  ml_base:latest

のように記述します。この--gpus allを指定することでDockerにGPUを割り当てることができるようになります。

VSCodeのコンテナではdevcontainer.jsonでそれらを設定することができます。
.devcontainerフォルダからdevcontainer.jsonを開き、次の一文を追記します。

.devcontainer/devcontainer.json
"runArgs": ["--gpus", "all","--shm-size","8gb"]

後半の--shm-sizeはDockerの/dev/shmに割り当てられるRAMメモリサイズを変更しています(デフォルトで64MB。デフォルトで学習を行うと、PyTorchのDataLoaderからメモリが足りないと怒られました)
追記できたら、再度左下をクリック、Rebuild containerをクリックし、再度コンテナをビルドします。

GPUが利用できるようになったか確認

最後に利用できるようになったか確認します。

import torch
torch.cuda.is_available()

#True

おお!ちゃんと使えるようになってる!これでブラウザから開発しないで済む・・・

まとめ

今回はWindows11+Docker+VSCodeでRemote Containerを駆使してGPUを利用できるようにしました!
皆さんの開発の一助になれれば幸いです。

次くらいはYOLOXの学習実装記事を書きたいな・・・(遠い目)

Discussion