モデルのプロファイリング

デバイス上でニューラルネットワークモデルをデプロイする際には、多くの重要な質問が生じます:

  • ターゲットハードウェア全体での推論レイテンシはどれくらいですか?

  • モデルは特定のメモリ予算内に収まりますか?

  • モデルはニューラルプロセッシングユニットを活用できますか?

プロファイルジョブは、クラウド上の物理デバイスでモデルを実行し、パフォーマンスを分析することで、これらの質問に答えます。

プロファイルジョブでも、--qairt_version オプションを使用して特定の Qualcomm® AI Runtime バージョンを指定できます。指定しない場合は、バージョン選択 に従ってバージョンが選択されます。

事前コンパイルされたモデルのプロファイリング

Qualcomm® AI Hub は、 previously compiled model のプロファイリングをサポートしています。この例では、 submit_compile_job() を使用してコンパイル済みモデルを最適化し、プロファイリングします。compile_job から get_target_model() を使用してコンパイルされたモデルをどのように使用できたかに注目してください。

import qai_hub as hub

# Profile the previously compiled model
profile_job = hub.submit_profile_job(
    model=compile_job.get_target_model(),
    device=hub.Device("Samsung Galaxy S23 (Family)"),
)
assert isinstance(profile_job, hub.ProfileJob)

戻り値は ProfileJob のインスタンスです。すべてのジョブのリストを表示するには、/jobs/ にアクセスしてください。

PyTorch モデルのプロファイリング

この例では、PyTorch が必要です。以下のようにインストールできます。

pip3 install "qai-hub[torch]"

この例では、Qualcomm® AI Hub を使用して PyTorch モデルを最適化し、プロファイリングします。

import torch

import qai_hub as hub


