Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

ONNX推論クレートの比較と実装奮闘記

 ONNX推論クレートの比較と実装奮闘記

Rust.Tokyo 2024で発表した資料です。
https://rust.tokyo/lineup/13

Satoshi Yoshikawa

November 30, 2024
Tweet

More Decks by Satoshi Yoshikawa

Other Decks in Technology

Transcript

  1. 自己紹介 • X (ex. Twitter)/GitHub: @emergent • Fairy Devices株式会社 プロダクト開発部

    部長 • Publication ◦ 『実践Rustプログラミング入門』共著 ◦ WEB+DB PRESS No.129 インタビュー ◦ WEB+DB PRESS No.131 特集「Rust入門」 ◦ 『RustによるWebアプリケーション開発 設 計からリリース・運用まで』共著 Satoshi Yoshikawa / 吉川哲史 new! 4 自己紹介
  2. 本日のトピック • 自己紹介 • 今回のお話の背景 • ONNXと推論エンジンについて ◦ ONNXとは ◦

    ONNXの推論エンジン ◦ ONNX形式のモデルを扱えるクレート • 自身の取り組み(実装奮闘記の部分) 10
  3. ONNX(Open Neural Network Exchange) • https://onnx.ai/ • 機械学習モデルを表現するためのフォーマット • フレームワークの相互運用性・最適化の共有を目的に開発

    されている ◦ 学習時のフレームワークに依存せず推論できる ◦ 推論対象のフォーマットの統一によりパフォーマンス調整の対象 を限定できる 機械学習フレームワーク (TensorFlow、PyTorch など) export ONNX モデル 推論エンジン import 11 ONNXとは
  4. オペレーター • Inputs(入力) • Initializer(初期化子) • Attributes(属性) • Outputs(出力) 13

    右図はNetronで可視化したMNISTモデル Netron https://github.com/lutzroeder/netron ONNXとは
  5. 本日のトピック • 自己紹介 • 今回のお話の背景 • ONNXと推論エンジンについて ◦ ONNXとは ◦

    ONNXの推論エンジン ◦ ONNX形式のモデルを扱えるクレート • 自身の取り組み(実装奮闘記の部分) 15
  6. 本日のトピック • 自己紹介 • 今回のお話の背景 • ONNXと推論エンジンについて ◦ ONNXとは ◦

    ONNXの推論エンジン ◦ ONNX形式のモデルを扱えるクレート • 自身の取り組み(実装奮闘記の部分) 18
  7. ONNX形式モデルを推論できるクレート 19 クレート名 構成 扱う内容 説明 ort バインディング 推論 ONNX

    Runtimeをラップしたもの tract Pure Rust 推論 Sonos社が開発している推論エンジン wonnx Pure Rust 推論 ready for the webを謳う推論エンジン burn Pure Rust 学習・推論 Rust製の機械学習フレームワーク candle Pure Rust 学習・推論 Rust製の機械学習フレームワーク kyanite Pure Rust 推論 個人開発の推論エンジン rten Pure Rust 推論 個人開発の推論エンジン ONNX形式のモデルを扱えるクレート
  8. 実装例(ortを使った実装) 23 1. 入力の画像データから テンソルを作る 2. モデルを読み込み 推論セッションを初期化 3. テンソルを入力して

    推論実行 4. 出力から必要な   情報を取り出す リポジトリ:https://github.com/emergent/compare-onnx-runtimes ONNX形式のモデルを扱えるクレート
  9. MNISTで推論させた結果(初期化時間は含まない) 24 クレート名 推論処理時間(ms) 結果の補足 ort 0.35 はやい tract 0.90

    はやい wonnx 3.44 ちょっとおそい burn 対象外 正しい推論結果を出せなかった candle 実行不可 auto_pad: SAME_UPPERに非対応 kyanite 1.51 ふつう? rten 0.66 はやい(モデルを事前変換しているため?) ONNX形式のモデルを扱えるクレート
  10. 自社のモデル実装に使うクレート選定 • 実装の目的 ◦ 動作対象は自社のウェアラブルデバイス〜PCまたはサーバー ◦ GPU処理は不要 • →ort か

    tract に絞って実装にチャレンジする ◦ ort → ONNX RuntimeのExecution Providerを使える(かも) ◦ tract → 自社デバイスで使っているCPU向けの      最適化処理が実装されている(ようだ) 25 ONNX形式のモデルを扱えるクレート
  11. アプリの初期実装シーケンス 39 アプリ(Kotlin) JNI Rust 推論セッション の初期化 インスタンス生成 音声データ入力 (チャンク単位)

    推論処理の実行 推論結果の取得 元音声を適切な単位 (チャンク)に分割 し繰り返し実行する 最初はすべて同期的に実行する形で実装 tractでの実装
  12. • ONNX Runtime ◦ ビルド手順:https://onnxruntime.ai/docs/build/android.html • ort ◦ 上記とリンクさせるため、ortもクローンしてビルド ▪

    環境変数 ORT_LIB_LOCATION, ORT_LIB_PROFILEを指定 ◦ Cargo.tomlからはpath指定してビルド ▪ • アプリには libc++_shared.so も同梱が必要 ◦ アプリ内にjniLibs/arm64-v8aディレクトリを掘って保存 ONNX Runtime / ort を自分でビルドする 46 ort = { version = "2.0.0-rc.8", path = "../ort" } ortでの実装
  13. ort版を動かしてみた • tractに比べてモデル読み込みがかなり高速(約4倍) • 同期処理での推論は少し速い程度 • 一方で、 ◦ NNAPI(※)有効化も試したが大きな改善は見られず ◦

    力技マルチスレッド処理も(同期シーケンスよりは改善したが) スレッド数を増やすことによる改善は見られなかった 47 ortでの実装 ※NNAPI(Neural Networks API):Android デバイス上で演算負荷の高い  機械学習処理を実行するために設計された Android C API  ONNX RuntimeのExecution Providerとして使うことができる
  14. 上手くいかなかったもの • tract, ortいずれも、クレートがもつ並列化機能を使って も速度向上できなかった ◦ tract ▪ マルチスレッド機能で指定するスレッド数を増やすほど遅くなった ◦

    ort ▪ intra_op_threads, inter_op_threads というパラメーターを 指定できるが、いずれも「指定しない」が最も速かった ▪ ortは「指定しない」で実行しても複数コアで実行できて いるようではあった 48 モデル内に並列化で効率的に実行できるオペレーター が(ほとんど)なかったから? ortでの実装
  15. 試したチューニングまとめ 50 クレート やったこと 効果 説明 tract マルチスレッド機能 ✕ 遅くなった

    力技マルチスレッド ◯ 効果あり CPU最適化の有効化 △ スレッド数が少なければ効果あり ort intra_op_threads ✕ 遅くなった inter_op_threads ✕ 遅くなった NNAPI ✕ 改善なし 力技マルチスレッド △ 同期処理よりはましな程度 ※ortの場合は「いらんことしない」が正解かも? まとめ