毎日 12 時に出勤し、ガールフレンドと過ごすために定時に退勤するプログラマーである私が、なぜいつも残業するのでしょうか。 !

毎日 12 時に出勤し、ガールフレンドと過ごすために定時に退勤するプログラマーである私が、なぜいつも残業するのでしょうか。 !

社内で髪の多いプログラマートップ3の1人として、私はいつも髪に頼って残業しています。若い人たち、なぜ残業しないの?と自分に問いかけています。私はガールフレンドはいませんが

しかし、私はコードを持っています。

[[283573]]

でも、私が理解できないのは、隣の職場で働いている男性が私より遅く出勤し、私より早く退勤することです。彼は毎日彼女を迎えに定時に退勤し、いい仕事をしているようです。もちろん、彼の髪もかなりきれいです。私より年上に見えること以外に、彼には何か勝つための秘訣があるのだろうか?昼休みに、1週間分のコーヒーを費やして、私は彼の勝つための秘訣を学んだ。

その秘密がわかれば、仕事でも恋愛でも成功できるかもしれない。

NCNNを直接統合することのデメリット

NCNNを直接統合して、老若男女を美しく見せます。統合中に涙を流したのを覚えています。同時に、ガールフレンドのSK2を使って顔をメイクしたいと思いました(いいえ、持っていません、SK2もガールフレンドも)。何が起こっているのですか?NCNNをSqueezeNetに接続し、関連するモデルファイル、NCNNヘッダーファイルとライブラリ、JNI呼び出し、前処理と後処理に関連するビジネスロジックなどを配置します。これらすべてのコンテンツを SqueezeNet サンプル プロジェクトに配置します。このような単純で直接的な統合方法には明らかな問題があります。ビジネスと密接に結びついており、汎用的ではありません。前処理と後処理はどちらも SqueezeNcnn サンプルに関連しており、他のビジネス コンポーネントに簡単に提供することはできません。考えてみましょう。ビジネス関係者に AI サービスを個別の AI コンポーネントとして提供すると、次のようなことが起こります。

各コンポーネントは NCNN ライブラリに依存し、それを含める必要があり、各コンポーネントの開発者は NCNN インターフェイスに精通し、C 呼び出しコードを記述し、JNI を記述する必要があります。そこで、自然に NCNN コンポーネントを抽出することを考えます。抽出後は、次のようになります。

AOE SDK の NCNN コンポーネント

AOE SDKを使えば、私も虎のように行動できます!AOEオープンソースSDKでは、NCNNコンポーネントを提供しています。4つの側面からNCNNコンポーネントについてお話ししましょう。

  • NCNNコンポーネントの設計
  • SqueezeNetサンプルの修正
  • アプリケーションでNCNNコンポーネントにアクセスする方法
  • NCNNコンポーネントに関する考察

NCNNコンポーネントの設計

NCNN のコンポーネント設計を理解していなければ、一生懸命働いても 2 ドル 50 セントしか得られないかもしれません。では、そのコンポーネントとは何でしょうか? NCNN コンポーネントの設計コンセプトは、コンポーネントに特定のビジネス ロジックは含まれず、NCNN インターフェイスのカプセル化と呼び出しのみが含まれるというものです。特定のビジネス ロジックは、ビジネス パーティによって外部で実装されます。インターフェースの定義と設計に関しては、TF Lite のソースコードとインターフェース設計を参考にしました。現在提供されている外部呼び出しインターフェースは次のようになります。

  1. // モデルとパラメータをロードする
  2. void loadModelAndParam(...)
  3. // 初期化は成功しましたか?
  4. ブール値 isLoadModelSuccess()
  5. // RGBAデータを入力する
  6. void inputRgba(...)
  7. // 推論を実行する
  8. void 実行(...)
  9. //複数入力および複数出力の推論
  10. void 複数の入力と出力を実行するには、... を実行します。
  11. // 推論結果を取得する
  12. テンソル getOutputTensor(...)
  13. // メモリを閉じてクリーンアップする
  14. void close ()を閉じる

