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

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

推薦する

月間 30 万個の H100 チップ、Nvidia は Intel にチップの製造を依頼しているのでしょうか? CoWosの生産能力が低すぎるからといって

TSMCの生産能力不足により、Nvidiaはチップ製造をIntelに頼らざるを得なくなったのか? T...

インペリアル・カレッジ:専門医の80%が懸念する心臓リズムデバイスインプラント手術問題をAIで解決する方法

インペリアル・カレッジ・ロンドンの研究者らは、ペースメーカーや除細動器のメーカーとモデルを識別するた...

食べられる「論理ゲート」:科学者たちはデザートを「ミニコンピューター」に変えた

過去 10 年間で、食品業界では 3D プリント食品、食用センサー、ロボット調理、AR ダイニングな...

Github が絶賛: モザイクテキスト = 無意味、AI があなたの思考をすべて見抜く、オープンソースに

「この写真をフォトショップで加工しましょう!」 「いいですよ、でもこの段落は検閲しないと面倒なことに...

人工知能がインダストリー4.0における製造業に革命をもたらす

人工知能 (AI) という用語は、流行語の地位を超え、業界全体にわたる技術革新の基礎となっています。...

ウルトラマンが解雇されるのは今回が初めてではない! YCを去った人物は「創設者から去るように言われた」

ウルトラマンニウフルが「追い出される」のは初めてではないでしょうか? ? !予想外にも、OpenAI...

完璧な切り抜き王ビンビン! ByteDanceのインターンが開発したAIにより、4K 60fps動画のリアルタイム切り抜きが可能に

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

機械学習コードを単体テストするにはどうすればいいですか?

現在、ニューラル ネットワーク コードの単体テストに関する特に包括的なオンライン チュートリアルはあ...

ビジョンから現実へ: ヘルスケアにおける AI の台頭

[51CTO.com速訳]人工知能分野における音声インタラクション、コンピュータビジョン、認知コンピ...

...

RNN と LSTM は弱いです!注目モデルは王様!

リカレント ニューラル ネットワーク (RNN)、長期短期記憶 (LSTM)、これらの人気のニューラ...

民主化と自動化: 機械学習の参入障壁を下げる 6 つのツール

かつて、機械学習という用語は科学的な光輪に包まれており、複雑なアルゴリズムにデータを「入力」して有用...

世界中のコードの品質が急激に低下、その原因は AI です。 1億5300万行のコードの詳細な分析レポートが公開されました

AI が世界中のコード品質を低下させています。最近、GitClear が発表した調査レポートによると...

...

いくつかの一般的な暗号化アルゴリズムのPython実装

私たちは日常生活の中で、暗号化アルゴリズムによく遭遇します。今日は、これらの暗号化アルゴリズムの P...