nvidia-docker:caffe:mobilenetssd

MobielNetSSDをnvidia-dockerで環境構築

の環境を作る際,READMEに従う際にSSD用のcaffe環境を別gitからcloneした後にMobileNet-SSDの学習に 入っていきます.この際にssd用のcaffeリポジトリに含まれているdockerをそのまま利用するとえらい目にあったので ここに忘備録として記述します.ssd用のcaffeリポジトリはBVLC(The Berkeley Vision and Learning Center)から forkしてきているのですが,こちらがssd用に修正されていないため,MobileNet-SSD学習用にこのdockerを利用すると 最終的には学習できない(学習を実行した直後にプロセスが死ぬ)ことになります.結局のところちゃんとマニュアルに 従えばたとえdocker環境でも全然問題なかったわけですが,リポジトリにあるdockerを利用するとえらい目にあったの巻.

まず,https://github.com/chuanqi305/MobileNet-SSD に記載されているように,BVLCのcaffeではなく,著者のweiliu89さんのcaffeを最初にクローンします.ただほしいのはここのdockerディレクトリ以下だけなので他は使いません.

git clone https://github.com/weiliu89/caffe.git
cd caffe/docker

んでもって,このdockerにあるREADME( https://github.com/weiliu89/caffe/tree/ssd/docker )をみると,すぐにdockerでビルドする段取りが記述されています.これをnvidia-dockerでgpuに置き換えるわけですが,このビルドを実行する前に standalone/gpu/Dockerfile を修正します.なぜならこのDockerfileはBVLCそのままでssd用のDockerfileになっていないからです.修正する箇所は git clone を行っているところです.BVLCのcaffeではなく,weiliu89のcaffeにすること,さらにENV CLONE_TAGをmaster からssdに修正します.この修正を行わずにビルドするとBVLCのcaffeでmasterが入ってしまい,caffeのコンパイル自体は成功するがMobileNet-SSDの学習の際,必要な実装部分が足りずにプロセスが死んでしまいます.https://github.com/chuanqi305/MobileNet-SSD/issues/157 に記載されているように困った人もいたようです.提供されてるDockerfile使わなかければこんなことは起こりません.

# standalone/gpu/Dockerfileの修正箇所のみ記述しています.
#ENV CLONE_TAG=master
ENV CLONE_TAG=ssd
#RUN git clone -b ${CLONE_TAG} --depth 1 https://github.com/BVLC/caffe.git . && 
RUN git clone -b ${CLONE_TAG} --depth 1 https://github.com/weiliu89/caffe.git . && 

また,cudaとcudnnの環境も必要に応じて修正してください.馬場の手元の環境では 1080tiなので,デフォルトの cuda7.5だとそもそも1080tiに対応していないので,今日現在(2020年3月1日)の最新版でビルドしました.具体的には Dockerfileの先頭に記述されているバージョンを

#FROM nvidia/cuda:7.5-cudnn5-devel-ubuntu14.04
FROM nvidia/cuda:10.2-cudnn7-devel-ubuntu16.04

にしました.

以上で準備できたので,あとは https://github.com/weiliu89/caffe/tree/ssd/docker の通りに進めればOKです. caffeをビルドするだけだったら

nvidia-docker build -t caffe:gpu standalone/gpu

ちなみにこの環境でdocker環境を構築すると,/opt/caffe 以下にcloneしたcaffeが存在しています.

上記修正を行っていないとcaffeのversionは1.0.0ですが,weiliu89さんのしかもssdブランチでビルドできていると,ビルドされたcaffeは1.0.0-rc3になっているので,こちらで確認します.

docker run -ti caffe:gpu caffe --version
caffe version 1.0.0-rc3

Dockerの起動

通常データセットは外部SSD等に保存しているので,先程作成したdocker imageをそのまま走らせてもデータセットを参照できないため,imageの起動時にデータセットの場所や学習に必要なディレクトリをマウントするとよいです.例えばデータセットが /data1 ディレクトリに保存されている場合は

nvidia-docker run --volume=/data1:/data1 -ti caffe:gpu 

とすれば起動したimage内で同様に/data1/にアクセスできるようになります.-ti オプションは -t: ターミナル,-i:stdinをterminalにアタッチの意味です.docker imageをterminal内で使う場合に指定します.

nvidia-docker run -v=/data1:/data1 -v=/data2/caffe/examples:/opt/caffe/examples -v=/data2/caffe/data:/opt/caffe/data -ti caffe:gpu

MobileNetSSDの学習ではこんなふうにしてあげると便利.

  • nvidia-docker/caffe/mobilenetssd.txt
  • 最終更新: 2020/03/15 10:53
  • by baba