そして、機知に富んだ若者自身もこう言った。

  1. ├── AndroidManifest.xml
  2. ├── cpp
  3. │ └── ナック
  4. │ ├── c_api_internal.h
  5. │ ├── 含む
  6. │ ├── インタープリタ.cpp
  7. │ ├── インタプリタ.h
  8. │ ├── jni_util.cpp
  9. │ ├── jni_utils.h
  10. │ ├── ネイティブインタープリターラッパー_jni.cpp
  11. │ ├── ネイティブインタープリターラッパー_jni.h
  12. │ ├── tensor_jni.cpp
  13. │ └── tensor_jni.h
  14. ├── ジャワ
  15. │ └── com
  16. │ └── ディディ
  17. │ └── あおえ
  18. │ └── ランタイム
  19. │ └── ナック
  20. │ ├── インタープリタ.java
  21. │ ├── NativeInterpreterWrapper.java
  22. │ └── Tensor.java
  23. └── jniLibs
  24. ├── arm64-v8a
  25. │ └── libncnn.a
  26. └── アルメアビ-v7a
  27. └── libncnn.a
  • 外部呼び出し、モデルの読み込み、および推論のためにインタープリターが提供されます。
  • NativeInterpreterWrapper はネイティブを呼び出す特定の実装クラスです。
  • Tensor は主に、いくつかのデータとネイティブ レイヤー間の相互作用を伴います。

AOE NCNNをうまく使えば、タスクを早く完了できます。その秘密はここにあります。

  • 複数の入力と複数の出力をサポートします。
  • 効率を向上させるには ByteBuffer を使用します。
  • 入力と出力としてオブジェクトを使用します (実際には ByteBuffer と多次元配列をサポートします)。

実践せずに語るのは単なる空論です。AOE NCNN の実装プロセスを詳しく説明しましょう。

★ 複数の入力と複数の出力をサポートする方法

複数の入力と出力をサポートするために、ネイティブ レイヤーに Tensor オブジェクトのリストを作成し、各オブジェクトに関連する入力データと出力データを格納します。ネイティブ レイヤーの Tensor オブジェクトは、tensor_jni を介して呼び出すために Java レイヤーに提供され、Java レイヤーはネイティブ レイヤーのテンソルを指す「ポインタ」アドレスを維持します。このように、複数の入力と複数の出力がある場合、このリスト内の対応するテンソルを取得するだけでデータ操作を実行できます。

★ ByteBufferの使用

サブセクションを処理するバイト バッファーである ByteBuffer は、従来の配列よりも効率的です。

DirectByteBuffer はオフヒープ メモリを使用するため、カーネルにデータをコピーする必要がなくなり、ByteBuffer を使用するよりも効率的です。

もちろん、ByteBuffer の使用はここで取り上げたいことではありません。ByteBuffer を使用する利点についてお話ししましょう。

1. インターフェース内のバイト操作がより便利になりました。たとえば、putInt、getInt、putFloat、getFloat、flip などの一連のインターフェースで簡単にデータを操作できます。

2. ネイティブ レイヤーと対話し、DirectByteBuffer を使用して効率を向上します。 Java レイヤーとネイティブ レイヤーが「共有」メモリ上で直接操作できるため、中間バイトのコピー プロセスが削減されることを簡単に理解できます。

★ オブジェクトを入力と出力として使用する方法

現在、ByteBuffer と MultiDimensionalArray のみをサポートしています。実際の操作プロセスでは、ByteBuffer であればダイレクト バッファであるかどうかを判断して、異なる読み取りおよび書き込み操作を実行します。 MultiDimensionalArray の場合は、異なるデータ型 (int、float など)、次元などに応じてデータを読み書きします。

★ SqueezeNetサンプルの修正

