DockerでDeepLabCutの環境構築【GPU対応】

DeepLabCut with Docker機械学習

動画から重要なオブジェクトを追跡するツールである「DeepLabCut」は、生物分野を中心に広く利用されています。
しかし、DeepLabCutはLinuxにしか対応しておらず、WindowsやMacでは使用することができません。

そこで今回の記事では、どんなOSでもDeepLabCutが利用できるように、Dockerを利用したDeepLabCutの環境構築方法について解説します。

全体の方針

まずは、今回の方針について解説します。

DeepLabCutは基本的にGUIツールであり、教師データを利用する際には、GUI機能は不可欠です。
しかし、Dockerは基本的には、GUI的なインタラクションは想定されていません。

そのため、noVNCを利用します。
VNCとは、Virtual Network Computingの略で、GUIデスクトップをネットワーク経由で利用するシステムです。
noVNCは、そんなVNCソフトウェアの一つで、動作も早く、どんなデバイス(スマホなども含め)からでもアクセスすることができます。

今回は、noVNC上でDeepLabCutを動かして、GUIツールを操作できるようにします。

全体の構成を以下の図に示します。
Dockerコンテナ内に、noVNCとDeepLabCutをインストールし、ブラウザ上のデスクトップ環境でDeepLabCutを操作します。

Dockerのインストール

それぞれのOSに合わせて、Dockerをインストールします。
下記のリンクに詳しいインストール方法が載っています。

Dockerfileを利用して、コンテナイメージを作成

Dockerfileを用いて、コンテナのイメージを作成します。
Dockerfileを利用することで、より簡単にコンテナ環境を管理できます。

今回、もとになるイメージとして、以下のものを用いました。
UbuntuベースでnoVNCが、簡単に利用できます。
私が確認した中で、最も使いやすかったです。

Docker Hub

Dockerfile(拡張子なし)というファイルを作成し、以下の内容をコピペしましょう。


FROM dorowu/ubuntu-desktop-lxde-vnc:latest

RUN apt-get update && apt-get upgrade -y

# python 3.7
RUN apt-get install -y python3.7
RUN rm /usr/bin/python3
RUN ln -s /usr/bin/python3.7 /usr/bin/python3

RUN apt-get install -y python3-pip
RUN python3 -m pip install --upgrade pip

# DeepLabCut 2.2
RUN apt-get install -y \
    libwebkitgtk-3.0-dev \
    libgtk-3-dev \
    libsm-dev \
    freeglut3 \
    freeglut3-dev \
    libnotify-dev \
    libgstreamer1.0-dev \
    libgstreamer-plugins-base1.0-dev \
    dpkg-dev \
    build-essential \
    libjpeg-dev \
    libtiff-dev \
    libsdl1.2-dev \
    software-properties-common
RUN pip3 install https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-18.04/wxPython-4.0.7.post2-cp37-cp37m-linux_x86_64.whl
RUN pip3 install 'deeplabcut[gui]'
RUN pip3 install ipywidgets
RUN pip3 install seaborn

# language settings
RUN apt-get install -y locales
RUN locale-gen "en_US.UTF-8"
RUN locale-gen "en_GB.UTF-8"

# CUDA
COPY --from=nvidia/cuda:11.0.3-cudnn8-devel-ubuntu18.04 /usr/local/cuda-11.0/ /usr/local/cuda-11.0
RUN ln -s /usr/local/cuda-11.0 /usr/local/cuda
ENV PATH /usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/cuda/lib:/usr/local/cuda/lib64
ENV LIBRARY_PATH /usr/local/cuda/lib64/stubs:${LIBRARY_PATH}
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES all
ENV NVIDIA_REQUIRE_CUDA "cuda>=11.0"

#CUDA以下の内容は、nvidia-dockerを用いて、Dockerコンテナ上でGPUを利用したい人は追加しましょう。
CPUだけで動かす人は、あるとエラーが発生するので、削除してください。

あとはこのDockerfileをビルドするだけです。
Dockerfileのあるフォルダ内で、以下のコマンドを実行します。
novnc_deeplabcutの部分は、イメージの名前なので、ご自由に変更してください。

$ docker build -t novnc_deeplabcut .

しばらく待つと、ビルド作業が終了します。

DeepLabCutの起動

ご自身のプログラムやデータがおいてあるディレクトリに移動し、Dockerコンテナを起動するために、以下のコマンドを実行します。

$ cd project_directory
$ docker run -it --rm \
    --gpus 0 \      # GPUを使用しない場合は必要ありません
    -v "$(pwd)":/root/workdir \   #現在のディレクトリをコンテナと共有
    -p 2351:8888 \
    -p 6080:80 \
    novnc_deeplabcut \      # 前章で作成したイメージ名を指定
    /bin/bash

以下のように起動が完了したら、http://localhost:6080 にアクセスします。
上記のコマンドで、localhostに6080ポートを通じて、noVNCが使えるようになっています。

アクセスすると、以下の画面が表示されます。

この画面で、左下のアイコンからSystem Toolsを選択し、LXTerminalを起動します。

ターミナルから、以下のコマンドでDeepLabCutを起動します。

$ python3 -m deeplabcut

起動が成功すれば、以下の画面が表示されます。

あとは、通常通りDeepLabCutが使用できます!
Dockerコンテナ起動時に、/root/workdirを共有ディレクトリとしているので、ここでプロジェクトを管理するといいと思います。

まとめ

今回はDocker上で、DeepLabCutを起動しました。
Docker上で利用することで、環境が汚れたり、OSの違いなども吸収できます。

私自身も環境構築(特にGPUの対応)で手間取った部分が多かったので、他の人のお役に立てれば幸いです。

各ソフトウェアのアップデートで、もしかしたら上手く動かない可能性もあるので、その際はぜひコメントにてお知らせください。

コメント

タイトルとURLをコピーしました