ホーム » 「TensorFlow Mobile」タグがついた投稿

タグアーカイブ: TensorFlow Mobile

TensorFlow : Mobile : モバイル配備のためのモデルを準備する

TensorFlow : Mobile : モバイル配備のためのモデルを準備する (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 12/17/2017

* 本ページは、TensorFlow の本家サイトの Mobile – Preparing models for mobile deployment を翻訳した上で
適宜、補足説明したものです:

* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

訓練中にモデル情報をストアするための要件は、モバイルアプリケーションの一部としてそれをリリースすることを望む時には非常に異なるものになります。このセクションでは、訓練モデルから製品でリリース可能なものに変換することに伴うツールをカバーします。

 

セーブされた異なるファイルフォーマットの総てはどうなっているのか?

TensorFlow がグラフをセーブ可能な異なる方法総てによって貴方は自身が非常に混乱していることに気がつくかもしれません。手助けするために、幾つかの異なるコンポーネントとそれらが何のために使用されるのかの要約がここにあります。オブジェクトの大部分は protocol buffers で定義されてシリアライズされます :

  • NodeDef: モデルの単一の演算を定義します。それは、一意な名前、それが (それらから) 入力を引き出す他のノードのリスト、それが実装する演算タイプ (例えば Add, あるいは Mul)、そしてその演算を制御するために必要な任意の属性を持ちます。これは TensorFlow のための計算の基本的なユニットで、そしてこれらのノードのネットワークを通して反復し、個々の一つを順番に適用することにより総てのワークは遂行されます。知っておくに値する一つの特定の演算タイプは Const です、何故ならばこれは定数 (= constant) についての情報を保持するからです。これは単一の、スカラー数か文字列かもしれませんが、多次元テンソル配列全体を保持することもできます。Const のための値は NodeDef 内部にストアされ、そのため巨大な定数はシリアライズされた時に多くの場所を取ります。
     
  • Checkpoint : モデルのために値を保持するための他の一つの方法は Variable ops を使用することです。Const ops とは異なり、これらはそれらの内容を NodeDef の一部としては保持しません、そのためそれらは GraphDef ファイル内には非常に小さなスペースしか取りません。代わりに計算が実行されている間それらの値は RAM 内で保持され、そしてチェックポイント・ファイルとしてディスクに定期的にセーブアウトされます。これは典型的にはニューラルネットワークが訓練されて重みが更新される時に発生します、そのためそれはタイムクリティカルな演算です。そしてそれは多くのワーカーに渡り分散作法で発生するかもしれませんので、ファイルフォーマットは高速で柔軟でなければなりません。それらはチェックポイント内に何が含まれているかを記述するメタデータ・ファイルと一緒に、複数のチェックポイント・ファイルにストアされます。API でチェックポイントを参照するときは (例えばコマンドライン引数としてファイル名を渡すとき)、関連するファイルのセットのために共通のプレフィックスを使用するでしょう。これらのファイルを持つ場合には :
    /tmp/model/model-chkpt-1000.data-00000-of-00002
    /tmp/model/model-chkpt-1000.data-00001-of-00002
    /tmp/model/model-chkpt-1000.index
    /tmp/model/model-chkpt-1000.meta
    

    それらを /tmp/model/chkpt-1000 として参照するでしょう。

  • GraphDef: は NodeDef のリストを持ち、これらは実行するために計算グラフを一緒に定義します。訓練中、これらのノードの幾つかは Variable ですので、重みも含めて、実行できる完全なグラフを持つことを望むのであれば、チェックポイントからそれらの値を引っ張るにはリストア演算を呼び出す必要があるでしょう。チェックポイント・ローディングは訓練の要請の総てを扱うために柔軟でなければなりません、これはモバイルと組み込みデバイス、特に iOS のような適切なファイルシステムがないものの上で実装することはトリッキーになるかもしれません。これは freeze_graph.py スクリプトが役立つところです。上述したように、Const ops はそれらの値を NodeDef の一部としてストアしますので、総ての Variable 重みが Const ノードに変換されるのであれば、単一の GraphDef ファイルが必要なだけです。graph の freezing はチェックポイントをロードするプロセスを扱い、そして総ての Const を Variable に変換します。それから単一の呼び出しで結果としてのファイルをロードできます、チェックポイントから変数値をレストアしなければならないことなしにです。GraphDef ファイルのために気をつけなければならない一つのことは時々それらは簡単な精査のためにテキストフォーマットでストアされることです。これらのバージョンは通常 ‘.pbtxt’ ファイル名サフィックスを持ちます、一方で倍なるファイルは ‘.pb’ で終わります。
     
  • FunctionDefLibrary: これは GraphDef 内に現れる、それぞれが (それらの) 入力と出力ノードの情報を持つサブグラフの効果的なセットです。そして各サブグラフはメイングラフの op として使用可能で、他の言語で関数がコードをどのようにカプセル化するかと同様の方法で、異なるノード (群) の簡単なインスタンス化を可能にします。
     
  • MetaGraphDef: プレーンな GraphDef は計算ネットワークについての情報を持つだけで、モデルやそれがどのように使用されるかについてのどのような特別な情報も持っていません。MegaGraphDef はモデルの計算パートを定義する GraphDef を含み、しかしまた ‘signatures’ のような情報も含みます。これらはどの入力と出力をモデルと一緒に呼び出すことを望んで良いか、どのようにそしてどこでチェックポイントファイルがセーブされたか、そして使いやすさのために ops を一緒にグループ化する便利なタグについての提案です。
     
  • SavedModel: 変数チェックポイントの共通セットに依存するグラフの異なるバージョンを持つことを望むことは一般的です。例えば、同じグラフの GPU と CPU バージョンを必要とし、しかし両者について同じ重みを保持するかもしれません。またモデルの一部として (ラベル名のような) 幾つかの特別なファイルを必要とするかもしれません。SavedModel フォーマットはこれらの要請に、変数を複製することなしに同じグラフの複数のバージョンをセーブさせて、そしてまた同じバンドルにアセットファイルをストアすることによって対処します。その裏では、それは特別なメタデータファイルと一緒に MetaGraphDef とチェックポイントファイルを使用します。もし貴方が、例えば TensorFlow Serving を使用して web API を配備しているのであれば、それは貴方が使用することを望むフォーマットです。

 

モバイル上で使用可能なモデルをどのように得るのでしょう?

多くの状況で、TensorFlow でモデルを訓練することは GraphDef ファイル (通常は .pb か .pbtxt サフィックスで終わります) とチェックポイント・ファイルのセットを含むフォルダを与えます。モバイルか組み込みへの配備のために必要なものは、’frozen’ されているか、インライン定数に変換された変数を持つ、単一の GraphDef ファイルですので総てが一つのファイル内にあります。変換を処理するためには、freeze_graph.py スクリプトが必要でしょう、これは tensorflow/python/tools/freeze_graph.py に保持されています。それはこのように実行できるでしょう :

bazel build tensorflow/tools:freeze_graph
bazel-bin/tensorflow/tools/freeze_graph \
--input_graph=/tmp/model/my_graph.pb \
--input_checkpoint=/tmp/model/model.ckpt-1000 \
--output_graph=/tmp/frozen_graph.pb \
--output_node_names=output_node (\)

input_graph 引数は、貴方のモデル・アーキテクチャを保持する GraphDef ファイルをポイントすべきです。GraphDef がディスク上のテキストフォーマットでストアされていることもありえます、この場合には .pb の代わりに .pbtxt で終わる可能性が高いです、そしてコマンドに特別な –input_binary=false フラグを追加すべきです。

input_checkpoint は最も最近にセーブされたチェックポイントであるべきです。チェックポイントのセクションで述べたように、完全なファイル名よりも、ここではチェックポイントのセットへの一般的なプレフィックスを与える必要があります。

output_graph は結果としての凍結された (= frozen) GraphDef がセーブされる場所を定義します。テキストフォーマットでは巨大なスペースの総量を取る多くの重み値を含む可能性が高いのでそれはいつでもバイナリ protobuf としてセーブされます。

output_node_names はノードの名前のリストです。これは貴方がグラフの結果から抽出することを望むものです。これが必要な理由は、凍結するプロセスはグラフのどの部分が実際に必要であるか、そしてどれが訓練プロセスの (要約 ops のような) 生成物であるかを理解する必要があるためです。与えられた出力ノードを計算するために寄与する ops のみが保持されるでしょう。グラフがどのように使用されるかを知っていれば、これらは丁度取得ターゲットとして貴方が Session::Run() に渡すノードの名前であるべきです。ノード名を見つける最も簡単な方法は python でグラフを構築する Node オブジェクトを精査することです。TensorBoard で貴方のグラフを精査することも他の単純な方法です。summarize_graph ツール を実行することでありそうな出力について何某かの提言を得ることができます。

TensorFlow のための出力フォーマットは時間とともに変わっていますので、input_saver のような、他の一般的には使用されることの少ない利用可能なフラグも各種ありますが、フレームワークの新しいバージョンでは訓練されたグラフ上ではこれらを必要とすべきではないことを望みます。

 

グラフ変換ツールを使用する

デバイス上でモデルを効率的に実行するために必要な多くのことは グラフ変換ツール (Graph Transform Tool) を通して利用可能です。このコマンドライン・ツールは入力 GraphDef ファイルを取り、貴方がリクエストする書き換えルールのセットを適用して、そしてそれから結果を GraphDef として書き出します。このツールをどのようにビルドして実行するかについての更なる情報はドキュメントを見てください。

訓練-only ノードを取り除く

訓練コードで生成された TensorFlow GraphDef は、バックプロパゲーションと重み更新、更に入力のキューイングをデコーディング、そしてチェックポイントのセーブのために必要な、総ての計算を含みます。これらのノードの総ては推論の間にはもはや不要で、チェックポイント・セービングのような演算の幾つかはモバイル・プラットフォームではサポートさえされません。デバイスでロード可能なモデルファイルを作成するためにはグラフ変換ツールの strip_unused_nodes ルールを実行することによりそれらの必要でない演算を削除する必要があります。

このプロセスの最もトリッキーな部分は推論の間に入力と出力として使用したいノードの名前を見つけ出すことです。推論を実行し始めたらこれらはいずれにせよ必要でしょう、しかしここでもどのノードが推論 -only パスで必要ないかを変換が計算できるためには、それらが必要です。これらは訓練コードからは明白ではないかもしれません。ノード名を決定する最も簡単な方法は TensorBoard でグラフを調査することです。

モバイル・アプリケーションは典型的にはセンサーからデータを収集してそれをメモリ上に配列として持ちますが、その一方で訓練は典型的にはディスクにストアされたデータ表現をロードしてデコードすることを伴うことを忘れないでください。例として Inception v3 の場合には、グラフの最初に DecodeJpeg op があり、これはディスクから取得されたファイルから JPEG-エンコードされたデータを取りそしてそれを任意のサイズの画像に変えるために設計されています。それの後にはそれを期待するサイズにスケールする BilinearResize op があり、続いて 2, 3 の他の ops があります。これらは byte データを float に変換してグラフの残りが期待する方法で値の大きさをスケールします。典型的なモバイル app はこれらのステップの多くをスキップするでしょう、何故ならばその入力をライブカメラから直接取る続けるからです。そのため貴方が実際に供給する入力ノードはこの場合には (下図の) Mul ノードの出力です。

正しい出力ノードを見つけ出すために同様の精査のプロセスを行なう必要があるでしょう。

frozen GraphDef ファイルだけが与えられてそのコンテンツについて不確かであるならば、summarize_graph ツールを使用してみてください、これはグラフ構造からそれが見つける入力と出力についての情報を表示出力します。オリジナルの Inception v3 ファイルの例がここにあります :

bazel run tensorflow/tools/graph_transforms:summarize_graph -- 
--in_graph=tensorflow_inception_graph.pb

入力と出力ノードが何であるかの考えをひとたび持つならば、それらをグラフ変換ツールに –input_names と –output_names 引数として供給し、次のように、trip_unused_nodes transform を呼び出すことができます :

bazel run tensorflow/tools/graph_transforms:transform_graph --
--in_graph=tensorflow_inception_graph.pb
--out_graph=optimized_inception_graph.pb --inputs='Mul' --outputs='softmax'
--transforms='
  strip_unused_nodes(type=float, shape="1,299,299,3")
  fold_constants(ignore_errors=true)
  fold_batch_norms
  fold_old_batch_norms'

ここで注意すべき一つのことは入力にこうあってほしいというサイズと型を指定する必要があることです。これは、推論への入力として渡していくどのような値でも特別な Placeholder op ノードに供給される必要があるためで、そして変換はそれらがまだ存在しない場合にはそれらを作成する必要があるかもしれません。例えば Inception v3 の例では、Placeholder ノードは、リサイズされてリスケールされた画像配列を出力するために使用される古い Mul ノードを置き換えます、何故ならば TensorFlow を呼び出す前にその処理を私達自身で行なうからです。けれどもそれは元の名前を保持します、それは変更された Inception グラフでセッションを実行するときに何故 Mul に常に入力を供給するかの理由です。

このプロセスを実行した後は、貴方の予測プロセスを実行するために必要な実際のノードを含むだけのグラフを持つでしょう。これがグラフでメトリクスを走らせることが有用となるポイントで、モデルに何があるかを理解するために再度 summarize_graph を実行することは価値があります。

 

どの ops をモバイル上で含めるべきでしょうか?

TensorFlow では数百もの利用可能な演算があり、そしてそれぞれの一つは異なるデータ型のために複数の実装を持ちます。モバイル・プラットフォーム上では、コンパイル後に生成される実行可能バイナリのサイズは重要です、何故ならば最善のユーザ体験のためにはアプリケーションのダウンロード・バンドルはできる限り小さくある必要があるからです。総ての ops とデータ型が TensorFlow ライブラリにコンパイルされるならばコンパイルされたライブラリの総計サイズは数十メガバイトになりえますので、デフォルトでは ops とデータ型のサブセットだけが含まれます。

これは、もし貴方がデスクトップ・マシン上で訓練されたモデル・ファイルをロードする場合、それをモバイルにロードするとき “No OpKernel was registered to support Op” エラーを見るかもしれないことを意味します。試すべき最初のことは任意の訓練-only ノードをストリップ・アウトしたことを確かなものにすることです、op が決して実行されない場合でさえもロード時にエラーが起きるでしょう。それが行われた後でも依然として同じ問題に遭遇するのであれば、貴方のビルドされたライブラリに op を追加することを見る必要があるでしょう。

ops と型を含めるための基準は幾つかのカテゴリーに分類されます :

  • それらは勾配のためのバックプロパゲーションでのみ有用でしょうか?モバイルは推論にフォーカスしますので、これらを含める必要はありません。
  • チェックポイント・セービングのように、それらは他の訓練の要請のために主として有用でしょうか?これらは抜かします。
  • libjpeg のような、モバイル上で常に利用可能ではないフレームワークにそれらは依存しているでしょうか?特別な依存を回避するために DecodeJpeg のような ops は含めません。
  • 一般的には使用されない型がありますか?例えば boolean の変形は含めません、何故ならば典型的な推論グラフではそれらの使用を殆ど見ることはないからです。

モバイル上での推論のために最適化するためにこれらの ops はデフォルトではトリムされますが、しかしデフォルトを変更するためにビルドファイルを変えることは可能です。ビルドファイルを変更した後、TensorFlow を再コンパイルする必要があるでしょう。どのようにこれを行なうかのより詳細にうちては下を見てください、そしてまたバイナリサイズを小さくするための詳細は Optimizing を見てください。

実装の位置を特定する

演算は2つのパートに分かれます。最初は op 定義で演算の signature を宣言します、これはそれが持つ入力、出力、そして属性です。これらは非常に小さなスペースしか取りませんので、デフォルトで総てが含められます。op 計算の実装はカーネル内でなされ、これは tensorflow/core/kernels フォルダにあります。ライブラリに入れる必要がある op のカーネル実装を含む C++ ファイルをコンパイルする必要があります。それがどのファイルであるかを見出すためには、ソースファイルの演算名を検索することができます。

github の検索例はここにあります。

この検索が Mul op 実装を探していることが見て取れるでしょう、そしてそれは tensorflow/core/kernels/cwise_op_mul_1.cc でそれを見つけています。文字列引数の一つとして貴方がケアする op 名と一緒にREGISTER で始まるマクロを探す必要があります。

このケースでは、実装は実際には複数の .cc ファイルに渡って分かれていますので、貴方のビルドにはそれらの総てを含める必要があるでしょう。コード検索のためにコマンドラインを使用するほうがより快適であるならば、TensorFlow レポジトリのルートから実行した場合に正しいファイルの位置を決める grep コマンドもまたあります :

grep 'REGISTER.*"Mul"' tensorflow/core/kernels/*.cc

実装をビルドに追加する

もし貴方が Bazel を使用して Android のためにビルドしているのであれば、見つけたファイルを android_extended_ops_group1android_extended_ops_group2 ターゲットに追加することを望むでしょう。それらがそこで依存する任意の .cc ファイルを含める必要もまたあるかもしれません。ビルドがヘッダファイルの欠落について不平を言うのであれば、必要な .h を android_extended_ops ターゲットに追加します。

iOS, Raspberry Pi, etc. をターゲットとする makefile を使用ているのであれば、tensorflow/contrib/makefile/tf_op_files.txt に行って、そこで正しい実装ファイルを追加してください。

 
以上





TensorFlow : Mobile : TensorFlow ライブラリを統合する

TensorFlow : Mobile : TensorFlow ライブラリを統合する (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 12/13/2017

* 本ページは、TensorFlow の本家サイトの Mobile – Integrating TensorFlow libraries を翻訳した上で
適宜、補足説明したものです:

* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

解決しようとしている問題を扱うモデル上で何某かの進捗を得たのであれば、直ちにアプリケーション内部でそれを実際に試してみることは重要です。訓練データと現実世界でユーザが実際に遭遇するものとの間には予期せぬ違いがしばしばあり、そしてできる限り早くギャップの明確な構図を得ることは製品体験を改良します。

このページは、TensorFlow モバイルデモ・アプリケーションを既に成功的にビルドして配備できているものとして、TensorFlow ライブラリを貴方自身のモバイル・アプリケーションにどのように統合するかについて説明します。

 

ライブラリをリンクする

何とかサンプルをビルドした後には、次に、貴方の既存のアプリケーションの一つから TensorFlow を呼び出すことを多分望むでしょう。これを行なうための非常に最も簡単な方法は ここで 説明される Pod インストレーションを使用することですが、 (例えば演算子が含まれるものをカスタマイズするために) TensorFlow をソースからビルドすることを望む場合には、フレームワークとしての TensorFlow から抜け出して、正しいヘッダファイルを含み、そしてビルドされたライブラリと依存に対してリンクする必要があるでしょう。

Android

Android のためには、libandroid_tensorflow_inference_java.jar と呼ばれる JAR ファイルに含まれる Java ライブラリ内でリンクすることが必要なだけです。貴方のプログラムでこの機能を含めるためには3つの方法があります :

  1. それを含む jcenter AAR を含めます、この example app のように。
  2. nightly に事前コンパイルされたバージョンを ci.tensorflow.org からダウンロードします。
  3. JAR ファイルを貴方自身でビルドします、Android Github レポジトリ の手順を使用して。

iOS

※ 省略 (原文 を参照してください)

 

グローバル・コンストラクタ・マジック

貴方自身のアプリケーションから TensorFlow を呼び出そうとするときに、貴方が遭遇するかもしれない微妙な問題の一つは “No session factory registered for the given session options” エラーです。これが何故起きるのかそしてそれをどのように修正するかを理解するためには、TensorFlow のアーキテクチャについて少し知る必要があります。

フレームワークは非常にモジュール的に設計されていて、薄いコアと独立的な非常に多くの特定のオブジェクトを持ち、それらは必要に応じてミックスしてマッチさせることができます。これを可能にするために、C++ でのコーディング・パターンはモジュールにそれらが提供するサービスについてフレームワークに通知させなければなりません。各実装から別々に更新されなければならない中心的なリストを要求することなしにです。それはまたそれら自身の実装を追加するためにコアの再コンパイルを必要とすることなしに別々のライブラリを許容しなければなりません。

この能力を達成するために、TensorFlow は多くの場所で登録パターン (= registration pattern) を使用しています。コード内では、それはこのように見えます :

class MulKernel : OpKernel {
  Status Compute(OpKernelContext* context) { … }
};
REGISTER_KERNEL(MulKernel, “Mul”);

これは、カーネルの主要セットの一部か別々のカスタムライブラリとして、貴方のアプリケーションにリンクされたスタンドアローンな .cc ファイル内にあるでしょう。マジック・パートは REGISTER_KERNEL() マクロが TensorFlow のコアにそれは Mul 演算の実装を持つことを知らせることができることで、その結果それを必要とする任意のグラフで呼び出すことができます。

プログラミング視点からは、このセットアップは非常に便利です。実装と登録コードは同じファイル内に存在し、そして新しい実装の追加はそれをコンパイルしてリンクするほどに単純です。難しいパートは REGISTER_KERNEL() マクロが実装される方法に由来します。C++ はこの類の登録を行なうための良いメカニズムを提供しませんので、何某かのトリッキーなコードに頼らなければなりません。内部では、マクロはそれがこのようなものを生成するように実装されています :

class RegisterMul {
 public:
  RegisterMul() {
    global_kernel_registry()->Register(“Mul”, [](){
      return new MulKernel()
    });
  }
};
RegisterMul g_register_mul;

これは 、global kernel registry に、誰か (何か) が “Mul” カーネルをどのように作成するかそれに尋ねたときにどの関数を呼び出すかを教えるコンストラクタを持つ、RegisterMul クラスをセットアップします。そしてそのクラスのグローバル・オブジェクトがあり、そしてコンストラクタは任意のプログラムのスタート時に呼び出されるべきです。

これが賢明であるように思える一方で、不運なパートは、定義されたグローバル・オブジェクトはどのような他のコードからも使用されません、そのためこれを考慮して設計されているわけではないリンカはそれが削除できると決定するでしょう。その結果、コンストラクタは決して呼び出されることなく、そしてクラスは決して登録されません。総ての類のモジュールは TensorFlow でこのパターンを使用し、そしてコードが実行されるとき Session 実装が最初に探されるということが起きます、これが、この問題が発生するときにそれが特徴的なエラーとして何故現れるかの理由です。

解法は、リンカに対してライブラリからどのようなコードも、それが使用されないとリンカが信じる場合でさえも、ストリップしないように強制することです。iOS では、そのステップは -force_load フラグでライブラリパスを指定して達成されます。そして Linux 上では –whole-archive が必要です。これらはリンカにストリッピングについて積極的でないように説得し、そしてグローバルを保持すべきです。

各種の REGISTER_* マクロの実際の実装は実際にはもう少し複雑ですが、それらは総て同じ根本的な問題を被ります。それらがどのように動作するか興味があれば、op_kernel.h は調査を始めるのに良い場所です。

 

Protobuf 問題

TensorFlow は一般的には protobuf として知られる、Protocol Buffers ライブラリに依存しています。このライブラリはデータ構造の定義を取って、シリアライゼーションとそれらのためのアクセスコードを各種言語で生成します。トリッキーなパートはこの生成されたコードは、ジェネレータのために使用されたフレームワークの正確に同じバージョンのための共有ライブラリに対してリンクされる必要があることです。(コードを生成するために使用されたツール) protoc が標準リンクとインクルードパスにあるライブラリとは異なるバージョンの protobuf からのものであるとき、これは問題となります。例えば、貴方は ~/projects/protobuf-3.0.1.a にあるローカルでビルドされた protoc のコピーを使用しているかもしれません、しかし 3.0.0 からの /usr/local/lib と /usr/local/include にインストールされたライブラリを持ちます。

この問題の症状はコンパイルまたは protobuf とのリンクの段階の間のエラーです。通常は、ビルドツールがこれをケアしますが、makefile を使用している場合には、この Makfile で示されるように、protobuf ライブラリをローカルでビルドしてそれを使用することを確実にしてください。

問題を引き起こす他の状況は、protobuf ヘッダとソースファイルがビルドプロセスの一部として生成される必要があるときです。このプロセスはビルドをより複雑にします。最初のフェーズは必要な総てのコードファイルを作成するために protobuf 定義に渡るパスでなければなりませんので、その後にのみ続行してライブラリコードのビルドを行なうことができます。

同じアプリケーションにおける protobuf の複数バージョン

protobuf は TensorFlow ライブラリ全体への C++ インターフェイスの一部として必要なヘッダを生成します。これはスタンドアロン・フレームワークとしてライブラリを使用することを複雑にします。

もし貴方のアプリケーションが既に protocol buffers ライブラリのバージョン 1 を使用している場合には、TensorFlow の統合はトラブルを持つかもしれません、何故ならばそれはバージョン 2 を要求するからです。もし両者のバージョンを同じバイナリにリンクしようとするならば、幾つかのシンボルの衝突でリンクエラーを見るでしょう。この特定の問題を解決するために、rename_protobuf.sh に実験的なスクリプトを持ちます。

総ての依存をダウンロードした後に、makefile ビルドの一部としてこれを実行する必要があります :

tensorflow/contrib/makefile/download_dependencies.sh
tensorflow/contrib/makefile/rename_protobuf.sh

 

TensorFlow API を呼び出す

フレームワークを利用可能にしたのであれば、次にそれを呼び出す必要があります。通常のパターンは最初に数値計算の調整されたセットを表すモデルをロードして、それからそのモデルを通して入力 (例えば、カメラからの画像) を走らせてそして出力 (例えば、予測されたラベル) を受けとります。

Android 上では、このユースケースに丁度フォーカスされた Java Inference Library (推論ライブラリ) を提供します、その一方で iOS と Raspberry Pi 上では C++ API を直接的に呼び出します。

Android

これは Android 上の典型的な推論ライブラリ・シークエンスがどのようなものかを示します :

// Load the model from disk.
TensorFlowInferenceInterface inferenceInterface =
new TensorFlowInferenceInterface(assetManager, modelFilename);

// Copy the input data into TensorFlow.
inferenceInterface.feed(inputName, floatValues, 1, inputSize, inputSize, 3);

// Run the inference call.
inferenceInterface.run(outputNames, logStats);

// Copy the output Tensor back into the output array.
inferenceInterface.fetch(outputName, outputs);

このコードのソースは Android examples で見つけられます。

iOS と Raspberry Pi

これは iOS と Raspberry Pi のための同等なコードです :

// Load the model.
PortableReadFileToProto(file_path, &tensorflow_graph);

// Create a session from the model.
tensorflow::Status s = session->Create(tensorflow_graph);
if (!s.ok()) {
  LOG(FATAL) << "Could not create TensorFlow Graph: " << s;
}

// Run the model.
std::string input_layer = "input";
std::string output_layer = "output";
std::vector outputs;
tensorflow::Status run_status = session->Run({ {input_layer, image_tensor}},
                           {output_layer}, {}, &outputs);
if (!run_status.ok()) {
  LOG(FATAL) << "Running model failed: " << run_status;
}

// Access the output data.
tensorflow::Tensor* output = &outputs[0];

これは総て iOS sample code を基にしていますが、iOS-特有のものは全くありません; 同じコードは C++ をサポートする任意のプラットフォーム上で利用できるはずです。

Raspberry Pi のための固有のサンプルはまた ここで 見つけられます。

 
以上





TensorFlow : Mobile : TensorFlow on Android をビルドする

TensorFlow : Mobile : TensorFlow on Android をビルドする (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 12/12/2017

* 本ページは、TensorFlow の本家サイトの Mobile – Building TensorFlow on Android を翻訳した上で
適宜、補足説明したものです:

* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

TensorFlow on Android で貴方に作業を始めて頂くために、TensorFlow モバイル・デモをビルドしてそれらを Android デバイス上に配備するための2つの方法を walk through します。最初は Android Studio でこれは貴方に IDE でのビルドと配備を可能にします。2つめはコマンドライン上、Bazel でビルドして ADB で配備します。

何故これらの方法の一つあるいは他方を選択するのでしょうか?

TensorFlow on Android を使用するための最も単純な方法は Android Studio を利用することです。TensorFlow ビルドをカスタマイズする予定が全くないか、あるいはアプリケーションをビルドするために Android Studio エディタや他の特徴を使用することを望み、そして TensorFlow をそれに追加することを望むだけであれば、Android Studio の利用を推奨します。

カスタム ops を使用しているのであれば、あるいは TensorFlow をスクラッチからビルドする何某かの他の理由を持つ場合には、スクロールダウンして Bazel でデモをビルドするための手順を見てください。

 

Android Studio を使用してデモをビルドする

Prerequisites

次の2つのことを (まだであれば) 行ないます :

  • web サイトの手順をフォローして、Android Studio をインストールします。
  • Github から TensorFlow レポジトリをクローンします :
    git clone https://github.com/tensorflow/tensorflow
    

ビルドする

  1. Android Studio を Open して、そして Welcome スクリーンから Open an existing Android Studio project を選択します。
  2. 現れた Open File or Project ウィンドウから、TensorFlow Github レポジトリをクローンしたところからそれがどこでも tensorflow/examples/android ディレクトリへナビゲートして選択します。OK をクリックします。

    Grade Sync を行なうかを聞かれたら、OK をクリックしてください。

    “Failed to find target with hash string ‘android-23’ と類似のエラーを得た場合には、各種プラットフォームとツールをインストールする必要があるかもしれません。

  3. build.gradle ファイル (サイドパネルの 1:Project へ行き Android の下の Gradle Scripts zippy の下で見つけることができます) をオープンします。nativeBuildSystem 変数を探してまだであればそれを none に設定します :
    // set to 'bazel', 'cmake', 'makefile', 'none'
    def nativeBuildSystem = 'none'
    
  4. Run ボタン (グリーンの矢印) をクリックするかトップメニューから Run -> Run ‘android’ を使用します。

    Instant Run を使用するか聞かれたならば、Proceed Without Instant Run をクリックします。

    また、この時点で Android デバイス・プラグインを開発者オプションを有効にして持つことが必要です。開発者デバイスのセットアップについての詳細は こちら を見てください。

これは、総て TensorFlow Demo の一部である3つのアプリケーションを貴方のスマホにインストールします。それらの詳細は後述の「Android サンプル Apps」を見てください。

 

Android Studio を使用して TensorFlow を貴方のアプリケーションに追加する

Android 上で貴方自身のアプリケーションに TensorFlow を追加するためには、最も単純な方法は Gradle ビルドファイルに以下の行を追加することです :

allprojects {
    repositories {
        jcenter()
    }
}

dependencies {
    compile 'org.tensorflow:tensorflow-android:+'
}

これは TensorFlow の最新安定版を AAR (訳注: Android ARchive 形式) として自動的にダウンロードしてそれを貴方のプロジェクトにインストールします。

 

Bazel を使用してデモをビルドする

TensorFlow on Android を使用する他の方法は Bazel を使用して APK (Android Packge Kit 形式) をビルドしてそしてそれを ADB (Android Debug Bridge) を使用してデバイスにロードすることです。これはビルドシステムと Android 開発者ツールの何某かの知識を必要としますが、ここで基本を通してガイドしましょう。

  • 最初に、installing from sources の手順をフォローしてください。これはまた Bazel のインストールと TensorFlow コードのクローンも通してガイドします。
  • まだ持っていないのであれば Android SDKNDK をダウンロードします。少なくとも NDK のバージョン 12b、そして SDK の 23 が必要です。
  • TensorFlow ソースのコピーにおいて、貴方の SDK と NDK の場所で WORKSPACE ファイルを更新します、そこではそれは <PATH_TO_NDK> と <PATH_TO_SDK> で指し示されています。
  • デモ APK をビルドするために Bazel を実行します :
    bazel build -c opt //tensorflow/examples/android:tensorflow_demo
    
  • 貴方のデバイスに APK をインストールするために ADB を使用します :
    adb install -r bazel-bin/tensorflow/examples/android/tensorflow_demo.apk
    

[注意] 一般的には Android のために Bazel でコンパイルする時は Bazel コマンドラインで –config=android が必要です、このケースではこの特定のサンプルは Android-only ですのでここではそれは必要ありませんが。

これは、総て TensorFlow Demo の一部である3つのアプリケーションを貴方のスマホにインストールします。それらの詳細は下の「Android サンプル Apps」を見てください。

 

Android サンプル Apps

Android サンプルコードは、いずれも同じ基本的なコードを使用する、3つのサンプル・アプリケーションをビルドしてインストールする単一のプロジェクトです。サンプル・アプリケーションはいずれもスマホのカメラからビデオ入力を取ります :

  • TF Classify は、指し示される物体に ImageNet からのクラスでラベル付けするために Inception v3 モデルを使用します。Imagenet には 1,000 カテゴリがあるだけです、これは日常的な物体の殆どを漏らしていて現実の生活ではしばしば遭遇することがない多くのものを含んでいます、そのため結果はしばしば非常におもしろいものになるでしょう。例えば ‘person’ カテゴリがありませんので、(person の) 代わりにモデルはそれが知っている物として推測します。シートベルトや酸素マスクのようなしばしば人々の絵に関連付けられるものです。大切にする物体を認識するためにこのサンプルをカスタマイズすることを望む場合には、貴方自身のデータを基にどのようにモデルを訓練するかのためのサンプルとして TensorFlow for Poets codelab が使用できます。
  • TF Detect は、カメラ内の人々の位置の回りにバウンディングボックスを描こうとするために multibox モデルを使用します。これらのボックスは各検出結果の確信で注釈されます。結果は完全ではありません、何故ならばこの類の物体検出は依然として活発な研究トピックであるからです。デモはまたフレーム間で物体が移動するときのための光学的な追跡を含みます、これは TensorFlow 推論よりもより頻繁に動作します。これはユーザ体験を改善します、何故ならば見かけのフレームレートはより高速だからです、しかしそれはまたどのボックスがフレーム間で同じ物体を参照しているか、時間につれて物体をカウントするためにどれが重要であるかを見積もる能力を与えます。
  • TF Stylize は、カメラフィード上のリアルタイムの style transfer (スタイル変換) を実装します。どのスタイル(群)を使用するかを選択してそしてスクリーンのボトムのパレットを使用してそれらの間でミックスでき、そしてまた処理解像度をより高くするか低くするかを切り替えられます。

デモをビルドしてインストールするとき、貴方のスマホ上に3つのアプリケーション・アイコンを見るでしょう、デモのそれぞれのために一つです。それらをタップするとアプリケーションがオープンしてそれらが何をするか探検させてくれます。それらが動作している間にボリュームアップ・ボタンをタップすることでスクリーン上で profiling スタッツを有効にできます。

Android 推論ライブラリ

Android アプリケーションは Java で書かれる必要があり、そしてコア TensorFlow は C++ ですので、TensorFlow は2つの間のインターフェイスとして JNI ライブラリを持ちます。そのインターフェイスは推論のみを目的としていますので、グラフをロードし、入力をセットアップし、そして特定の出力を計算するためにモデルを実行するための機能を提供します。TensorFlowInferenceInterface.java のメソッドの最小限のセットのための完全なドキュメントを見ることができます。

デモ・アプリケーションはこのインターフェイスを使用していますので、サンプルの使用方法を探すためにはよい場所でしょう。事前ビルドされたバイナリ jars は ci.tensorflow.org でダウンロードできます。

 
以上



TensorFlow : Mobile : TensorFlow Mobile へのイントロダクション

TensorFlow : Mobile : TensorFlow Mobile へのイントロダクション (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 12/12/2017

* 本ページは、TensorFlow の本家サイトの Mobile – Introduction to TensorFlow Mobile を翻訳した上で
適宜、補足説明したものです:

* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

TensorFlow は Android と iOS のようなモバイル・プラットフォームのための良い深層学習ソリューションとして当初から設計されました。このモバイル・ガイドはどのように機械学習がモバイル・プラットフォームで動作可能であるか、どのように貴方のモバイル・アプリケーションに効果的に効率的に TensorFlow を統合するかを理解する助けとなるはずです。

 

このガイドについて

このガイドは、デスクトップ環境で成功的に動作している TensorFlow モデルを持ち、それをモバイル・アプリケーションに統合することを望み、そして TensorFlow Lite を利用できない開発者向けに意図しています。
ここにそのプロセスで直面するであろう主な課題があります :

  • モバイルのためにどのように TensorFlow を使用するかを理解する。
  • 貴方のプラットフォームのために TensorFlow をビルドする。
  • TensorFlow ライブラリを貴方のアプリケーションに統合する。
  • モバイル配備のためにモデルファイルを準備する。
  • レイテンシー、RAM 使用、モデルファイル・サイズ、そしてバイナリ・サイズを最適化する。

 

モバイル機械学習のための一般的なユースケース

何故 TensorFlow をモバイルで実行するのでしょう?

伝統的に深層学習はデータセンターと高パワーの GPU マシンの巨大なクラスタと関係付けられてきました。けれどもデバイスがアクセスを持つ総てのデータをネットワーク接続を通して送ることは非常に高コストで時間がかかります。モバイル上の実行は、ネットワーク・ラウンドトリップを待たなければならない時には不可能であった方法で、非常に対話的なアプリケーションを配布することを可能にします。

ここにオンデバイス深層学習のための幾つかの一般的なユースケースがあります :

音声認識

音声駆動インターフェイスとともに構築可能な多くの興味深いアプリケーションがあり、これらの多くはオンデバイス処理を要求します。時間の殆どはユーザはコマンドを与えません、そのためリモートサーバへ音声を連続的にストリーミングすることは帯域の浪費でしょう、何故ならばそれは殆ど静寂かバックグラウンド・ノイズであるはずだからです。この問題を解くためにはオンデバイスで 特定のキーワードを注意深く聞く 小さなニューラルネットワークを持つことが一般的です。一度キーワードを識別したら、もし更なる計算パワーが必要であるならばそれ以上の処理のために残りの会話はサーバに送信することができます。

画像認識

モバイル・アプリケーションにとってカメラ画像の意味を理解できることは非常に有用でしょう。ユーザが写真を撮影しているとき、それらの内部のものを認識することは貴方のカメラ・アプリケーションが適切なフィルタを適用したり、簡単に見つけられるように写真にラベル付けする助けになるでしょう。組み込みアプリケーションについてもまた重要です、何故ならば、それが絶滅の危機にさらされた野性の動物を見分けているにせよ、あるいは 電車がどのくらい遅れて走っているかを報告する にせよ、興味対象の情景の総ての類を検出するために画像センサーを使用できるからです。

TensorFlow には各種の異なる事前訓練されたモデルと共に、画像内の物体の型を認識する幾つかのサンプルが付属していて、それらは総てモバイルデバイス上で実行可能です。事前訓練されたモデルをどのように取り出すか、そして特定の物体を認識することをそれに教えるために何某かの非常に高速で軽量な訓練をどのように実行するか、そしてモバイル上で実行するためにそれをどのように最適化するかを見るために Tensorflow for PoetsTensorflow for Poets 2: Optimize for Mobile codelabs を試すことができます。

物体位置特定

画像の物体が何であるかに加えてどこに物体があるかを知ることは時に重要です。ワイヤレスネットワークを固定する手助けをしたり、風景の特徴の上に情報のオーバーレイを提供するとき、ユーザを正しいコンポーネントに導くような、モバイル・アプリケーションに恩恵を与えるような拡張された現実的なユースケースが数多くあります。組み込みアプリケーションはしばしばそれらを通り過ぎる物体をカウントする必要があります。その物体が作物の害虫であれ、人々であれ、街灯を通り過ぎる車とバイクであれです。

TensorFlow は画像で検出された人々の回りにバウンディングボックスを描くための事前訓練されたモデルを、時間とともにそれらをフォローするための追跡コードと一緒に提供します。その追跡は、そこで時間とともに幾つの物体が存在しているかカウントしようとするアプリケーションにとって特に重要です。何故ならば新しい物体がシーンに入るか離れるときの良いアイデアを与えるからです。
このための Android で利用可能なサンプルコードは GitHub 上 にあります。そしてまた利用可能な より一般的な物体検出モデル もあります。

ジェスチャー認識

画像からでも加速度計のセンサーデータの解析を通した認識でも、アプリケーションを手や他のジェスチャーで制御することが可能であれば有用です。これらのモデルの作成はこのガイドの範囲を越えますが、TensorFlow はこれらを配備する効果的な方法です。

光学文字認識

Google Translate のライブカメラ・ビューは、対話的なオンデバイス・テキスト検出がどのように効果的でありうるかの優れたサンプルです。

画像でテキストを認識することに伴う複数のステップがあります。最初にテキストが存在する領域を識別しなければなりません、これは物体位置特定問題のバリエーションで、そして類似のテクニックで解くことができます。テキスト領域を得たのであれば、次にそれを文字として解釈する必要があり、そしてどのような単語を表しているか推測する助けとするために言語モデルを使用します。どの文字が存在するかを推定する最も単純な方法はテキスト行を個々の文字にセグメントして、そしてそれから各バウンディングボックスに単純なニューラルネットワークを適用します。MNIST のために使用されるモデルのようなもので良い結果を得ることができます。それは TensorFlow チュートリアルで見つけることができますが、より高い解像度の入力を望むかもしれません。より進んだ他の選択肢は、テキスト行全体を一度に処理するために LSTM モデルを使用することで、モデル自身が分割を異なるキャラクタに処理するものです。

翻訳

ネットワーク接続がない場合でさえも、一つの言語から他の言語へ迅速に正確に翻訳することは重要なユースケースです。深層学習はこの類のタスクに非常に効果的で、文献で多くの異なるモデルの記述を見出すでしょう。しばしばこれらは sequence-to-sequence リカレントモデルでそこでは翻訳全体を行なうために別々の解析ステージを実行する必要なしに単一のグラフを実行することができます。

テキスト分類

ユーザがタイプしているあるいは読んでいるものを基にしてユーザに関連するプロンプトを提示することを望むのであれば、テキストの意味を理解することは非常に有用でしょう。ここにテキスト分類が登場します。テキスト分類はセンチメント分析からトピック発見まで総てをカバーする総称です。適用したい貴方自身のカテゴリやラベルを持つ可能性が高いでしょうから、始めるにベストの場所は Skip-Thoughts のようなサンプルで、それから貴方自身のサンプル上で訓練します。

音声合成

合成音声はユーザへのフィードバックやアクセスの補助の良い方法でありえます、そして WaveNet のような最近の進歩は深層学習が非常に自然な音声を提供できることを示しています。

 

モバイル機械学習とクラウド

ユースケースのこれらのサンプルは、オンデバイス・ネットワークがクラウド・サービスをどのように補完できるかのアイデアを与えます。クラウドは制御された環境で大量の計算パワーを持ちますが、しかしデバイス上の実行はより高い相互作用性 (会話性) を与えることができます。クラウドが利用可能でないかクラウドのキャパシティが制限されている状況では、オフラインの体験を提供できます、あるいは簡単なケースではデバイス上で処理することによりクラウド・ワークロードを削減できます。

オンデバイス計算を行うことはまたクラウド上の作業へスイッチする時がきたら信号を送ることができます。これの良い例は音声のホットワード検出です。デバイスはキーワードを絶え間なく注意して聞くことが可能なので、ある一つが認識された時にはこれがクラウド・ベースの音声認識への多くのトラフィックのトリガーとなります。オンデバイス・コンポーネントなしでは、このアプリケーション全体は上手く動作しないでしょう。そしてこのパターンは幾つかの他のアプリケーションに渡ってもまた存在します。何某かのセンサー入力の認識は十分に興味深いです、というのは更なる処理は多くの興味深い製品を可能にするからです。

 

どのようなハードウェアとソフトウェアを貴方は持つべきでしょう?

TensorFlow は Ubuntu Linux, Windows 10, そして OS X 上で動作します。総てのサポートされるオペレーティング・システムのリストと TensorFlow をインストールするための手順については、Installing Tensorflow を見てください。

Mobile TensorFlow のために提供しているサンプルコードの幾つかは TensorFlow をソースからコンパイルすることを要求しますので、そのため総てのサンプルコードを通すためには単なる pip install 以上のものを必要とすることに注意してください。

モバイル・サンプルを試すためには、Android Studio か、iOS のために開発しているのであれば XCode を使用して開発のためのデバイス・セットアップが必要でしょう。

 

始める前に何をするべきでしょうか?

モバイル上で貴方のソリューションをどのように得るかを考える前に :

  1. モバイル機械学習で貴方の問題が解決可能か決定します。
  2. 貴方の問題を定義するためにラベル付けされたデータセットを作成します。
  3. 問題に対する効果的なモデルを選択します。

これらを以下で詳細に議論します。

貴方の問題はモバイル機械学習で解決可能でしょうか?

解決することを望む問題のアイデアを持つのであれば、ソリューションをどのように構築するか計画を作成ことが必要です。最も重要な最初のステップは、貴方の問題が実際に解決可能であるかを確かなものにすることで、それを行なうための最善の方法は (手続きの) ループ内で人間を使ってそれを真似てみることです。

例えば、もしロボット・トイカーを音声コマンドを使用して駆動することを望む場合、デバイスから何某かの音声をレコードしてみて話されたことが意味をなしているかを見るためにそれを聴き直してください。 しばしばモーターが音声をかき消していたりあるいは少し離れて聞き取ることができないような、捕捉プロセスで問題があることを見出すでしょう。モデリング・プロセスを探求する前にこれらの問題に対応すべきです。

他の例は、貴方のアプリケーションで撮られた写真を人々に与えてみて貴方が求めている方法でそれらの中にあるものを分類できるか確認します。もし彼らがそれをできないならば (例えば写真から食べ物のカロリーを見積もろうとすることはできないでしょう、何故ならば総てのホワイトスープは同じに見えるからです)、それに対処するために貴方の知見を再設計する必要があるでしょう。良い経験則として、もし人間がタスクを上手く処理できないのであれば、より上手くやるためにコンピュータを訓練することは困難でしょう。

ラベル付けされたデータセットを作成します

貴方のユースケースで基本的な問題を解決した後には、貴方がどのような問題を解決しようとしているかを定義するためにラベル付けされたデータセットを作成することが必要です。このステップは極めて重要です、どのモデルを使用するかを選択するよりもです。それに実際のユースケースの可能な限り典型的であることを望みます、何故ならばモデルは貴方がそれに教えたタスクでのみ効果的であるからです。データへのラベル付けを可能な限り効率的そして正確にするツールに (時間やコストを) 投資することもまた価値があります。例えば、もし web インターフェイス上のボタンをクリックしなければならないことから単純なキーボード・ショートカットへ切り替えることができれば、生成プロセスを多大にスピードアップすることができるかもしれません。貴方はまた初期のラベリングを貴方自身で行なうことから始めるべきです、そうすれば難しさやありがちなエラーについて学ぶことができて、そしてそれらを回避するためにラベリングあるいはデータ捕捉プロセスを多分変更できるでしょう。ひとたび貴方と貴方のチームが矛盾なくサンプルにラベル付けできたのであれば(i.e. ひとたび殆どのサンプルについて同じラベルで一般的に合意するならば)、次に、貴方の知識をマニュアルにして捕捉してそして外部の評価者にどのように同じプロセスを実行するかを教えることができます。

効果的なモデルを選択します

次のステップは使用する効果的なモデルを選択することです。もし他の誰かが既に貴方が必要なものに類似したモデルを実装していたならば、スクラッチからモデルを訓練することを回避することができるかもしれません ; 私たちは TensorFlow で実装されたモデルのレポジトリを GitHub 上 に持っていて、それは貴方が通して見ることができます。見つけられる最も単純なモデルを頼ってください、そしてラベル付けされたデータの小さな総量でも持てたらすぐに始めてみてください、何故ならば迅速に反復できるときに最善の結果を得られるはずだからです。モデルを訓練して実際のアプリケーションでそれを実行しようとすることにかかる時間が短いほどより良い全体の結果を見るでしょう。アルゴリズムにとって優れた “訓練”” 精度を得てもしかし実際のアプリケーション内で有用であることに失敗することは珍しくありません。何故ならばデータセットと実際の利用の間には不適合があるからです。首尾一貫したユーザ体験を作成するための end-to-end な利用方法をできる限り早くプロトタイプしてください。

 

Next Steps

AndroidiOS のための私たちのデモの一つをビルドすることから始めることを提案します。

 

以上

TensorFlow : Mobile : TensorFlow Lite へのイントロダクション

TensorFlow : Mobile : TensorFlow Lite へのイントロダクション (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 12/10/2017

* 本ページは、TensorFlow の本家サイトの Mobile – Introduction to TensorFlow Lite を翻訳した上で
適宜、補足説明したものです:

* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

TensorFlow Lite はモバイルと組み込みデバイスのための TensorFlow の軽量ソリューションです。
それは低レイテンシーと小さなバイナリ・サイズで、モバイル機械学習推論を可能にします。
TensorFlow Lite はまた Android Neural Networks API によりハードウェアアクセラレーションもサポートします

TensorFlow Lite は低レイテンシーの獲得のために多くのテクニックを使用します。それはモバイル・アプリのためのカーネルの最適化、事前融合 (pre-fused) された活性化、そして量子化されたカーネルのようなテクニックで、より小さく高速な (固定小数点数学) モデルを可能にします。

TensorFlow Lite ドキュメントの多くは当面は GitHub 上 にあります。

 

TensorFlow Lite は何を含みますか?

TensorFlow Lite は、モバイル・プラットフォームのために調整された、量子化されかつ浮動小数点であるコア演算子のセットをサポートします。それらは性能と量子化された精度を更に拡張するために事前融合された活性化とバイアスを組み込みます。更に、TensorFlow Lite はモデルのカスタム演算を使用することもまたサポートします。

TensorFlow Lite は FlatBuffers に基づく新しいモデルファイルフォーマットを定義します。FlatBuffers はオープンソースの、効率的なクロスプラットフォームのシリアライゼーション・ライブラリです。それは protocol buffers に似ていますが、主な違いは、オブジェクト毎のメモリ割当てとしばしば結合した、データにアクセス可能になる前に FlatBuffers は二次表現への解析/アンパックステップを必要としないことです。また、FlatBuffers のコード・フットプリント (メモリ消費量) は protocol buffers よりも一桁小さいです。

TensorFlow Lite はモバイルに最適化された新しいインタプリタを持ち、これはアプリケーションをスリムで高速に保持するというキーとなる目標を持ちます。インタプリタは最小限のロード、初期化、そして実行遅延を確かなものにするために、静的グラフ順序付け (= graph ordering) とカスタム・メモリアロケーターを使用します。

TensorFlow Lite は、デバイス上で利用可能であれば、ハードウェア・アクセラレーションを利用するためのインターフェイスを提供します。Android O-MR1 の一部としてリリースされた、Android Neural Networks ライブラリを通してそれを行います。

 

新しいモバイル固有ライブラリが何故必要なのでしょう?

機械学習は計算パラダイムを変えています、そしてモバイルと組み込みデバイス上で新しいユースケースの新興のトレンドを見ています。消費者の期待もまた、カメラと音声相互作用モデルにより駆動される、彼らのデバイスとの自然で人間のような相互作用へと傾いています。

この領域の興味を煽っている幾つかの要因があります :

  • シリコン層の革新はハードウェア・アクセラレーションの新しい可能性を可能にし、Android Neural Networks API のようなフレームワークがそれらを活用することを容易にしています。
  • リアルタイム・コンピュータビジョンと音声言語理解における最近の進歩はモバイルに最適化されたベンチマーク・モデル (e.g. MobileNet, SqueezeNet) のオープンソース化につながっています。
  • 広く利用可能なスマート家電がオンデバイス・インテリジェンスのための新しい可能性を作ります。
  • より強固なユーザデータのプライバシーのためのパラダイムへの興味、そこではユーザデータはモバイルデバイスを離れる必要がありません。
  • 「オフライン」ユースケースにサーブする能力、そこではデバイスはネットワークに接続される必要がありません。

私たちは機械学習アプリケーションの次の波はモバイルと組み込みデバイス上で意義のある処理を持つことであると信じます。

 

TensorFlow Lite developer preview ハイライト

TensorFlow Lite は developer preview として利用可能で以下を含みます :

  • 量子化されかつ浮動小数点のコア演算子のセット、それらの多くはモバイル・プラットフォームのために調整されています。これらはカスタム・モデルを作成して実行するために利用可能です。開発者は自身のカスタム演算子を書き、そしてそれらをモデルで使用することもできます。
  • FlatBuffers ベースの新しいモデル・ファイルフォーマット。
  • モバイル上でより高速な実行のために最適化されたカーネルを持つオンデバイス・インタプリタ。
  • TensorFlow で訓練されたモデルを TensorFlow Lite フォーマットに変換するための TensorFlow コンバータ。
  • より小さいサイズ: 総てのサポートされる演算子がリンクされるとき TensorFlow Lite は 300 KB より小さく、InceptionV3 と Mobilenet をサポートするために必要な演算子のみを使用するときには 200 KB よりも少ないです。
  • テスト済みモデル :
    次のモデルの総ては動作することが保証されてすぐに使用できます :

    • Inception V3、画像に存在する有力なオブジェクトを検知するためのポピュラーなモデルです。
    • MobileNet、オンデバイスや組み込みアプリケーションのための制限されたリソースに配慮しながら、効率的に精度を最大化するために設計されたモバイルファーストなコンピュータ・ビジョン・モデルのファミリーです。それらは、様々なユースケースのリソース制約に適合するためにパラメータ化された、小さく、低レイテンシーな、低消費電力モデルです。MobileNet モデルは Inception V3 よりも小さくしかし 精度がより低い です。
    • On Device Smart Reply、文脈的に関連するメッセージを提案することにより受信したテキスト・メッセージのためのワンタッチな返信を提供するオンデバイス・モデルです。モデルは時計やスマホのようなメモリ制約のあるデバイスのために特に構築されていて、Android Wear 上の Smart Replies を総ての first-party と third-party アプリケーションへと舗装するために成功的に使用されています。
  • MobileNet モデルの量子化されたバージョン、これは非量子化 (浮動小数点) バージョンよりもより高速に動作します。
  • 物体分類のための量子化された MobileNet モデルによる TensorFlow Lite の利用を示すための新しい Android デモアプリケーション。
  • Java と C++ API サポート。

[注意] これは開発者リリースで、来たるバージョンでは API の変更があるかもしれません。
このリリースとの後方あるいは前方互換性は保証しません。

 

Getting Started

上で示された事前テストされたモデルで TensorFlow Lite を試すことをお勧めします。
既存のモデルを持つのであれば、モデルがコンバータとサポートされる演算子セットの両者と互換であるかをテストする必要があります。モデルをテストするためには、GitHub 上のドキュメント を見てください。

カスタム・データセットのために Inception-V3 あるいは MobileNet を再訓練する

上で言及した事前訓練されたモデルは、事前定義された 1000 クラスから成る ImageNet データセット上で訓練されています。これらのクラスが貴方のユースケースにとって関連がないか有用でないのであれば、それらのモデルを再訓練する必要があるでしょう。このテクニックは転移学習と呼ばれ、これはある問題について既に訓練されたモデルから始めて、そしてそれは類似の問題について再訓練されます。スクラッチからの深層学習は数日かかりますが、転移学習はかなり迅速に完了できます。これを行なうためには、関連するクラスでラベル付けされたカスタム・データセットを生成する必要があります。

TensorFlow for Poets codelab はこのプロセスを一歩ずつ歩き通します。再訓練コードは浮動小数点と量子化された推論の両者のための再訓練をサポートします。

 

TensorFlow Lite アーキテクチャ

次のダイアグラムは TensorFlow Lite のアーキテクチャ的なデザインを示します :

 
ディスク上の訓練済みの TensorFlow モデルから始めて、TensorFlow Lite コンバータを使用してそのモデルを TensorFlow Lite ファイルフォーマット (.tflite) に変換します。 それから貴方のモバイル・アプリケーションでその変換されたファイルが使用できます。

TensorFlow Lite モデルファイルの配備には以下を使用します :

  • Java API: Android 上 C++ API 回りの便利なラッパーです。
  • C++ API: TensorFlow Lite モデルファイルをロードしてインタプリタを起動します。Android と iOS の両者で同じライブラリが利用可能です。
  • インタプリタ: カーネルのセットを使用してモデルを実行します。インタプリタは選択的カーネル・ローディング (= selective kernel loading) をサポートします; カーネルなしではそれは 100 KB だけで、そして総てのカーネルをロードすると 300 KB です。TensorFlow Mobile により必要とされる 1.5 M から意義深い削減です。
  • Android デバイスの選択においては、ハードウェア・アクセラレーションのためにインタプリタは Android Neural Networks API を使用し、利用できるものがない場合にはデフォルトで CPU 実行を選択します。

インタプリタにより使用可能な C++ API を利用してカスタムカーネルを実装することもできます。

 

Future Work

将来のリリースでは、TensorFlow Lite は更なるモデルと組み込み演算子をサポートし、固定小数点と浮動小数点モデルの両者のための性能改善、開発者ワークフローを容易にするツールの改善そして他のより小さなデバイスのためのサポート等々を含むでしょう。(私たちが) 開発を続けるにつれて、TensorFlow Lite が小さなデバイスのためのモデルを対象とした開発者の経験を大きく単純化することを望んでいます。

将来の計画は、特定のデバイス上の特定のモデルのために最善の可能な性能を得るために特殊な機械学習ハードウェアを使用することを含みます。

 

Next Steps

developer プレビューについては、ドキュメントの殆どは GitHub 上にあります。
更なる情報とコードサンプル、デモ・アプリケーション等については GitHub 上の TensorFlow Lite レポジトリ を見てください。

 

以上

AI導入支援 #2 ウェビナー

スモールスタートを可能としたAI導入支援   Vol.2
[無料 WEB セミナー] [詳細]
「画像認識 AI PoC スターターパック」の紹介
既に AI 技術を実ビジネスで活用し、成果を上げている日本企業も多く存在しており、競争優位なビジネスを展開しております。
しかしながら AI を導入したくとも PoC (概念実証) だけでも高額な費用がかかり取組めていない企業も少なくないようです。A I導入時には欠かせない PoC を手軽にしかも短期間で認知度を確認可能とするサービの紹介と共に、AI 技術の特性と具体的な導入プロセスに加え運用時のポイントについても解説いたします。
日時:2021年10月13日(水)
会場:WEBセミナー
共催:クラスキャット、日本FLOW(株)
後援:働き方改革推進コンソーシアム
参加費: 無料 (事前登録制)
人工知能開発支援
◆ クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com