GCP と Edge TPU でつくるインテリジェント IoT 基盤

Hayato Yoshikawa
google-cloud-jp
Published in
9 min readSep 17, 2019

IoT はデバイスからデータを取る存在から、様々な解析をしたりエッジ側でよりインテリジェントな処理が求められる存在へと変化してきています。この記事では、 Edge TPU で複雑でインテリジェントな処理をエッジ側で実行し、GCP でその結果をリアルタイムに可視化、解析する方法を紹介します。
TL;DR — 以下のリポジトリの手順に従うと、Edge TPU と GCP上の IoT データ分析基盤を構築できます。
https://github.com/google-coral/project-cloud-monitor

エッジ側(左)とクラウド側(右)

Edge TPU とは

Edge TPU は、Google が開発した TensorFlow Lite 形式の機械学習モデルを高速に演算(推論)するための ASIC のことです。2018年に発表されるまで、 TPU (Tensor Processing Unit) というとクラウド側で利用できるものだけでしたが、 Edge TPU は小型のデバイスでも実装できるよう設計されたものです。現在では、 Coral というブランドネームのもと、いくつかの形態で実装されたデバイスが販売されています。
また Edge TPU は特定のタスク(画像認識や音声認識など)専門に作られたものではなく、特有の制約はあるものの TensorFLow Lite 形式のモデルであれば実行可能です。つまり、自分で独自に作ったモデルを高速に推論することができます。

インテリジェントな IoT の必要性

IoT がインテリジェントだとどんな良いことがあるのでしょうか?実はほとんどの業種業界で、ビジネスの課題解決に役立ちます。例えば製造業では悩みのタネである、生産ラインにおける外観検査があります。外観検査とは、その名の通り商品や製造物の外観(見た目)の不具合を検査する工程のことです。傷が入っていたり、変色していたりするものを目や機械で判断して除きますが、最近では機械学習による画像識別で不具合を検知する場合もあります。画像識別はクラウド上でももちろん行えますが、そのためには画像をクラウド に送信し、推論結果のレスポンスを待つ必要があります。これは速くても数百msかかります。この検査にかかる時間は生産のコストに反映されるので、検査は短時間で行える方が経済的です。つまりEdge TPU などを使ってエッジ側で高速に推論するのが理にかなっています。一方、画像識別をするためのモデルの学習は、多くの計算リソースとデータが必要となるため、クラウドの潤沢なリソースを使った方が時間もコストも削減できます。学習データの収集も複数のエッジからクラウドに集約する方がよいでしょう。また、学習がし終わって実際に検査を行う段階になった場合は、その検査が正しく行われているかモニタリングしたいでしょう。これも、クラウドで集中管理する方が合理的です。

エッジとクラウド、双方を使い分け連携する

このようにエッジ側が単にインテリジェントになるだけではなく、 IoT としてクラウドと連携することによって実際の運用に耐えうる価値を創出することができます。

GCP と Edge TPU でインテリジェントな IoT 基盤をつくる

それでは GCP と Edge TPU を組み合わせて、上記のようなインテリジェントな IoT 基盤を構築してみましょう。ここでは、次のようなアーキテクチャを考えます。

Coral Dev Board がエッジ側のデバイスです。ここで、Edge TPU を使ってカメラに映った物体を高速にオブジェクト検知します。オブジェクト検知とは、画像の中にある、特定のオブジェクト(車や人など)を検知し、その画像上の位置を矩形などで出力することです。一般的には CNN を含むモデルにより実現されますが、これを CPU のみで演算する場合は非常に重く、リッチなハードウェア構成を組めない IoT デバイスでは高速に実行するのは困難です。Edge TPU にこれを演算させることで、非常に高速に検知結果を得ることができます。
Coral Dev Board で検知された結果(矩形の位置やオブジェクトの種類)は、MQTT プロトコルで IoT Core に送信されます。データは Pub/Sub を経由し、BigQuery と Firestore に保存されます。この一連の ETL 処理は、Dataflow によって実行されます。
Firestore は、リアルタイムにデータのやりとりを行いたい場合に便利な DB です。一度 Firestore に対してデータを書き込むと、そのデータをリッスンしている複数のクライアントに自動的に同期されます。このアーキテクチャでは、Google App Engine でホストしている WebUI から、Firestore のデータを読み込んでいます。

構築手順

https://github.com/google-coral/project-cloud-monitor
手順は上記リポジトリに記載されているので、ここでは各要素の補足を解説することにします。

エッジ側処理
エッジ側はオブジェクト検知のモデルを実行し、カメラに映った画像中の特定のオブジェクトを検知します。このモデルは COCO というオープンなデータセットを MobileNet SSD v1 のネットワークで学習したものを利用しています。90種類のオブジェクト(車、くだもの、動物など)を検知することができます。

オブジェクト検知例 [CC BY 4.0] : http://cocodataset.org/#explore?id=39555

Edge TPU では量子化した TensorFlow Lite のモデルを、Edge TPU 用にコンパイルして使います。Python API が用意されているので、コンパイル済みの tflite ファイルを API で読み込むだけで、推論を実行することができます。

データパイプライン
IoT Core で受け取ったデータは、 Pub/Sub でキューイングされて必要な変換処理や保存先に渡すことができます。Dataflow を使うと、この一連の処理を行うパイプラインを簡単に構築することができます。

本構成の Dataflow パイプライン

ここでは Pub/Sub から受け取ったデータを、少し整形して Firestore と BigQuery に書き込んでいます。BigQuery は書き込むだけでその後何かに使っている訳ではありませんが、BigQuery に全てのデータを保管しておくことで、アドホックに解析したい場合に即座にそれが実行できるので便利です。また、クエリを実行しない場合はストレージコストだけしかかからないため、とりあえず保存する、といった用途でもとてもリーズナブルです。一方 Firestore は前述した通りリアルタイムに結果を表示するために使います。このパイプラインでは全てのデータを Firestore に書き込んでいますが、データを送信するデバイスが増えてくる場合は集計した結果のみを Firestore に書き込むなど、工夫するとよいでしょう。また本稿執筆時点(2019年9月)では Firestore の Data Sink は無いため、Python の API を使って実装しています。次のようにクライアントライブラリを使えば簡単に Firestore への書き込みを行えます。

db = firestore.Client()
doc_ref = db.collection(u'users').document(u'alovelace')
doc_ref.set({
u'first': u'Ada',
u'last': u'Lovelace',
u'born': 1815
})

Web UI
GAE (Google App Engine) を使って、Web UI 用のページをホスティングしています。Firestore からのデータ読み込みは、HTML 内に記述した Javascript で行なっています。Firestore は Javascript 用のライブラリも提供されているため、リアルタイムにデータが変更される Web UI を簡単に構築することができます。例えば、 COL という Collection の中にある DEV という Document に変更があった場合に何らかの処理を行いたい場合、次のような数行のコードを書くだけでそれが実装できます。

var db = firebase.firestore();
db.collection("COL").doc("DEV").onSnapshot(function(doc) {
// 値が更新されたときに実行するコード
});

また、今回は実装していませんが、IoT Core を使ってエッジ側に対してデータを送信することも容易です。GAE 等からコントロールする場合はクライアントライブラリ を使うとよいでしょう。

まとめ

今回アーキテクチャで使用したプロダクトは、全てフルマネージドなものです。実際にコードをなぞっていくことで、それぞれの要素がいかに簡単に実装できるかを体感できると思います。
次回は、モデルの学習とエッジへのデプロイについて解説します。

--

--

Hayato Yoshikawa
google-cloud-jp

Customer Engineer, Google Cloud @Google. Views are my own.