OpenPoseをSingularity上で実行する


はじめに

  • OpenPoseについての話(唐突なのはいつものこと)
  • DockerだとGUI表示がめんどくさい(GPU設定も)
  • 多分SingularityのほうがDockerの設定よりも楽だと思う
  • まだ要検討することもあるが一通り実行できたのでまとめていく
  • 一応コードをそのままコピペで実行できるようにしている
  • version1.1.0はご愛嬌ということで

実行環境

今回試した環境は以下の通りです.
OS: Ubuntu 18.04 LTS
CPU: i3-4130 3.40GHz
メモリ: 16GB
GPU: GeForce GTX 1660 Ti (6GB)

1. SingularityとNvidia-Dockerのインストール

Singularityのインストールについては前の記事で触れたので以下の記事を参照してください.
Singularityのインストールと実行をしてみた

またnvidia-dockerについてはこちらの記事が分かりやすかったです.
nvidia-docker 2 を Docker CE (安定版) と共に Ubuntu 18.04 へインストールする

インストールまで出来ればおkです.

2. OpenPoseの導入

今回はSingularityのサンドボックスのやり方を説明します.
以下のコードでDockerHubからOpenPoseをダウンロードし、サンドボックス化します.
ダウンロードに時間がかかると思いますが,気長に待っていれば問題ありません.

$ sudo singularity build --sandbox openpose_box docker://garyfeng/docker-openpose:latest

ここでnvidia-dockerを立ち上げる作業をします.
※理由は後ほどエラー集のところで触れていきます.
立ち上げたらexitしてもらって問題ありません.

$ sudo nvidia-docker run -it --rm garyfeng/docker-openpose:latest
$ exit

次にサンドボックス化したOpenPoseをSingularityで実行し,以下のディレクトリまで移動します.

$ singularity shell --nv openpose_box
$ cd openpose_box/openpose-master

ここでOpenPoseを実行すると以下のエラーが発生しますが,Windowが立ち上がると思います.

$ ./build/examples/openpose/openpose.bin --video examples/media/video.avi
Starting pose estimation demo.
Auto-detecting GPUs... Detected 1 GPU(s), using them all.
Starting thread(s)
Gtk-Message: Failed to load module "gail"
Gtk-Message: Failed to load module "atk-bridge"
Gtk-Message: Failed to load module "canberra-gtk-module"

※実行結果の一部(OpenPoseのサンプル動画)

実行時にエラーがあるので以下のコードで対応していきます.

$ exit # Singularityから抜け出す
$ sudo singularity shell --writable  openpose_box/ # sudoで書き込み
$ apt-get update
$ apt-get install libatk-adaptor libgail-common
$ apt install libcanberra-gtk-module libcanberra-gtk3-module
$ exit # Singularityから抜け出す

# 以下前の操作と同様
$ singularity shell --nv openpose_box
$ cd openpose_box/openpose-master
$ ./build/examples/openpose/openpose.bin --video examples/media/video.avi

2.1 OpenPoseの導入に当たるエラー集

正直いるかいらないかはわかりませんが,自分が出会ったエラーについてまとめていきます.

エラーその1
# エラー
$ ./build/examples/openpose/openpose.bin --video examples/media/video.avi
Starting pose estimation demo.
Auto-detecting GPUs... Detected 1 GPU(s), using them all.
Starting thread(s)
No protocol specified

(OpenPose 1.1.0:4279): Gtk-WARNING **: cannot open display: :0.0

ディスプレイが開けないと言われているので,ホスト側のDISPLAY値を確認をして,Singularity上のDISPLAY値を変更しましょう.

ホスト側
$ echo $DISPLAY
:1
コンテナ側(Singularity)
$ echo $DISPLAY
:0.0
$ export DISPLAY=:1

=========================================================

エラーその2
# エラー
$ ./build/examples/openpose/openpose.bin --video examples/media/video.avi
Starting pose estimation demo.

Error:
Cuda check failed (30 vs. 0): unknown error

Coming from:
- src/openpose/utilities/cuda.cpp:getGpuNumber():47
- src/openpose/utilities/cuda.cpp:cudaCheck():36
- src/openpose/utilities/cuda.cpp:getGpuNumber():57
- ./include/openpose/wrapper/wrapper.hpp:configure():947
terminate called after throwing an instance of 'std::runtime_error'
  what():  
Error:
Cuda check failed (30 vs. 0): unknown error

Coming from:
- src/openpose/utilities/cuda.cpp:getGpuNumber():47
- src/openpose/utilities/cuda.cpp:cudaCheck():36
- src/openpose/utilities/cuda.cpp:getGpuNumber():57
- ./include/openpose/wrapper/wrapper.hpp:configure():947

Aborted

この部分がnvidia-dockerを立ち上げる理由になります.
恐らくnvidia-dockerを一度立ち上げないとCudaのチェックができない?ことになっていて,それの回避するための処理となります.
これに関しては私もよく分かっていないのでご教授いただければ幸いです.

まとめ

  • SingularityでOpenPoseを実行した.
  • 私はDockerよりも扱いやすかったと感じた.(元々Singularityを触っていた経緯もあるが)
  • まだまだ未知の問題があると思うので,さくっと実装したい人はDockerのほうをおすすめする.

参考文献

OpenPose: Real-time multi-person keypoint detection library for body, face, hands, and foot estimation
OpenPose - Quick Start
garyfeng/docker-openpose
OpenPose1.3.0をDocker上で動かす
ubuntu で root 時に cannot open display となる件
Failed to load module “canberra-gtk-module” … but already installed
How to install gail and atk-bridge?
Ubuntuで簡単にデスクトップ録画をし、gifに変換してQiitaに投稿する方法