QNN バックエンドガイド

ailia SDK の QNN バックエンドを使用して、Qualcomm SoC の NPU で高速な推論を行う方法を説明します。

概要

QNN は Qualcomm の提供するバックエンド API です。NVIDIA の cuDNN に相当します。ailia の QNN バックエンドを使用することで、Qualcomm の SoC で NPU を使用することができます。

対応プラットフォーム

注意: QNN の HMX による FP16 演算には Hexagon v69 以降が必要です。そのため、Snapdragon 8 Gen 1 以降のデバイスが必要です。

使用方法

QNN は ailia SDK 1.7 以降で試験的に使用可能になる予定です。

Android での使用方法

libailia.so に加えて、libailia_qnn.so をアプリケーションに同梱します。

libcdsprpc.so の実行権限を AndroidManifest.xml に記載する必要があります。

<uses-native-library android:name="libcdsprpc.so" android:required="false"/>

build.gradle に下記を追加する必要があります。

implementation 'com.qualcomm.qti:qnn-runtime:2.47.0'

build.gradle に記載すると、自動的に apk に QNN が同梱されます。

サンプルは ailia-models-kotlin にあります。

Windows での使用方法

pip3 install ailia を行ったあと、QNN をダウンロードし、pip3 show ailia で表示されるパスを元に、zip 内の下記のファイルを site-packages/ailia/windows/arm64 にコピーしてください。

https://www.qualcomm.com/developer/software/qualcomm-ai-engine-direct-sdk

注意: QNN はバージョン依存があるため、下記をご利用ください。
v2.47.0.260601.zip
注意: hexagon-v* はデバイスの Hexagon アーキテクチャに合わせてバージョンを指定してコピーする必要があります。Snapdragon X Plus の場合は hexagon-v73 をコピーしてください。so だけでなく、qairt\2.47.0.260601\lib\hexagon-v73\unsigned\libsnpehtpv73.cat などの cat ファイルもコピーが必要です。
補足: so ファイルは Windows 用のライブラリではなく、NPU(Hexagon)上で実行されるバイナリです。DLL は Windows 上で動作し、FastRPC 経由で NPU に処理を依頼します。libQnnHtpV73.so は FastRPC 経由で NPU に転送され、Hexagon プロセッサ上にロードされて実際の演算を実行します。Hexagon 向けのバイナリは ELF 形式(.so)のため、ホスト OS が Windows でも拡張子は .so になります。

アーキテクチャ

ailia SDK は ONNX を入力し、グラフをパースし、レイヤーをインスタンス化、各レイヤーで QNN を使用した推論を行います。QNN(Qualcomm AI Engine Direct)は libcdsprpc.so(FastRPC)を経由して Hexagon NPU に処理をオフロードし、NPU 内の HVX(ベクトル演算ユニット)と HMX(行列演算ユニット)で演算が実行されます。QNN 非対応のオペレータは ailia_cpu で実行され、NPU と CPU が並列に動作します。演算は FP16 で行います。

ONNX
モデルファイル
ailia
グラフ管理
↙ ↘
ailia_qnn
レイヤー管理
QNN
推論ランタイム(Qualcomm AI Engine Direct / HTP バックエンド)
libcdsprpc.so
FastRPC(CPU と NPU 間の RPC インタフェース)
Hexagon NPU
HVX(ベクトル演算ユニット)/ HMX(行列演算ユニット)
ailia_cpu
CPU レイヤー処理(QNN 非対応オペレータのオフロード)
CPU
Arm CPU

パフォーマンス

CPU 推論に比べて NPU は 5〜10 倍程度高速です。ailia は QNN の非対応オペレータについて自動的に CPU オフロードを行います。

Android 向けのデモアプリは下記からダウンロードできます。

https://github.com/ailia-ai/ailia-models-kotlin/wiki/QNN

Windows 向けのデモアプリは下記からダウンロードできます。

https://github.com/ailia-ai/ailia-models-flutter/wiki/QNN

制約

QNN は Static Graph のみ対応しています。ailia SDK では、Dynamic Graph が入力された場合、CPU 推論を行います。