モデルのコンパイル

Qualcomm® AI Hub は以下の方法で学習済みモデルのコンパイルをサポートしています:

  • PyTorch

  • ONNX

  • AI Model Efficiency Toolkit (AIMET) で量子化されたモデル

  • TensorFlow (ONNX経由)

上記のいずれかのモデルは、以下のターゲットランタイムにコンパイルできます:

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)