モデルのコンパイル
Qualcomm® AI Hub は以下の方法で学習済みモデルのコンパイルをサポートしています:
PyTorch
ONNX
AI Model Efficiency Toolkit (AIMET) で量子化されたモデル
TensorFlow (ONNX経由)
上記のいずれかのモデルは、以下のターゲットランタイムにコンパイルできます:
TensorFlow Lite (最近 LiteRT に改名されました。Android開発者に推奨)
ONNX (Windows開発者に推奨)
Qualcomm® AI Engine Direct (QNN) コンテキストバイナリ (SOC特定)
Qualcomm® AI Engine Direct (QNN) モデルライブラリ(オペレーティングシステム固有)
Qualcomm® AI Engine Direct (QNN) DLC(ハードウェアに依存しない)
Qualcomm® AI Engine Direct のバージョンを指定するには、--qairt_version
を含めます。詳細は Common Options を参照してください。
PyTorch を TensorFlow Lite にコンパイルする
PyTorch モデルをコンパイルするには、まず jit.trace メソッドを使用してメモリ内に TorchScript モデルを生成する必要があります。トレースが完了したら、submit_compile_job()
API を使用してモデル
TensorFlow Lite モデルはCPU、GPU (GPU delegation を使用)、またはNPU (QNN delegation を使用) で実行できます。
import torch
import torchvision
import qai_hub as hub
# Using pre-trained MobileNet
torch_model = torchvision.models.mobilenet_v2(pretrained=True)
torch_model.eval()
# Trace model
input_shape: tuple[int, ...] = (1, 3, 224, 224)
example_input = torch.rand(input_shape)
pt_model = torch.jit.trace(torch_model, example_input)
# Compile model on a specific device
compile_job = hub.submit_compile_job(
pt_model,
name="MyMobileNet",
device=hub.Device("Samsung Galaxy S24 (Family)"),
input_specs=dict(image=input_shape),
)
assert isinstance(compile_job, hub.CompileJob)
すでに保存されたトレース済みまたはスクリプト化されたtorchモデルがある場合 (torch.jit.save
で保存)、それを直接提出できます。例として mobilenet_v2.pt を使用します。この例では、コンパイルされたモデルのプロファイルも行います:
import qai_hub as hub
# Compile a model
compile_job = hub.submit_compile_job(
model="mobilenet_v2.pt",
device=hub.Device("Samsung Galaxy S24 (Family)"),
input_specs=dict(image=(1, 3, 224, 224)),
)
assert isinstance(compile_job, hub.CompileJob)
# Profile the compiled model
profile_job = hub.submit_profile_job(
model=compile_job.get_target_model(),
device=hub.Device("Samsung Galaxy S24 (Family)"),
)
assert isinstance(profile_job, hub.ProfileJob)
PyTorch モデルをQNNモデルライブラリにコンパイル
Qualcomm® AI Hub は PyTorch モデルをQNNモデルライブラリにコンパイルおよびプロファイルすることをサポートしています。この例では、mobilenet_v2.pt を使用し、ARM64 Androidプラットフォーム (aarch64_android
) 用のQNNモデルライブラリ (.so
ファイル) にコンパイルします。
モデルライブラリは、OS 固有のデプロイメントメカニズムであり、SoC に依存しません。ただし、Qualcomm® AI Engine Direct SDK はすべての SDK バージョンとの ABI 互換性を保証するものではありません。つまり、ある SDK バージョンでコンパイルされたモデルが他のバージョンで動作する保証はありません。詳細は Qualcomm® AI Engine Direct Options を参照してください。
import qai_hub as hub
# Compile a model to a QNN Model Library
compile_job = hub.submit_compile_job(
model="mobilenet_v2.pt",
device=hub.Device("Samsung Galaxy S23 (Family)"),
options="--target_runtime qnn_lib_aarch64_android",
input_specs=dict(image=(1, 3, 224, 224)),
)
assert isinstance(compile_job, hub.CompileJob)
戻り値は CompileJob
のインスタンスです。このモデルを Snapdragon® ニューラルプロセッシングユニット (NPU) 用にプロファイルする方法については、この例 を参照してください。
PyTorch モデルをQNN DLCにコンパイル
Qualcomm® AI Hub は PyTorch モデルをQNN DLCにコンパイルおよびプロファイリングすることをサポートしています。この例では、mobilenet_v2.pt を使用してQNN DCL(.bin
ファイル)にコンパイルします。
DLC はハードウェアに依存しません。Qualcomm® AI Engine Direct SDK は、DLC が将来の SDK バージョンと互換性を持つことを保証します。つまり、ある SDK バージョンでコンパイルされた DLC は、以降の SDK バージョンでも動作することが保証されます。詳細は Qualcomm® AI Engine Direct Options を参照してください。
import qai_hub as hub
# Compile a model to QNN DLC
compile_job = hub.submit_compile_job(
model="mobilenet_v2.pt",
device=hub.Device("Samsung Galaxy S24 (Family)"),
options="--target_runtime qnn_dlc",
input_specs=dict(image=(1, 3, 224, 224)),
)
assert isinstance(compile_job, hub.CompileJob)
戻り値は CompileJob
のインスタンスです。このモデルを Snapdragon® ニューラルプロセッシングユニット (NPU) 用にプロファイルする方法については、この例 を参照してください。
PyTorch モデルをQNNコンテキストバイナリにコンパイル
Qualcomm® AI Hub は PyTorch モデルをQNNコンテキストバイナリにコンパイルおよびプロファイルすることをサポートしています。この例では、mobilenet_v2.pt を使用し、特定のデバイスで実行するために最適化されたQNNコンテキストバイナリにコンパイルします。ターゲットハードウェアに特化して最適化されているため、単一のデバイスにのみコンパイルできます。
コンテキストバイナリはSOC特定のデプロイメントメカニズムです。デバイス用にコンパイルされた場合、モデルは同じデバイスにデプロイされることが期待されます。この形式はオペレーティングシステムに依存しないため、同じモデルをAndroid、Linux、またはWindowsでデプロイできます。コンテキストバイナリはNPU専用に設計されています。
import qai_hub as hub
# Compile a model to QNN context binary
compile_job = hub.submit_compile_job(
model="mobilenet_v2.pt",
device=hub.Device("Samsung Galaxy S24 (Family)"),
options="--target_runtime qnn_context_binary",
input_specs=dict(image=(1, 3, 224, 224)),
)
assert isinstance(compile_job, hub.CompileJob)
戻り値は CompileJob
のインスタンスです。このモデルを Snapdragon® ニューラルプロセッシングユニット (NPU) 用にプロファイルする方法については、この例 を参照してください。
QNNコンテキストバイナリは ONNX モデル内に埋め込むこともできます。
事前コンパイルされたQNN ONNX のコンパイル
Qualcomm® AI Hub は、事前コンパイルされた ONNX Runtime モデルのコンパイルとプロファイリングをサポートしています。これは、Snapdragon デバイス上で ONNX Runtime を使用して実行可能な事前コンパイルされた QNN バイナリを含む ONNX Runtime 互換モデルです。詳細は こちらのドキュメント を参照してください。
事前コンパイルされたQNN ONNX を使用する利点:
デプロイの容易さ:Android、Linux、またはWindowsで動作します。
パフォーマンス向上:QNNコンテキストバイナリと同等。
シンプルな推論コード:ONNX Runtime は QNN Execution Provider を使用してコンパイルされたモデルで推論を実行します。
大規模モデル:LLM、Stable Diffusionなどの大規模モデル (>1GB) に対応。
QNNコンテキストバイナリはオペレーティングシステムに依存しませんが、デバイス特定です。さらに、コンテキストバイナリはNPU専用に設計されています。この例では、Snapdragon® 8 Eliteをターゲットにすると仮定します:
import qai_hub as hub
# Compile a model to QNN context binary
compile_job = hub.submit_compile_job(
model="mobilenet_v2.pt",
device=hub.Device("Snapdragon 8 Elite QRD"),
options="--target_runtime precompiled_qnn_onnx",
input_specs=dict(image=(1, 3, 224, 224)),
)
assert isinstance(compile_job, hub.CompileJob)
コンパイルされたモデルは、ONNX ファイルとQNNコンテキストバイナリファイルを含む圧縮ディレクトリ (拡張子 .onnx) です。自分でコンパイルした事前コンパイルされた ONNX Runtime モデルをアップロードする場合、次のフォルダ構造に準拠している必要があります:
<modeldir>.onnx
├── <model>.onnx
└── <model>.bin
ONNX モデルからQNNコンテキストバイナリへの相対パス参照があるため、.bin ファイルの名前を変更したり移動したりする場合は、その参照に注意してください。
ONNX Runtime 用の PyTorch モデルのコンパイル
Qualcomm® AI Hub は PyTorch モデルを ONNX Runtime 用にコンパイルすることをサポートしています。この例では、mobilenet_v2.pt を使用し、ONNX モデルにコンパイルします。このモデルは ONNX Runtime を使用してプロファイルできます。
ONNX Runtime は、CPU、GPU(DML実行プロバイダー を使用)、またはNPU(QNN実行プロバイダー を使用)での実行をサポートしています。
import qai_hub as hub
# Compile a model to an ONNX model
compile_job = hub.submit_compile_job(
model="mobilenet_v2.pt",
device=hub.Device("Samsung Galaxy S23 (Family)"),
options="--target_runtime onnx",
input_specs=dict(image=(1, 3, 224, 224)),
)
assert isinstance(compile_job, hub.CompileJob)
ONNX モデルを TensorFlow Lite またはQNNにコンパイル
Qualcomm® AI Hub は ONNX モデルを TensorFlow Lite またはQNNモデルライブラリにコンパイルすることもサポートしています。例として mobilenet_v2.onnx を使用します
import qai_hub as hub
# Compile a model to TensorFlow Lite
compile_job = hub.submit_compile_job(
model="mobilenet_v2.onnx",
device=hub.Device("Samsung Galaxy S23 (Family)"),
)
assert isinstance(compile_job, hub.CompileJob)
# Compile a model to a QNN Model Library
compile_job = hub.submit_compile_job(
model="mobilenet_v2.onnx",
device=hub.Device("Samsung Galaxy S23 (Family)"),
options="--target_runtime qnn_lib_aarch64_android",
)
assert isinstance(compile_job, hub.CompileJob)
# Compile a model to a QNN DLC
compile_job = hub.submit_compile_job(
model="mobilenet_v2.onnx",
device=hub.Device("Samsung Galaxy S23 (Family)"),
options="--target_runtime qnn_dlc",
)
assert isinstance(compile_job, hub.CompileJob)
ONNX モデルは、量子化されていない場合(上記の例のように)や、量子化されている場合があります(量子化 で説明します)。ソースモデルが量子化されている場合、量子化パラメータは尊重され、量子化されたデプロイ可能なアセットが生成されます。ONNX モデルは、外部の重みを持つ ONNX モデルをサポートするディレクトリでもあります。オプションで圧縮されたディレクトリ(拡張子 .onnx
)には、正確に1つの .onnx
ファイルと正確に1つの重みファイル拡張子 .data
が含まれている必要があります。次のフォルダ構造に準拠する必要があります:
<modeldir>.onnx
├── <model>.onnx
└── <model>.data
<modeldir>
および <model>
は任意の名前にすることができます。ONNXモデルがその構造に準拠していない場合は、次のコードを使用して準拠させてください:
# if you have an ONNX model "file.onnx" which uses external weights,
# but does not adhere to Qualcomm AI Hub's required format, use this
# code to make it adhere
import onnx
model = onnx.load("file.onnx")
onnx.save(model, "new_file.onnx", save_as_external_data=True, location="new_file.data")
# place both "new_file.onnx" and "new_file.data" in a new directory with
# a .onnx extension, without any other files and upload that directory
# to Qualcomm AI Hub, either as is or as a .zip file
ONNX モデルから重みファイルへの相対パス参照があるため、重みファイルの名前を変更したり移動したりする場合は、その参照に注意してください。
AIMET で量子化されたモデルを TensorFlow Lite またはQNNにコンパイル
AI Model Efficiency Toolkit(AIMET)は、ニューラルネットワークモデルのトレーニングのための高度なモデル量子化および圧縮技術を提供するオープンソースライブラリです。AIMET の QuantizationSimModel は、量子化パラメータを持つ ONNX モデル(.onnx
)およびエンコーディングファイル(.encodings
)にエクスポートできます。
このモデルを使用するには、名前に .aimet
を含むディレクトリを作成します。1つの .onnx
モデルと対応するエンコーディングファイルを含める必要があります。
<modeldir>.aimet
├── <model>.onnx
├── <model>.data (optional)
└── <encodings>.encodings
<modeldir>
, <model>
, および <encodings>
は任意の名前にすることができます。ONNX モデルに外部の重みがある場合にのみ、<model.data> が必要です。
例として mobilenet_v2_onnx.aimet.zip を使用します。これを mobilenet_v2_onnx.aimet
ディレクトリに解凍した後、コンパイルジョブを送信できます。
import qai_hub as hub
# Compile to TensorFlow Lite
compile_job = hub.submit_compile_job(
model="mobilenet_v2_onnx.aimet",
device=hub.Device("Samsung Galaxy S24 (Family)"),
)
assert isinstance(compile_job, hub.CompileJob)
# Compile to a QNN Model Library
compile_job = hub.submit_compile_job(
model="mobilenet_v2_onnx.aimet",
device=hub.Device("Samsung Galaxy S24 (Family)"),
options="--target_runtime qnn_lib_aarch64_android --quantize_full_type int8",
)
assert isinstance(compile_job, hub.CompileJob)