AOE NCNN コンポーネントを統合した後、SqueezeNet を NCNN モジュールに依存させます。SqueezeNet サンプルには、モデル ファイルと、前処理および後処理に関連するビジネス ロジックのみが含まれています。前処理および後処理は、特定のビジネス実装に応じて、Java または C で実装できます。新しいコード構造は非常に簡潔になり、ディレクトリは次のようになります。

  1. ├── AndroidManifest.xml
  2. ├── 資産
  3. │ └── 絞る
  4. │ ├── モデル.config
  5. │ ├── squeezenet_v1.1.bin
  6. │ ├── squeezenet_v1.1.id.h
  7. │ ├── squeezenet_v1.1.param.bin
  8. │ └── synset_words.txt
  9. └── ジャワ
  10. └── com
  11. └── ディディ
  12. └──あおえ
  13. └── 特徴
  14. │ ├── squeezenet_v1.1.id.h
  15. │ ├── squeezenet_v1.1.param.bin
  16. │ └── synset_words.txt
  17. └── ジャワ
  18. └── com
  19. └── ディディ
  20. └──あおえ
  21. └── 特徴
  22. └── 絞る
  23. └── SqueezeInterpreter.java

↑ このサンプルは、他の AI ビジネス コンポーネントから NCNN コンポーネントへの呼び出しにも適用できます。

(素晴らしいものなら全て完了です)

★ アプリケーションでNCNNコンポーネントにアクセスする方法

NCNN コンポーネントにアクセスするには 2 つの方法があります。

直接アクセス

●AOE SDK経由でアクセス

▲2つのアクセス方法の比較:

もう戦いはありません。AOE SDK が勝者だと一方的に宣言します!

★NCNNコンポーネントの概要と考察

NCNN コンポーネントをカプセル化することで、NCNN とのビジネス統合がより高速かつ便利になりました。以前は、NCNN を新しいビジネスに統合するのに半日から 1 日かかることもありました。 AOE NCNN コンポーネントを使用した後、所要時間は 1 ~ 2 時間だけになる場合があります。もちろん、NCNN コンポーネントにはまだ多くの不完全な点があり、NCNN の研究と理解をさらに深める必要があります。今後も継続的な学習を通じて、NCNN コンポーネントの変換と最適化を進めていきます。

<<:  DeLu Deep Vision: 3Dマシンビジョンに焦点を当て、セキュリティの「スマートアイ」を照らす

>>:  ハイリアンと手を携えてデジタル変革の道を議論する

ブログ    
ブログ    
ブログ    
ブログ    
ブログ    
ブログ    
ブログ    

推薦する

インベントリ | 2018 年のベスト 30 の機械学習プロジェクト

編集者注: この記事は Mybridge からのもので、過去 1 年間 (2017 年) で最も素晴...

毎日のアルゴリズム: スパイラルマトリックス

[[431971]]この記事はWeChatの公開アカウント「3分でフロントエンドを学ぶ」から転載した...

AIはインダストリー4.0の最適化段階の鍵となる

[[282511]]製造業の新たな課題製造業はインテリジェント製造に向けてアップグレードし、変革する...

北京地下鉄は顔認識技術を使用して機密のセキュリティチェックを実施する予定

[[280913]] Jiwei.comニュース(文/Jimmy)によると、北京軌道交通指揮センター...

...

スタンフォード大学とOpenAIがメタプロンプティングを提案し、最も強力なゼロショットプロンプティング技術が誕生した。

最新世代の言語モデル (特に GPT-4、PaLM、LLaMa) は、自然言語処理と生成の限界を押し...

ヒープソートアルゴリズムの普及チュートリアル

[[121962]]この記事の参考文献: アルゴリズム入門、第 2 版。この記事では、ヒープソートア...

自動運転制御プロセスにおいて解決すべき規制上の問題は何ですか?

自動運転車は自動車の知能化の究極の目標であると広く考えられていますが、自動車技術のさまざまな段階の発...

...

...

企業で AI ストレージを導入する際に留意すべき 7 つのポイント

企業における人工知能新しい人工知能 (AI) と機械学習 (ML) のワークロードにより、エンタープ...

NLP を上手に使いこなすには、適切な「武器」が必要です。GLUE で 1 位にランクされている武器をご存知ですか?

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

人工知能やロボットが新たなスターとなった分野はどこでしょうか?

[[252297]] 8月15日から19日まで、世界ロボット会議が北京市宜荘で成功裏に終了しました...

...

画像分類の精度を段階的に向上させるにはどうすればよいでしょうか?

[[205151]] 1. 問題の説明画像認識や画像分類、その他の機械学習タスクを扱う場合、どのよ...