SHOTech Blog

プログラミングに関する記録です

【de:code2018 AC11】 Windows Machine Learning(ML)開発入門

f:id:syota-y1989:20180529021120j:plain

de:code2018のAI系のセッションの中で聞きたかったセッションの一つです。

満席で立ち見が出るほど人気でしたので、会場に入れてよかったです。

 

機械学習は現在オフライン環境・オンデバイスでの推論がホットです。

このwindowsMLはそれを可能とする機能になります。今年の4月に発表されたばかりのものです。

 

f:id:syota-y1989:20180529021131j:plain

こちらがこのセッションの目標兼アジェンダです。

 

f:id:syota-y1989:20180529021217j:plain

AzureのMachine Learningなどもそうですが、クラウド上で学習・推論する機械学習のアプリケーションにはいくつか問題点があります。

  • 通信に時間がかかる
  • クラウドの利用コストがかかる
  • ネットワークに動作が依存する

そもそもがネットワークが弱い環境やオフラインの環境では使用することができませんし、クラウドのサービスを常にアクティブな状態にしておく必要があるので利用コストが常に発生します。一度クラウドを通すため処理も時間がかかってしまいます。

 

f:id:syota-y1989:20180529021239j:plain

この問題点を解決する一つの方法としてwindowsMLが発表されました。

という点がポイントです。

学習させてモデルを作成するのはさすがにデバイス側では限界がありますので、ここはクラウド上で処理を行います。

その後、学習して出来上がったモデルをエクスポートして、端末側で推論を行います。

このやり方だと、学習が終わったクラウドの環境は不要になるので、クラウドの利用コストは安価で済みますし、モデルはデバイス側にあるので、推論はオフライン環境でも可能です。推論にネットワークを使わないので処理も早いです。

 

f:id:syota-y1989:20180529021458j:plain

例えば、犬か猫を判断させたいアプリケーションの場合、判断したい画像と学習済みモデルを与えればOKです。

windowsMLはOSの機能の一つとして提供されています。このエンジンは汎用的に作られています。アプリケーションを作成する際、学習済みモデルをプロジェクトに組み込むと、自動的にラッパークラスが作成され、windowsMLとのかけ橋になってくれます。

 

f:id:syota-y1989:20180529021617j:plain

これはwindowsMLのアーキテクチャです。よく新技術の発表の場で使われるおなじみのものですね。はっきり言ってわかり辛いです。

f:id:syota-y1989:20180529021640j:plain

先ほどのアーキテクチャをもう少し簡単に説明したものがこちらの写真です。

開発者は学習済みモデルを組み込むことで自動生成されるラッパークラスが、windowsMLのAPIをキックします。

APIからキックされた推論のエンジンは、計算して結果をラッパークラスに返します。

このとき、今までであれば、推論に使うリソースによって実装を変える必要がありました。GPUを使う場合はGPU用のロジックやSDKを使用する必要があったし、CPUを使用する場合は同じように専用のロジックやSDKが必要でした。

windowsMLは推論エンジンが最適なパフォーマンスを自動で判断し、必要なリソースを選択して処理を行ってくれます。ユーザはリソースに応じた専用のSDKを使用して開発する必要がなくなりました。

 

f:id:syota-y1989:20180529021743j:plain

学習済みモデルはCognitive Service等で学習させて作成したモデルをONNXファイルとしてエクスポートしVSに取り込めばOKです。

 

f:id:syota-y1989:20180529021834j:plain

windowsMLを使用する要件としては「最新のものを使う」ということだけ。

ただし、Win10 April 2018 Updateは会社によっては未評価でアップデート禁止なっているところもあるかと思いますので、事前に確認が必要そうです。

 

f:id:syota-y1989:20180529021944j:plain

先ほど、学習済みモデルをONNXファイルとして取り込めば、ラッパークラスが自動生成されると書きましたが、実際にはこのようにVS上で「Assets」配下にインポートすると、このように「model.cs」というファイルが自動で生成されます。

f:id:syota-y1989:20180529022006j:plain

もちろん、コマンドラインでやることも可能です。私はUIでポチポチやる派なので、この方法はあまり使うことはなさそうです。

 

f:id:syota-y1989:20180529022214j:plain

自動生成されるラッパークラスはこの3つです。

  • モデルの読み込みと推論を行うクラス
  • インプット情報を渡すクラス
  • 推論結果を出力するクラス

f:id:syota-y1989:20180529022254j:plain

手書き文字判断の場合の入力クラスはこのような形です。

 

f:id:syota-y1989:20180529022329j:plain

同様に出力はこれ。手書き文字の場合0~9の要素が配列になっているため、

どの数字なのかは出力されたリストの要素のスコアを見て判断します。

f:id:syota-y1989:20180529022408j:plain

ここで注意するのは、自動生成されるラッパークラスは取り込むモデルによって異なるという点です。どのようなクラスが生成されているのかはしっかり確認する必要がありそうです。

f:id:syota-y1989:20180529022510j:plain

では実際に推論を行うのに必要な実装はというと、この3ステップです。

  1. モデルをロードする
  2. 入力を設定する
  3. 推論を実行する

f:id:syota-y1989:20180529022541j:plain

f:id:syota-y1989:20180529022611j:plain

f:id:syota-y1989:20180529022632j:plain

これは手書き文字認識の例ですが、このように非常に短いコードで実現することが可能です。

このMNISTのサンプルコードはネット上に公開されているようなのでそのうち動かしてみたいと思います。

 

github.com