プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2021/06/24

OpenVINO が動作する Docker イメージを作る

update2021/08/13 event_note2021/06/24 8:58

Docker Hub に OpenVINO の公式イメージがあるので、それを使って画像解析を行うための開発環境をサクッと構築します。

いろいろなイメージがありますが、開発用なので、サンプルやデモアプリなども入っている openvino/ubuntu18_dev を使います。

また、開発言語は Python を想定しています。

環境

  • Ubuntu 20.04
  • Docker 20.10.2
  • Visual Studio Code 1.57.1
  • OpenVINO 2021.2

Dockerfile の作成

公式イメージをそのまま使ってもいいですが、開発用として git や pip などは欲しいので入れておきます。
また、依存パッケージのインストール、サンプルやデモアプリのビルドも済ませておきます。

FROM openvino/ubuntu18_dev:2021.2

USER root

# 依存パッケージのインストール
RUN cd /opt/intel/openvino/install_dependencies && ./install_openvino_dependencies.sh

# サンプル、デモアプリのビルド
RUN cd /opt/intel/openvino/inference_engine/samples/cpp && ./build_samples.sh
RUN cd /opt/intel/openvino/inference_engine/demos && ./build_demos.sh
# /opt/intel/openvino_2021/deployment_tools/demo にデモアプリがある

# 他に必要なものを適宜インストール
RUN apt -y install wget git python3-pip
RUN pip3 install onnxruntime flask
RUN git clone https://github.com/ultralytics/yolov5

# aptのクリア
RUN apt clean && rm -rf /var/lib/apt/lists/*

USER openvino

# bash起動
CMD [ "/bin/bash" ]

これを myopenvino としてビルドしました。

$ docker build -t myopenvino:2021.2 .

コンテナ起動

例えば、以下のように起動します。

docker run -it --rm \
       --name openvino
       -e DISPLAY=${DISPLAY} \
       -v /tmp/.X11-unix/:/tmp/.X11-unix/ \
       -v /dev/bus/usb:/dev/bus/usb \
       --privileged --device /dev/dri:/dev/dri \
       --device-cgroup-rule='c 189:* rmw' \
       myopenvino:2021.2

-e DISPLAY=${DISPLAY}-v /tmp/.X11-unix/:/tmp/.X11-unix/ は推論結果を描画するために指定しています。
-v /dev/bus/usb:/dev/bus/usb は USB カメラなどを使えるように指定しています。
--privileged --device /dev/dri:/dev/dri --device-cgroup-rule='c 189:* rmw' は GPU や Movidius Myriad などで推論を行う場合にも対応できるように指定しています(全部必要なわけではないと思いますが・・・)。
詳細は以下を参考にしてください。

VSCode + Remote-Containers で起動できるようにする

実際に開発するとなると VSCode でデバッグしたいことが多々あると思うので、Remote-Containers を使って起動できるようにします。

Dockerfile は上記と同じものを使うとして、devcontainer.json で上記のコンテナ起動時の引数と同じものを指定すれば OK です。

例えば、以下のような感じです。

{
	"runArgs": [
		"-e", "DISPLAY=${env:DISPLAY}",
		"--privileged",
		"--device", "/dev/dri:/dev/dri",
	],

	"mounts": [
		"source=/tmp/.X11-unix/,target=/tmp/.X11-unix/,type=bind",
	 	"source=/dev/bus/usb,target=/dev/bus/usb,type=bind",
	],
}