Google Compute Engineを使ったTensorflowビルド手順　～エッジコンピュータでOpenVINOを使いこなす～

# 1. 概要
この記事では、Google Cloud Platform（以降、GCP）のCompute Engineを使ってTensorflowをビルドし、作成したTensorflowを使って日立制御エッジコンピュータCE50-10A(Ubuntuモデル)で推論実行するまでの手順を解説します。

ビルド手順は、Tensorflowの公式サイトで公開されているため、こちらを参考にします。
https://www.tensorflow.org/install/source?hl=ja

# 2. 経緯
CE50-10Aは、エッジでのディープラーニング推論を高速に実行するためのツールキットであるOpenVINOを搭載しており、OpenVINOを用いることでユーザはIntel製のハードウェアを用いて推論処理の実行が出来ます。
OpenVINOで推論実行するためには学習済モデルが必要となりますが、以下の通り学習済モデルをOpenVINOで実行出来るIR形式(.xml,.bin)に変換する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/72c5e346-e450-9e45-1961-4eb43b92a946.png)

このモデル変換を行うためのツールとしてIntel社はModel Optimizerを提供しており、様々な形式のモデル変換を可能にしていますが、Tensorflow(*1)で構築されたモデルの変換に向けて本ツール内でもTensorflowが使用されています。
*1: Google社が提供している、代表的なAIフレームワーク

TensorflowはVer.1.6以降よりCPUのAVX命令を使う仕様となっていますが、Intel Atomプロセッサーを搭載するCE50-10AはAVX命令が非サポートであるため、Model Optimizerを使用してTensorflowモデルの変換を実施すると「Illegal Instruction」というエラーとなってしまいます。

これを回避するため、本記事ではAVX命令を使用しないTensorflowを構築する手順を説明します。今回はTensorflowのオブジェクトをビルドするため、GCPのGoogle Compute Engineを使用します。

# 3. Google Compute Engineとは
Google Compute EngineはGCPの環境で仮想マシンの構築、利用ができるサービスです。簡単なGUI操作で、必要なスペックに対応した独自カスタマイズの仮想マシンを構成することが出来ます。

# 4. VM構築手順
ここからは、GCPのCompute Engineを利用して、任意のVMを構築する手順を説明していきます。
GCPにログインし、ナビゲーションメニューから「APIとサービス」を選択し、
Compute Engine APIを有効にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/7725e5c4-9049-583a-8867-9324d5689160.png)

ナビゲーションメニューの「Compute Engine」から「VMインスタンス」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/718978e3-b788-deff-5d02-b8240bd9b5b5.png)

VMインスタンスを作成するため、上部メニューの「インスタンスを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/852ce9fe-127b-d86e-77d6-24d93a7ef605.png)

任意のリージョン、ゾーンを設定後、マシン構成を選択していきます。
性能が低いとビルドに10時間以上掛かってしまうケースもあるため、今回は演算中心＆高性能なマシンファミリーを使います。※稼働時間に応じて料金が発生するため、使用後はVMを停止するなど十分注意してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/6871c205-40b5-0ffa-a5b1-0ccc74f15568.png)

ブートディスクメニューでOSを選択できますので、CE50-10A搭載OSと同じUbuntuを選びます。
ディスク容量はデフォルトの10GBではビルドの際に容量不足になってしまうため、20GBを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/190b7b03-4a37-bb8e-6c6f-c403e6b8e3c3.png)

上記以外は、説明に従って任意の設定を行い、最後に最下部の作成ボタンをクリックします。
しばらく待つと、指定した仮想マシン環境が出来上がります。

# 5. Tensorflowのビルド手順
ここからは、構築したVMを利用してTensorflowのビルドを行う手順について説明します。
VMインスタンスメニューから構築したVMを選択し、画面右側の「SSH」をクリックしてログインします。
VMにログインした後は、別ウィンドウでコンソール画面が表示されるため、本章からはその画面上での操作について説明します。

## 5.1 ビルドに必要なパッケージのインストール
Tensorflowのビルドに必要な各種パッケージをインストールします。
```
sudo apt update
sudo apt install python3-pip
python3 -m pip install -U --user pip numpy wheel
python3 -m pip install -U --user keras_preprocessing --no-deps
```

## 5.2 Bazelのインストール
ビルドツールであるBazelをインストール。

```
sudo apt install -y curl build-essential
curl -L -o bazel https://github.com/bazelbuild/bazelisk/releases/download/v1.10.1/bazelisk-linux-amd64
chmod +x bazel
export PATH="${PATH}:${PWD}"
```

## 5.3 Tensorflowのソースをダウンロード
CE50-10Aにはpython3.6系がインストールされているため、このバージョンに対応したTensorflowのバージョンが必要になります。
Tensorflow公式サイトで以下の対応表が公開されているため、これに従い今回はTensorflow 2.6.0を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/ac53f2be-4aee-fe14-ca25-9b1986f4303b.png)
ソースをダウンロードし、バージョン2.6を指定します。

```
git clone https://github.com/tensorflow/tensorflow
cd tensorflow
git checkout r2.6
```

## 5.4 ビルド設定
ビルドに必要な設定を行います。
下記実行後、サポート有無等を聞かれますが、いずれもそのままEnterを押してデフォルト設定にします。

```
python3 configure.py
```
## 5.5 ビルド実行
ビルド処理に必要なシンボリックリンクを作成後、ビルドを行います。
この記事の環境ではビルド完了まで約30分程掛かりました。

