TensorFlowでの物体検出のための環境構築

Tensorflow Object Detection イメージ図

概要

TensorFlowというGoogleが開発するOSSの機械学習・深層学習ライブラリがあります。
これは画像認識や音声認識などをサポートしており、解析やアプリケーション開発に役立てることができます。

TensorFlowには数多くの用途がありますが、今回はまだマニュアルの少ないObject Detection(物体検出)の環境構築について、実際の動作検証結果とともにまとめてみたいと思います。

Object Detectionとは

https://github.com/tensorflow/models/tree/master/research/object_detection

kites_detections_output.jpg

モデルを生成し、それを利用して画像内の物体を検出することが出来ます。
上記を実行する環境を構築するため下記のポイントを踏まえて進めていきます。

  1. TensorFlowを実行できるDockerイメージをEC2のDockerホスト上で動かす
  2. EC2のインスタンスはp2系にしてGPUで動くようにする

構築

Docker image

Dockerfile作成のポイントは下記の通りです。

  • /home/app をworkdirとする。
  • GPUでTensorFlowを動かすため、ベースイメージはnvidia/cuda:9.0-cudnn7-devel-ubuntu16.04にする。TensorFlowのverによってcudaのverも変わるので、あったものをいれること。このときはTensorFlowは1.8.0でcudaは9.0だった。
  • /home/appでgit clone https://github.com/tensorflow/models.git を実行する。

https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.md に書いてあるものを全て入れる。
このときprotobufまわりでprotocがなくてエラーになったので、別途以下を実行するようにしておく。

RUN mkdir /home/app/protoc && cd /home/app/protoc && \
        wget https://github.com/google/protobuf/releases/download/v3.3.0/protoc-3.3.0-linux-x86_64.zip && \
        chmod 775 protoc-3.3.0-linux-x86_64.zip && \
        unzip protoc-3.3.0-linux-x86_64.zip && \
        cd /home/app
        
  • pipでtensorflow-gpuなど、上記にinstallation.mdにある必要なパッケージをいれておく。

以上を踏まえたDockerfileです。適宜読み替えてください。

