
概要
TensorFlowというGoogleが開発するOSSの機械学習・深層学習ライブラリがあります。
これは画像認識や音声認識などをサポートしており、解析やアプリケーション開発に役立てることができます。
TensorFlowには数多くの用途がありますが、今回はまだマニュアルの少ないObject Detection(物体検出)の環境構築について、実際の動作検証結果とともにまとめてみたいと思います。
Object Detectionとは
https://github.com/tensorflow/models/tree/master/research/object_detection
モデルを生成し、それを利用して画像内の物体を検出することが出来ます。
上記を実行する環境を構築するため下記のポイントを踏まえて進めていきます。
- TensorFlowを実行できるDockerイメージをEC2のDockerホスト上で動かす
- 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をするようにします。
下記手順です。
docker-machine create
コマンドでEC2インスタンスを生成eval "$(docker-machine env [インスタンス名])"
をローカルで実行してdocker-machineの向き先をかえる- ローカルでdocker buildする
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データアナリティクス部 リード・データアーキテクト