ailia SDK の QNN バックエンドを使用して、Qualcomm SoC の NPU で高速な推論を行う方法を説明します。
QNN は Qualcomm の提供するバックエンド API です。NVIDIA の cuDNN に相当します。ailia の QNN バックエンドを使用することで、Qualcomm の SoC で NPU を使用することができます。
QNN は ailia SDK 1.7 以降で試験的に使用可能になる予定です。
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 にあります。
pip3 install ailia を行ったあと、QNN をダウンロードし、pip3 show ailia で表示されるパスを元に、zip 内の下記のファイルを site-packages/ailia/windows/arm64 にコピーしてください。
qairt\2.47.0.260601\lib\aarch64-windows-msvc にある DLL(QnnHtp.dll など)qairt\2.47.0.260601\lib\hexagon-v73\unsigned にある so(libQnnHtpV73.so など)と cat(libsnpehtpv73.cat など)https://www.qualcomm.com/developer/software/qualcomm-ai-engine-direct-sdk
hexagon-v* はデバイスの Hexagon アーキテクチャに合わせてバージョンを指定してコピーする必要があります。Snapdragon X Plus の場合は hexagon-v73 をコピーしてください。so だけでなく、qairt\2.47.0.260601\lib\hexagon-v73\unsigned\libsnpehtpv73.cat などの cat ファイルもコピーが必要です。
ailia SDK は ONNX を入力し、グラフをパースし、レイヤーをインスタンス化、各レイヤーで QNN を使用した推論を行います。QNN(Qualcomm AI Engine Direct)は libcdsprpc.so(FastRPC)を経由して Hexagon NPU に処理をオフロードし、NPU 内の HVX(ベクトル演算ユニット)と HMX(行列演算ユニット)で演算が実行されます。QNN 非対応のオペレータは ailia_cpu で実行され、NPU と CPU が並列に動作します。演算は FP16 で行います。
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 推論を行います。