一、背景
1.1のAoEは何ですか
AoE(エッジ上のAI)は、AIが統合ランタイム環境(IRE)のビットオープンソース端末側です。深学習アルゴリズムを開発者が簡単にターミナル効率的な実行に配備さの異なるフレームを支援する設計原理として「安定性、使いやすさ、安全保障」に、Githubのアドレスです https://github.com/didi/aoe
なぜので、AIの端末統合フレームワークを実行しているときに実行するには、2つがあります。
まず、人工知能の急速な発展に伴い、過去2年間が開発者に多くの選択肢を与えて、推論の枠組みを実行している多くの端末となって、だけでなく、ターミナルAIを展開するためのコストを増大させています。
第二に、AI推論フレームワークプロセスによる直接のアクセスがよりどのように安定性の問題を保護するために、動的ライブラリへのアクセス、リソースの読み込み、前処理と後処理、リソースの解放、モデルのアップグレード、およびを含む、複雑な。
現在のAoE SDKは、銀行カードの使用OCRの滴で使用されてきた、より明確に考えるのAoEと推論の枠組みとの関係を理解し、ホストアプリケーションは、それを理解するために、ビジネスの次の図によって統合することができます。
ターミナルフレーム推論の1.2一覧
以下(アルファベット順)主流推論フレームワーク端末走行の8種類です。
いいえ。 | 名前 | 開発者 | オープンソースの時間 | 説明 |
---|---|---|---|---|
1 | TensorFlow Liteの | グーグル | 2017 | TensorFlow Liteは、デフォルトCPUによって呼び出されたAndroidのニューラルネットワークのAPIを使用して、最新バージョンは、GPUをサポートしています。 |
2 | コアML | 林檎 | 2017 | iOS11エンドのモバイルマシン学習加速の使用を基礎となるフレームワークと金属との同時発売WWDCアップル社のコアML 2017は、CPUとGPUを呼んでいます。コアMLあなたは、コアMLモデルに訓練されたモデルが必要になります |
3 | Caffe2 | フェイスブック | 2017 | Caffe2は一つにトレーニングと推論である2017年にリリースさ枠組みをFacebookやクロスプラットフォームは、WindowsやLinux、MacOSの3つのデスクトップシステムをサポートしていますが、またモバイル最後のiOSをサポートするだけでなく、Androidの、言うことができます。 |
4 | NCNN | テンセント | 2017 | C ++の実装を使用してNCNN 2017テンセント優れたマップモバイルラボエンドオープンソースのフレームワークは、AndroidとiOSの2つのプラットフォームをサポートしています。 |
5 | パドルモバイル | Baiduの | 2017 | パドル-Mobileは、モバイル-深い学習(MDL)と呼ばれるBaiduのPaddlePaddle組織の枠組みの下で2017年のオープン・ソース・エンドのモバイル深度研究です。サポートAndroidとiOSプラットフォーム、CPUとGPUの使用は、定量的なツールを提供しています。 |
6 | QNNPACK | フェイスブック | 2018 | FacebookのQNNPACKは、コンピューティング、電話、ニューラルネットワークの終わりを加速するために使用量子化ニューラルネットワークのパッケージを、立って、2018 INT8低い量子化精度、高性能のオープンソースフレームワークでリリースされ、それがCaffe2年で直接使用することができ、PyTorch 1.0に統合されています。 |
7 | メース | 粟 | 2018 | MACEは、基本的な演算子としてコンパイルとOpenCLのための世界サミットオープンソース中国オープンソースのフレームワークにおけるオープンソース運動の終了を発表したフレームの様々をサポートしながら、異種の加速が簡単に、異なるハードウェアモデル上で実行することができます提供キビ2018ですモデル変換。 |
8 | MNN | アリババ | 2019 | 2019アリMNN第三者コンピューティング・ベースに依存しない、モバイル端末のためのオープンソースのフレームワークであり、コンパイルを使用コア操作、支持Tensorflow、カフェ、ONNX他の主流のモデルファイルフォーマット、CNN、RNN、GaN及び他の一般的なネットワークのためのサポートを含みます。 |
推論の枠組みの様々なサポートするためにどのように1.3のAoE
本質的には、必ずしもこれらの抽象的な推論、以下の5つのプロセスが含まれているどのような推論の枠組み、関係なくは、AoEを支援体制を推論のすべての種類の基礎です。
現在、AoEをはLiteは、フレームワークNCNNとTensorFlowを推論の2種類をサポートし、推論の枠組みの両方で、例えば、彼らの推論の枠組みの中で5の形で推論過程を説明するために実現しました。
推論の枠組み | 最初の | 前処理 | 実行推論 | アフタートリートメント | リソースを解放 |
---|---|---|---|---|---|
NCNN | INT load_param(CONSTはunsigned char * MEM); INT load_model(CONSTはunsigned char * MEM)。 | ... | INT入力(CONSTのchar * blob_name、マットのconst&中); INTエキス(CONSTチャー* blob_name、マット&偉業)。 | ... | 空のリリース(); |
TFライト | 公共通訳(@NonNullのByteBufferのByteBuffer、Interpreter.Optionsオプション) | ... | ます。public void実行(オブジェクトの入力、オブジェクトの出力) | ... | 公共空に近いです(); |
1.4どのプラットフォームのAoEをサポート
現在、AoEをがされているオープンソースのランタイム環境のSDKは、Linuxプラットフォームのランタイム環境に加えて、AndroidとiOSのプラットフォームが含まれており、SDKが正式にお会いしました。
第二に、原則
2.1抽象的推論プロセスフレームワーク
すでに述べたように、異なる推論フレームワークは、彼らは、前処理の開始時、実行推理、後処理、リリース資源であり、一般的なプロセスが含まれています。AoEをは動作環境を統合するために、基本的な操作が反転デザインを依存することにより、抽象的推論である、ビジネスは、実装のためのアクセス、特定の推論の枠組みを気にすることなく、抽象化のAoEの上層にのみ依存します。この設計の最大の利点は、開発者が常に完全に切り離さを開発するので、ビジネスの発展とのAoE SDKことを、達成するためのフレームワークを変更することなく、推論のための新たな枠組みを追加できるということです。
AoEをSDKでこの抽象およびコンバータ(推論およびリソースの解放を行うの初期モデルのためのプロセスを作るために使用)(モデル入力及びモデル出力前処理の後処理のために)、InterpreterComponentの特定の実装は次の通りれるInterpreterComponentあります。
/ ** *翻訳成分モデル * / 界面InterpreterComponent <TInput、TOutput>コンポーネント{延び / ** モデルリソースローディングフレーム推論、*初期化を * 結合サービスと* @paramコンテキストコンテキスト * @param modelOptionsモデル構成リストを * @return推論ローディング枠 * / ブールINIT(@NonNullコンテキスト・コンテキスト、@NonNullリスト<AoeModelOption> modelOptions); / ** *操作推論を行う * * @param入力入力データトラフィック * @returnサービス出力データ * / @Nullable TOutput RUN(@NonNull TInput INPUT); / ** *リソース解放 * / 無効解放(); / ** *モデルが正常に完了したロードされています * 真の* @Return、正しいローディングモデル * / ブールisReady(); }
次のようにコンバータの具体的な実装は、次のとおりです。
変換器インターフェース<TInput、TOutput、TModelInput、TModelOutput> { / ** *入力データモデルに、入力データを前処理データ * * @param入力入力データトラフィック * @returnモデル入力データ * / @Nullable TModelInput前処理(@ INPUT TInputギブ非NULLに); / ** *処理後、サービスモデル出力の出力データに変換 * * @param modelOutputモデル出力データ * @return * / @Nullable TOutput後処理(@Nullable TModelOutput modelOutput); }
2.2保証の安定性
我々はすべて知っているように、重要な問題は、アプリケーションが上記のモデルでクラッシュした後、特にシーンの多数のネイティブ動作モデル適応の問題を含むものは、特に重要である、Androidプラットフォームの開発モデルの適応で、ダメージは巨大な経験です原因A。ユーザーに競合製品に切り替え3、理由はパフォーマンスの問題のため、モバイルアプリの損失が毎日のアクティブユーザーは、もはやアプリケーションを使用して、ユーザーの60%は黙秘することを選んだ、5%のため、これらのユーザーの損失を計上しない、というデータショー、ユーザーの残りの部分直接アンインストールするアプリケーション。そのため、モバイルアプリケーションの大規模なユーザーベースのため、いつでもアプリケーションの可用性は最も基本的なの主な流れ、最も重要なことであることを確認します。ビューのAI推論プロセスポイントと組み合わせることで、必然的に、多くのアクションがあるだろうただの憶測を、ネイティブプロセスで行われていない、いくつかの前処理と資源回収操作はまた、互換性の問題になりやすいですがあります。推論の安定性を確保しながら、この目的を達成するために、AoEをランタイム環境SDKは、別のプロセスで実行するネイティブ操作のためのAndroidプラットフォームのためのメカニズムの独立したプロセスを開発するために、メインプロセス(偶然のクラッシュは、その後の推論の操作には影響しません)安定性(任意の時点でメインプロセスがクラッシュしません)。
登録された独立したプロセス、異常な再結合プロセスとプロセス間通信の最適化:特定の実装プロセスは、3つの主要なコンポーネントを有しています。
次のように最初の部分、独立した登録処理、マニフェストRemoteServiceアセンブリコードの増加です。
<アプリケーション> <サービスが アンドロイド:名= "AoeProcessService。" アンドロイド:= "false"をエクスポート プロセス=:アンドロイド":aoeProcessor" /> </アプリケーション>
見つかったRemoteServiceが終了した場合第二の部分は、例外は、推論では、「bindService()」メソッド、再起動RemoteServiceの実装を独立プロセスを再バインドします。
@Override 公共の実行オブジェクト(オブジェクト@NonNull入力){ IF(isServiceRunning()){ ... //行う推論を(コードが示されている) 他{} bindService(); //独立再開プロセス } 戻りヌル; }
、最大の問題でプロセス間通信は、時間のかかる損失第三部、クロスプロセス通信の最適化、独立プロセスので、必ずしもクロスプロセス通信を必要とするで、ここでは、2つの要因があり、時間がかかるの損失に貢献しました。
- 送信時間がかかります
- シリアライズ/デシリアライズ時間がかかります
かかる送信時間に比べて機構バインダーの使用は、シリアライズ/デシリアライズは、消費全体の通信時間の90%以上を占めました。従って、最適化のシリアライズ/デシリアライズは、クロスプロセス通信優先度を最適化することです。
現在主流のシリアライズ/デシリアライズツールを比較すると、最終的な使用のAoEをは動作環境kryoライブラリシリアライズ/デシリアライズを統合しました。 以下は、結果の比較、データ参照oschinaの記事で、「さまざまなJavaのシリアライズライブラリの性能比較テストの結果。」
三、MNIST統合例
TensorFlowLiteInterpreterの継承の3.1
当我们要接入一个新的模型时,首先要确定的是这个模型运行在哪一个推理框架上,然后继承这个推理框架的InterpreterComponent实现,完成具体的业务流程。MNIST是运行在TF Lite框架上的模型,因此,**我们实现AoE的TF Lite的Interpreter抽象类,将输入数据转成模型的输入,再从模型的输出读取业务需要的数据。**初使化、推理执行和资源回收沿用TensorFlowLiteInterpreter的默认实现。
public class MnistInterpreter extends TensorFlowLiteInterpreter<float[], Integer, float[], float[][]> { @Nullable @Override public float[] preProcess(@NonNull float[] input) { return input; } @Nullable @Override public Integer postProcess(@Nullable float[][] modelOutput) { if (modelOutput != null && modelOutput.length == 1) { for (int i = 0; i < modelOutput[0].length; i++) { if (Float.compare(modelOutput[0][i], 1f) == 0) { return i; } } } return null; } }
3.2 运行时环境配置
接入MNIST的第二个步骤是配置推理框架类型和模型相关参数,代码如下:
mClient = new AoeClient(requireContext(), "mnist", new AoeClient.Options() .setInterpreter(MnistInterpreter.class)/* .useRemoteService(false)*/, "mnist");
3.3 推理执行
以下是MINST初使化推理框架、推理执行和资源回收的实现:
//初使化推理框架 int resultCode = mClient.init(); //推理执行 Object result = mClient.process(mSketchModel.getPixelData()); if (result instanceof Integer) { int num = (int) result; Log.d(TAG, "num: " + num); mResultTextView.setText((num == -1) ? "Not recognized." : String.valueOf(num)); } //资源回收 if (mClient != null) { mClient.release(); }
第四には、私たちに参加します
ターミナルでのヘルプAI着陸、オープンソースのAoEは、オペレーティング環境を統合のうち、最初のステップです!将来、より多くの推論の枠組みをサポートする端末の開発を提供する多くの有用な性質を提供し、目標の私たちの揺るぎない追求です。あなた場合は、AI、端末運用環境への思いを持って質問がある場合は、このプロジェクトを使用してに興味があるなら、私たちは私たちに参加することを勧めます。