Windows11+Docker+VSCodeでGPUを利用する
2022年、新年あけましておめでとうございます!
本年もマイペースに記事を書いていければと思っています。
はじめに
前回の記事
でWindowsにCUDAとPyTorchを導入したのですが、YOLOXを利用しようとしたところWindows特有のバグに引っかかってしまい、泣く泣くDockerに戻ってきました・・・。ただ、Dockerを立ち上げて、Jupyter Notebookにアクセスし、コーディングするのは面倒だと思ったので、VSCodeのRemoteContainers機能を利用して実行できるようにしました。
作業に移る前に・・・
WindowsでDocker+GPUを利用する際は
なにか手順に詰まった際は、本記事と上記記事を参考にしてもらえると!
VSCodeの準備
VSCodeは
からダウンロード&インストールします。VSCodeを起動すると以下のような画面が表示されると思います。(著者はテーマをハイコントラストにしてます)
起動後、赤枠部分をクリックし、表示された検索バーにremote
と入力&Enter。
その中にあるRemote-Containers
をクリックし、インストール!
さらに検索バーにjapanese
と入力し、そちらもインストール。
右下のポップアップで再起動を促されるのでVSCodeを再起動します。
これでVSCodeの設定は完了!おつかれさまでしたー!
Dockerの準備
続いてDockerの準備に移ります!
Dockerは次のサイトからWindows版のDocker Desktopをダウンロード&インストール!
指示に従ってインストールしていきましょう!
WSL2でCUDAが使えるドライバのインストール
WSL2でCUDAを利用するには専用のドライバを準備する必要があります。
からダウンロード&インストールしましょう!WSL2の準備
以下のコマンド
wsl --install -d Ubuntu-20.04
で準備完了です!
いざ、環境準備
まずはDockerfileを作成していきます。
mosamosaさんのDockerfileを参考に改造してみました(筆者はPyTorchをよく利用するためPyTorchのみインストールしています。ほかのフレームワークを利用する際はそれらをrequirements.txt
に記載してください)
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
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
を開き、次の一文を追記します。
"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