FROM nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04

        RUN apt-get update
        RUN apt-get install -y protobuf-compiler python-pil python-lxml python-tk git python-pip wget unzip

        RUN mkdir /home/app
        WORKDIR /home/app/

        RUN git clone https://github.com/tensorflow/models.git

        COPY requirement.txt /home/app/

        RUN pip install --upgrade pip
        RUN pip install -r /home/app/requirement.txt

        RUN mkdir /home/app/protoc && cd /home/app/protoc && wget https://github.com/google/protobuf/releases/download/v3.3.0/protoc-3.3.0-linux-x86_64.zip && chmod 775 protoc-3.3.0-linux-x86_64.zip && unzip protoc-3.3.0-linux-x86_64.zip && cd /home/app

        RUN cd models/research && /home/app/protoc/bin/protoc object_detection/protos/*.proto --python_out=.

        COPY app /home/app/

        ENV PYTHONPATH /home/app/models/research:/home/app/models/research/slim

        RUN git clone https://github.com/cocodataset/cocoapi.git && cd cocoapi/PythonAPI && make && cp -r pycocotools /home/app/models/research

        CMD ["/bin/sh"]
        

このDockerfileをDockerホスト設定後にローカルでbuildし、Dockerホスト上でrunする流れになります。

Dockerホスト

Dockerホストとしてp2系のインスタンスを立ち上げ、その上でdocker runをするようにします。
下記手順です。

  1. docker-machine createコマンドでEC2インスタンスを生成
  2. eval "$(docker-machine env [インスタンス名])"をローカルで実行してdocker-machineの向き先をかえる
  3. ローカルでdocker buildする
  4. docker-machine sshでインスタンスに入れることを確認

docker-machineのcreateコマンドは以下のようになります。

$ docker-machine create \
            --driver amazonec2 \
            --amazonec2-instance-type p2.xlarge \
            --amazonec2-region ap-northeast-1 \
            --amazonec2-security-group [SG name] \
            --amazonec2-vpc-id [VPC id] \
            --amazonec2-subnet-id [SUBNET id] \
            --amazonec2-zone [az] \
            --amazonec2-tags [key,value,,,] \
            --amazonec2-iam-instance-profile [IAM name] \
            [インスタンス名]
        

また、このときamazon linuxのamiだとsshに繋げずうまくいかなかったのでデフォルトのubuntuのamiを利用しました。

docker-machine sshでホストに入ったら、docker imagesで先ほどbuildしたimageがあることを確認して、以下の工程に移ります。

p2インスタンス上でGPUを用いてdockerコンテナを走らせるにはDockerホスト上にnvidia-dockerが必要になります。
nvidia-docker,nvidia-docker2の2種類ありますが、今回はnvidia-docker2をinstallします。
nvidia-docker2を入れるためには、先に環境にあったnvidia-driverをinstallする必要があります。
http://www.nvidia.co.jp/Download/index.aspx?lang=jp で、適したバージョンのものを確認します。
p2xlargeインスタンスを立ち上げたため、GPUはTesla K80、OSはUbuntu16.04で、docker imageのcudaは9.0なので、今回入れるnvidia-driverのversionは384.145になります。
以下を実行してinstallをします。

$ sudo add-apt-repository ppa:xorg-edgers/ppa
        $ sudo apt-get update
        $ apt-cache search 'nvidia-[0-9]+$'
        $ sudo apt-get install nvidia-384
        $ sudo reboot
        $ nvidia-smi
        

実行後、下記が表示されればOKです。

+-----------------------------------------------------------------------------+
        | NVIDIA-SMI 384.130                Driver Version: 384.130                   |
        |-------------------------------+----------------------+----------------------+
        | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
        | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
        |===============================+======================+======================|
        |   0  Tesla K80           Off  | 00000000:00:1E.0 Off |                    0 |
        | N/A   42C    P0    72W / 149W |      0MiB / 11439MiB |     71%      Default |
        +-------------------------------+----------------------+----------------------+

        +-----------------------------------------------------------------------------+
        | Processes:                                                       GPU Memory |
        |  GPU       PID   Type   Process name                             Usage      |
        |=============================================================================|
        |  No running processes found                                                 |
        +-----------------------------------------------------------------------------+
        

nvidia-driverをinstallしたので、続けてnvidia-docker2をhttps://github.com/nvidia/nvidia-docker/wiki/Installation-(version-2.0) を参考にinstallします。

install後、 docker run --runtime=nvidia --rm nvidia/cuda nvidia-smiを実行し、以下の結果が出ればOKです。

+-----------------------------------------------------------------------------+
        | NVIDIA-SMI 384.130                Driver Version: 384.130                   |
        |-------------------------------+----------------------+----------------------+
        | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
        | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
        |===============================+======================+======================|
        |   0  Tesla K80           Off  | 00000000:00:1E.0 Off |                    0 |
        | N/A   42C    P0    73W / 149W |      0MiB / 11439MiB |    100%      Default |
        +-------------------------------+----------------------+----------------------+

        +-----------------------------------------------------------------------------+
        | Processes:                                                       GPU Memory |
        |  GPU       PID   Type   Process name                             Usage      |
        |=============================================================================|
        |  No running processes found                                                 |
        +-----------------------------------------------------------------------------+
        

これで、p2インスタンス上でTensorFlowを利用できるdockerコンテナをGPUで動かす環境が整いました。

通常のdockerでなく、nvidia-dockerでコンテナを動かす場合は下記のようにします。
runtimeパラメータが必要になるので注意しましょう。

sudo docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=0 --rm [image名]
この記事を書いた人
高橋 真以
Takahashi Mai

データアナリティクス部 リード・データアーキテクト

前職ではアドテク業界で広告配信プラットフォームの開発に従事。機械学習を用いたシステム構築なども過去に経験したサーバーサイドエンジニア。
ウフルではインフラ基盤構築からデータ加工、分析結果の可視化まで担当。IoT技術などの研究開発にも携わっている。

Contact

ご依頼ご相談など、お問い合わせは下記フォームからお願いいたします。