毎日 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マシンビジョンに焦点を当て、セキュリティの「スマートアイ」を照らす

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

ブログ    
ブログ    
ブログ    

推薦する

貨物ドローンは宅配業界に革命を起こす:より重い荷物を運び、より遠くまで飛ぶ

貨物ドローンは、高効率、環境保護、低コストなど、多くの利点を備え、宅配業界に革命をもたらそうとしてい...

組織内の AI スキルを向上させる 3 つのステップ

[[350689]]今日、ほとんどの組織は人工知能が遍在する世界に向けて準備を進めています。この進化...

...

倉庫の自動化は人気が高い。ソフトバンクは28億ドルを投じてオートストアの40%を買収した。

ソフトバンクグループは、ノルウェーの倉庫自動化企業オートストアの株式40%を28億ドルで買収すること...

...

ICDM の選択: データ マイニングの代表的なアルゴリズム トップ 10

2006 年 12 月、国際的に有名な学術組織である IEEE 国際データマイニング会議 (ICD...

ディープラーニングモデルを使用して Java でテキスト感情分析を実行する

肯定的ですか? 否定的ですか? 中立的ですか? Stanford CoreNLP コンポーネントと数...

...

...

気候変動と闘うためのAIの8つのガイドライン

気候変動の緩和は緊急の優先課題になりつつあります。時間を無駄にすることはできません。大気中の二酸化炭...

私たちは人工知能の第4世代に突入しているのでしょうか?

人工知能はあらゆる社会的立場を変えるイノベーションです。これは、データを統合し、情報を分析し、その後...

今後10年間で人工知能はどのように発展するでしょうか?

人工知能が台頭していることに疑いの余地はない。しかし、SF映画『バック・トゥ・ザ・フューチャー』が示...

Metaが人工知能チャットボット「Meta AI」をリリース

Meta は、Meta AI と呼ばれる人工知能チャットボットをリリースしました。ザッカーバーグ氏は...

...

...