```
sudo ln -s /usr/bin/python3 /usr/bin/python
bazel build --copt=-march=atom //tensorflow/tools/pip_package:build_pip_package
```
--copt=march=atomの部分で、atomアーキテクチャを指定しています。
atomはAVX非対応であるため、本オプションの指定でAVXを使わないTensorflowが構築できます。

## 5.6 pipパッケージ作成
インストールに向けたpipパッケージを作成します。
```
 ./bazel-bin/tensorflow/tools/pip_package/build_pip_package <出力先ディレクトリ>
```

これで無事AVXを使用しないオリジナルのTensorflowのパッケージが構築できました。
以降、今回作成したTensorflowを用いることでAVX非搭載の装置でエラーが発生しなくなっているか見ていきます。

## 5.7 ダウンロード
画面上部の「ファイルをダウンロード」をクリックし、作成したパッケージのフルパスを入力してダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/840bf591-1ad1-3374-d980-fd77694ebc41.png)

ダウンロードが完了しましたら、CE50-10Aへファイルを転送しましょう。

# 6. Tensorflowのインストール
本手順からは、推論処理を実行するCE50-10A上の操作を説明します。
転送したファイルを格納したディレクトリに移動し、Tensorflowをインストールします。
ここではpythonの仮想環境を使って構築を進めます。

```
python3 -m venv tensorflow_env
source tensorflow_env/bin/activate
```

pipをアップグレードします。
```
python3 -m pip install --upgrade pip
```

ビルドしたtensorflowをインストールします。
※ファイル名称はTensorflow、pythonのバージョンによって変動します。
```
python3 -m pip install tensorflow-2.6.5-cp36-cp36m-linux_x86_64.whl
```

# 7. OpenVINO利用手順
CE50-10AにはOpenVINOがプレインストールされているためオフライン環境でも使用することができますが、今回は追加が必要なサンプルプログラムもあるため、本記事執筆時点の最新版ツールのインストール手順から解説します。

OpenVINO関連の各種インストール方法詳細については以下を参照してください。
https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/download.html

## 7.1 OpenVINOのインストール
OpenVINOの開発環境をインストールします。
Intelのマニュアルに従いpythonの仮想環境を使って構築しますが、先ほど作成したtensorflow_envの仮想環境上で以下を実行していきます。
尚、Tensorflowはインストール済みであるため、"[tensorflow]"のオプションは不要です。
```
python -m pip install --upgrade pip
pip install openvino-dev==2022.2.0
```


## 7.2 サンプルプログラムの準備
gitのリポジトリからopen model zooのリポジトリをクローンします。
open model zooとは、OpenVINOでAI推論を行うためのサンプルプログラム群です。

```
git clone https://github.com/openvinotoolkit/open_model_zoo.git
```
上記をホームディレクトリで実行した場合は、~/open_model_zoo/demosに各種サンプルプログラムが格納されています。

## 7.3 学習済モデルのダウンロード
今回は物体検知のサンプルプログラム実行に向けて、Tensorflowで構築されたYOLOv3の学習済モデルをダウンロードします。
```
omz_downloader --name yolo-v3-tiny-tf
```
omz_downloaderはOpenVINO toolkitに含まれているダウンローダーで、Intel社が提供している学習済モデルのダウンロードが出来ます。

## 7.4 モデル変換
ダウンロードしたモデルをOpenVINOで実行できる形式に変換します。
```
omz_converter --name yolo-v3-tiny-tf
```
モデル変換ツールであるomz_converterは、内部でModel Optimizerを使用します。標準のTensorflowがインストールされている場合は、非サポートのAVX命令を使おうとして「Illegal Instruction」のエラーが発生してしまいます。
今回は、AVX命令を使わないTensorflowをインストールしているため、上記エラーは発生しません。正常にモデル変換が行われると、yolo-v3-tiny-tf.bin、yolo-v3-tiny-tf.xml、yolo-v3-tiny-tf.mappingの3ファイルが出力されます。
これらのうち、サンプルプログラムの入力として必要な.bin、.xmlファイルを使用します。

# 7.5 サンプルプログラムの実行
物体検知のサンプルプログラム実行に必要な以下のファイルを任意のディレクトリに準備します。 
・サンプルプログラム：~/open_model_zoo/demos/object_detection_demo/python/object_detection_demo.py
・学習済モデル：7.4で作成した.bin、.xmlのファイル　※この2ファイルは同じディレクトリに配置することが必須
・推論対象の動画：ここでは猫の動画cat.mp4を使用
・ラベルデータ：~/open_model_zoo/data/dataset_classes/coco-80cl.txt

任意のディレクトリ上で以下を実行し、推論を行います。
```
python3 object_detection_demo.py -m yolo-v3-tiny-tf.xml -i cat.mp4 --labels coco-80cl.txt
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981093/1f8cefa1-f42e-4851-eba9-036228466349.png)

無事に猫と判別され、推論対象を指すバウンディングボックスも表示されました。

# 8. まとめ
この記事ではGCPのCompute EngineでVMを構築し、Tensorflowのビルドの方法を解説しました。また、構築したTensorflowを用いたことで、モデルの変換～推論実行までをエッジコンピュータCE50-10Aのみで行うことが出来ました。
モデル変換を別環境で実施する必要が無くなるため、是非開発業務効率化に繋げてもらえばと思います。

# 免責・商標類
・本記事に記載した手順は、その動作や結果を保証するものではありません。
・製品の改良により、予告なく記載さ入れている仕様が変更になる場合があります。
・本記事に記載の会社名、製品名などは、それぞれの会社の商標もしくは登録商標です。