class SimpleNet(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = torch.nn.Linear(5, 2)

    def forward(self, x):
        return self.linear(x)


input_shapes: list[tuple[int, ...]] = [(3, 5)]
torch_model = SimpleNet()

# Trace the model using random inputs
torch_inputs = tuple(torch.randn(shape) for shape in input_shapes)
pt_model = torch.jit.trace(torch_model, torch_inputs)

# Submit compile job
compile_job = hub.submit_compile_job(
    model=pt_model,
    device=hub.Device("Samsung Galaxy S23 (Family)"),
    input_specs=dict(x=input_shapes[0]),
)
assert isinstance(compile_job, hub.CompileJob)

# Submit profile job using results form compile job
profile_job = hub.submit_profile_job(
    model=compile_job.get_target_model(),
    device=hub.Device("Samsung Galaxy S23 (Family)"),
)
assert isinstance(profile_job, hub.ProfileJob)

アップロード、コンパイル、およびジョブの送信時のオプションの詳細については、upload_model()submit_compile_job()、および submit_profile_job() を参照してください。

TorchScript モデルのプロファイリング

既に保存されたトレースまたはスクリプト化されたtorchモデル(torch.jit.save で保存されたもの)がある場合は、それを直接送信できます。例として mobilenet_v2.pt を使用します。前回の例と同様に、TorchScript モデルは適切なターゲットにコンパイルされた後にのみプロファイリングできます。

import qai_hub as hub

# Compile previously saved torchscript model
compile_job = hub.submit_compile_job(
    model="mobilenet_v2.pt",
    device=hub.Device("Samsung Galaxy S23 (Family)"),
    input_specs=dict(image=(1, 3, 224, 224)),
)
assert isinstance(compile_job, hub.CompileJob)

profile_job = hub.submit_profile_job(
    model=compile_job.get_target_model(),
    device=hub.Device("Samsung Galaxy S23 (Family)"),
)
assert isinstance(profile_job, hub.ProfileJob)

ONNX モデルのプロファイリング

Qualcomm® AI Hub also supports ONNX models. ONNX models can be profiled by either compiling them to a target such as TensorFlow Lite, or profiled directly using the ONNX Runtime. We will use mobilenet_v2.onnx as an example of both methods. This example compiles to a TensorFlow Lite target model.

import qai_hub as hub

compile_job = hub.submit_compile_job(
    model="mobilenet_v2.onnx",
    device=hub.Device("Samsung Galaxy S23 (Family)"),
)
assert isinstance(compile_job, hub.CompileJob)

profile_job = hub.submit_profile_job(
    model=compile_job.get_target_model(),
    device=hub.Device("Samsung Galaxy S23 (Family)"),
)
assert isinstance(profile_job, hub.ProfileJob)

この例では、ONNX Runtime を使用して ONNX モデルを直接プロファイリングします。

import qai_hub as hub

profile_job = hub.submit_profile_job(
    model="mobilenet_v2.onnx",
    device=hub.Device("Samsung Galaxy S23 (Family)"),
)
assert isinstance(profile_job, hub.ProfileJob)

QNNコンテキストバイナリを使用した事前コンパイルされたQNN ONNX モデルも直接プロファイリングできます。この例では、事前コンパイルされたQNN ONNX のコンパイル のコンパイル例を継続して、モデルをプロファイリングします:

import qai_hub as hub

# Profile the previously compiled model
profile_job = hub.submit_profile_job(
    model=compile_job.get_target_model(),
    device=hub.Device("Snapdragon 8 Elite QRD"),
)
assert isinstance(profile_job, hub.ProfileJob)

QNN DLCのプロファイリング

Qualcomm® AI Hub はプロファイリングのためにQNN DLC形式をサポートしています。この例では、PyTorch モデルをQNN DLCにコンパイル の例を継続してモデルをプロファイルします。

import qai_hub as hub

# Profile the previously 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)

QNNコンテキストバイナリのプロファイリング

Qualcomm® AI Hub はプロファイリングのためにQNNコンテキストバイナリ形式をサポートしています。この例では、PyTorch モデルをQNNコンテキストバイナリにコンパイル の例を継続してモデルをプロファイリングします:

import qai_hub as hub

# Profile the previously 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)

TensorFlow Lite モデルのプロファイリング

Qualcomm® AI Hub は .tflite 形式のモデルのプロファイリングもサポートしています。SqueezeNet10 model を使用します。

import qai_hub as hub

# Profile TensorFlow Lite model (from file)
profile_job = hub.submit_profile_job(
    model="SqueezeNet10.tflite",
    device=hub.Device("Samsung Galaxy S23 (Family)"),
)

複数のデバイスでモデルのプロファイリング

多くの場合、複数のデバイスでのパフォーマンスをモデル化することが重要です。この例では、最近の Snapdragon® 8 Gen 1 および Snapdragon® 8 Gen 2 デバイスでプロファイリングを行い、十分なテストカバレッジを確保します。TensorFlow Lite の例から SqueezeNet model を再利用しますが、今回は2つのデバイスでプロファイリングします。

import qai_hub as hub

devices = [
    hub.Device("Samsung Galaxy S23 (Family)"),  # Snapdragon 8 Gen 2
    hub.Device("Samsung Galaxy S24 (Family)"),  # Snapdragon 8 Gen 3
]

jobs = hub.submit_profile_job(model="SqueezeNet10.tflite", device=devices)

各デバイスごとに別々のプロファイルジョブが作成されます。

プロファイリングのためのモデルのアップロード

プロファイルジョブを送信せずにモデル(例:SqueezeNet10.tflite)をアップロードすることが可能です

import qai_hub as hub

hub_model = hub.upload_model("SqueezeNet10.tflite")
print(hub_model)

アップロードされたモデルの model_id を使用してプロファイリングジョブを実行できます。:

import qai_hub as hub

# Retrieve model using ID
hub_model = hub.get_model("mabc123")

# Submit job
profile_job = hub.submit_profile_job(
            model=hub_model,
            device=hub.Device("Samsung Galaxy S23 (Family)"),
)

事前にアップロードされたモデルのプロファイリング

前回のジョブからモデルを再利用して新しいプロファイルジョブを開始できます(例:異なるデバイスで)。これにより、同じモデルを複数回アップロードする必要がなくなります。:

import qai_hub as hub

# Get the model from the profile job
profile_job = hub.get_job("jabc123")
hub_model = profile_job.model

# Run the model from the job
new_profile_job = hub.submit_profile_job(
    model=hub_model,
    device=hub.Device("Samsung Galaxy S22 Ultra 5G"),
)