すべてのプロダクト
Search
ドキュメントセンター

:モデルの分析と最適化

最終更新日:Nov 11, 2024

モデルが実稼働環境にデプロイする前にデプロイ基準を満たしていることを確認するには、クラウドネイティブAIスイートでサポートされているモデル分析および最適化コマンドを使用して、モデルのベンチマーク、分析、および最適化を行うことができます。 このトピックでは、PyTorchが提供するResNet18モデルを例として使用し、V100 GPUを使用してモデルを高速化します。

前提条件

  • Container Service for Kubernetes (ACK) Proクラスターが作成され、クラスターのKubernetesバージョンが1.20以降になります。 クラスターには、少なくとも1つのGPU高速化ノードが含まれます。 ACKクラスターの更新方法の詳細については、「ACKクラスターの更新」をご参照ください。

  • Object Storage Service (OSS) バケットが作成されます。 永続ボリューム (PV) と永続ボリューム要求 (PVC) が作成されます。 詳細については、「静的にプロビジョニングされたOSSボリュームのマウント」をご参照ください。

  • Arenaクライアントの最新バージョンがインストールされています。 詳細については、「Arenaクライアントの設定」をご参照ください。

背景情報

データ科学者はモデルの精度に焦点を当てていますが、R&Dエンジニアはモデルのパフォーマンスに関心があります。 その結果、モデルをオンラインサービスとしてリリースした後、モデルがパフォーマンス要件を満たさない場合があります。 この問題を防ぐには、モデルをリリースする前にモデルをベンチマークする必要があります。 モデルがパフォーマンス要件を満たしていない場合は、パフォーマンスのボトルネックを特定してモデルを最適化できます。

モデル解析および最適化コマンドの概要

クラウドネイティブAIスイートは、複数のモデル分析および最適化コマンドをサポートします。 コマンドを実行して、モデルをベンチマークし、ネットワーク構造を分析し、各演算子の期間を確認し、GPU使用率を表示できます。 次に、モデルのパフォーマンスのボトルネックを特定し、TensorRTを使用してモデルを最適化できます。 これにより、本番環境のパフォーマンス要件を満たすモデルをリリースできます。 次の図は、モデル分析および最適化コマンドによって支援されるモデルライフサイクルを示しています。生命周期

  1. モデルトレーニング: モデルは、所与のデータセットに基づいてトレーニングされる。

  2. モデルベンチマーク: モデルに対してベンチマークを実行して、モデルのレイテンシ、スループット、およびGPU使用率が要件を満たしているかどうかを確認します。

  3. モデルプロファイル: モデルを分析してパフォーマンスのボトルネックを特定します。

  4. モデル最適化: モデルのGPU推論機能は、TensorRTなどのツールを使用して最適化されます。

  5. Model Serving: モデルはオンラインサービスとしてデプロイされます。

説明

モデルを最適化した後でもモデルがパフォーマンス要件を満たしていない場合は、前のフェーズを繰り返すことができます。

コマンドの実行方法

Arenaを使用して、モデル分析、最適化、ベンチマーク、および評価ジョブをACK Proクラスターに送信できます。 arena model analyze -- helpコマンドを実行して、ヘルプ情報を表示できます。

$ arena model analyze --help
submit a model analyze job.

Available Commands:
  profile          Submit a model profile job.
  evaluate         Submit a model evaluate job.
  optimize         Submit a model optimize job.
  benchmark        Submit a model benchmark job

Usage:
  arena model analyze [flags]
  arena model analyze [command]

Available Commands:
  benchmark   Submit a model benchmark job
  delete      Delete a model job
  evaluate    Submit a model evaluate job
  get         Get a model job
  list        List all the model jobs
  optimize    Submit a model optimize job, this is a experimental feature
  profile     Submit a model profile job

を送信する

ステップ1: モデルを準備する

PyTorchモデルのデプロイにはTorchScriptを使用することを推奨します。 このトピックでは、PyTorchが提供するResNet18モデルを例として使用します。

  1. モデルを変換します。 ResNet18モデルをTorchScriptモデルに変換し、モデルを保存します。

    import torch
    import torchvision
    
    model = torchvision.models.resnet18(pretrained=True)
    
    # Switch the model to eval model
    model.eval()
    
    # An example input you would normally provide to your model's forward() method.
    dummy_input = torch.rand(1, 3, 224, 224)
    
    # Use torch.jit.trace to generate a torch.jit.ScriptModule via tracing.
    traced_script_module = torch.jit.trace(model, dummy_input)
    
    # Save the TorchScript model
    traced_script_module.save("resnet18.pt")
    

    パラメーター

    説明

    model_name

    モデルの名前。

    モデル_プラットフォーム

    モデルで使用されるプラットフォームまたはフレームワーク (TorchScriptONNXなど) 。

    model_path

    モデルが格納されるパス。

    入力

    入力パラメーター。

    出力

    出力パラメーター。

  2. モデルの変換後、モデル設定ファイルresnet18.ptをOSSにアップロードします。 設定ファイルのOSSパスは、oss:// bucketname/models/resnet18/resnet18.ptです。 詳細については、「オブジェクトのアップロード」をご参照ください。

ステップ2: ベンチマークを実行する

モデルを運用環境にデプロイする前に、ベンチマークを実行してモデルのパフォーマンスを評価できます。 このステップでは、ベンチマークジョブがArenaで送信され、クラスターのdefault名前空間のoss-PVCという名前のpvcが例として使用されます。 詳細については、「静的にプロビジョニングされたOSSボリュームのマウント」をご参照ください。

  1. モデルの構成ファイルを準備してアップロードします。

    1. モデルの構成ファイルを作成します。 この例では、設定ファイルの名前はconfig.jsonです。

      {
        "model_name": "resnet18",
        "model_platform": "torchscript",
        "model_path": "/data/models/resnet18/resnet18.pt",
        "inputs": [
          {
            "name": "input",
            "data_type": "float32",
            "shape": [1, 3, 224, 224]
          }
        ],
        "outputs": [
          {
              "name": "output",
              "data_type": "float32",
              "shape": [ 1000 ]
          }
        ]
      }
    2. 設定ファイルをOSSにアップロードします。 設定ファイルのOSSパスは、oss:// bucketname/models/resnet18/config.jsonです。

  2. 次のコマンドを実行して、ACK Proクラスターにベンチマークジョブを送信します。

    arena model analyze benchmark \
      --name=resnet18-benchmark \
      --namespace=default \
      --image=registry.cn-beijing.aliyuncs.com/kube-ai/easy-inference:1.0.2 \
      --gpus=1 \
      --data=oss-pvc:/data \
      --model-config-file=/data/models/resnet18/config.json \
      --report-path=/data/models/resnet18 \
      --concurrency=5 \
      --duration=60

    パラメーター

    説明

    -- gpus

    使用されるGPUの数。

    -- データ

    クラスターのPVCと、PVCがマウントされるパス。

    -- model-config-file

    設定ファイルのパス。

    -- レポートパス

    ベンチマークレポートが保存されるパス。

    -- 並行性

    同時リクエストの数。

    -- duration

    ベンチマークジョブの期間。 単位は秒です。

    重要
    • -- requests-- durationパラメーターを同時に指定することはできません。 ベンチマークジョブを送信するときに、そのうちの1つだけを指定します。 両方を指定した場合、システムはデフォルトで -- durationパラメーターを使用します。

    • ベンチマークジョブによって送信されたリクエストの合計数を指定するには、-- requestsパラメーターを指定します。

  3. 次のコマンドを実行して、ジョブのステータスを照会します。

    arena model analyze list -A

    期待される出力:

    NAMESPACE      NAME                        STATUS    TYPE       DURATION  AGE  GPU(Requested)
    default        resnet18-benchmark          COMPLETE  Benchmark  0s        2d   1
  4. ベンチマークレポートを表示します。 STATUSパラメーターにCOMPLETEと表示された場合、ベンチマークジョブは完了です。 次に、-- report-pathパラメーターで指定されたパスにbenchmark_result.txtという名前のベンチマークレポートがあります。

    期待される出力:

    {
        "p90_latency":7.511,
        "p95_latency":7.86,
        "p99_latency":9.34,
        "min_latency":7.019,
        "max_latency":12.269,
        "mean_latency":7.312,
        "median_latency":7.206,
        "throughput":136,
        "gpu_mem_used":1.47,
        "gpu_utilization":21.280
    }

    次の表に、ベンチマークレポートに含まれるメトリックを示します。

    メトリック

    説明

    単位

    p90_latency

    90パーセンタイル応答時間

    ミリ秒

    p95_latency

    95パーセンタイル応答時間

    ミリ秒

    p99_latency

    99パーセンタイル応答時間

    ミリ秒

    min_latency

    最速の応答時間

    ミリ秒

    max_latency

    最も遅い応答時間

    ミリ秒

    mean_latency

    平均応答時間

    ミリ秒

    median_latency

    中応答時間

    ミリ秒

    スループット

    スループット

    gpu_mem_used

    GPUメモリ使用量

    GB

    gpu_utilization

    GPU使用率

    割合

ステップ3: モデルを分析する

ベンチマークを実行した後、arena model analyze profileコマンドを実行してモデルを分析し、パフォーマンスのボトルネックを特定できます。

  1. 次のコマンドを実行して、モデル分析ジョブをACK Proクラスターに送信します。

    arena model analyze profile \
      --name=resnet18-profile \
      --namespace=default \
      --image=registry.cn-beijing.aliyuncs.com/kube-ai/easy-inference:1.0.2 \
      --gpus=1 \
      --data=oss-pvc:/data \
      --model-config-file=/data/models/resnet18/config.json \
      --report-path=/data/models/resnet18/log/ \
      --tensorboard \
      --tensorboard-image=registry.cn-beijing.aliyuncs.com/kube-ai/easy-inference:1.0.2

    パラメーター

    説明

    -- gpus

    使用されるGPUの数。

    -- データ

    クラスターのPVCと、PVCがマウントされるパス。

    -- model-config-file

    設定ファイルのパス。

    -- レポートパス

    分析レポートが保存されるパス。

    -- tensorboard

    TensorBoardで分析レポートを表示するかどうかを指定します。

    -- tensorboard-イメージ

    Tensorboardの展開に使用されるイメージのURL。

  2. 次のコマンドを実行して、ジョブのステータスを照会します。

    arena model analyze list -A

    期待される出力:

    NAMESPACE      NAME                        STATUS    TYPE       DURATION  AGE  GPU(Requested)
    default        resnet18-profile            COMPLETE  Profile    13s       2d   1
  3. 次のコマンドを実行して、TensorBoardのステータスを照会します。

    kubectl get service -n default

    期待される出力:

    NAME                           TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    resnet18-profile-tensorboard   NodePort   172.16.158.170   <none>        6006:30582/TCP   2d20h
  4. 次のコマンドを実行して、ポート転送を有効にし、TensorBoardにアクセスします。

    kubectl port-forward svc/resnet18-profile-tensorboard -n default 6006:6006

    期待される出力:

    127.0.X.Xからの

    Forwarding from 127.0.X.X:6006 -> 6006
    Forwarding from [::1]:6006 -> 6006

    からの転送

  5. ブラウザのアドレスバーにhttp:// localhost:6006と入力して、分析結果を表示します。 左側のナビゲーションウィンドウで、[ビュー] をクリックして、複数のディメンションに基づく分析結果を表示し、パフォーマンスのボトルネックを特定します。 分析結果に基づいてモデルを最適化できます。查看分析结果

ステップ4: モデルを最適化する

Arenaを使用してモデルを最適化できます。

  1. 次のコマンドを実行して、モデル最適化ジョブをACK Proクラスターに送信します。

    arena model analyze optimize \
      --name=resnet18-optimize \
      --namespace=default \
      --image=registry.cn-beijing.aliyuncs.com/kube-ai/easy-inference:1.0.2 \
      --gpus=1 \
      --data=oss-pvc:/data \
      --optimizer=tensorrt \
      --model-config-file=/data/models/resnet18/config.json \
      --export-path=/data/models/resnet18

    パラメーター

    説明

    -- gpus

    使用されるGPUの数。

    -- データ

    クラスターのPVCと、PVCがマウントされるパス。

    -- optimizer

    最適化メソッド。 有効な値:

    • tensorrt (デフォルト)

    • aiacc-トーチ

    -- model-config-file

    設定ファイルのパス。

    -- export-path

    最適化されたモデルが格納されるパス。

  2. 次のコマンドを実行して、ジョブのステータスを照会します。

    arena model analyze list -A

    期待される出力:

    NAMESPACE      NAME                        STATUS    TYPE       DURATION  AGE  GPU(Requested)
    default        resnet18-optimize           COMPLETE  Optimize   16s       2d   1
  3. 最適化モデルの設定ファイルを表示します。 STATUSパラメーターにCOMPLETEと表示された場合、最適化ジョブは完了です。 次に、-- export-pathパラメーターで指定されたパスにopt_resnet18.ptという名前の設定ファイルがあります。

  4. ベンチマークジョブの -- model_pathパラメーターの値を、前の手順で取得した設定ファイルのパスに変更し、ベンチマークを再度実行します。 ベンチマークの実行方法の詳細については、「手順2: ベンチマークの実行」をご参照ください。

    次の表に、モデルを最適化する前後のメトリック値を示します。

    メトリック

    最適化の前

    最適化後

    p90_latency

    7.511ミリ秒

    5.162ミリ秒

    p95_latency

    7.86ミリ秒

    5.428ミリ秒

    p99_latency

    9.34ミリ秒

    6.64ミリ秒

    min_latency

    7.019ミリ秒

    4.827ミリ秒

    max_latency

    12.269ミリ秒

    8.426ミリ秒

    mean_latency

    7.312ミリ秒

    5.046ミリ秒

    median_latency

    7.206ミリ秒

    4.972ミリ秒

    スループット

    136回

    198回

    gpu_mem_used

    1.47 GB

    1.6 GB

    gpu_utilization

    21.280%

    10.912%

    統計は、モデルのパフォーマンスとGPU使用率が最適化後に大幅に改善されることを示しています。 それでもモデルがパフォーマンス要件を満たしていない場合は、上記の手順を繰り返してモデルを分析および最適化できます。

ステップ5: モデルのデプロイ

モデルがパフォーマンス要件を満たしている場合は、モデルをオンラインサービスとしてデプロイできます。 Arenaでは、NVIDIA Triton Inference Serverを使用してTorchScriptモデルをデプロイできます。 詳細については、「Nvidia Triton Server」をご参照ください。

  1. config.pbtxtという名前の設定ファイルを作成します。

    重要

    ファイル名は変更しないでください。

    name: "resnet18"
    platform: "pytorch_libtorch"
    max_batch_size: 1
    default_model_filename: "opt_resnet18.pt"
    input [
        {
            name: "input__0"
            format: FORMAT_NCHW
            data_type: TYPE_FP32
            dims: [ 3, 224, 224 ]
        }
    ]
    output [
        {
            name: "output__0",
            data_type: TYPE_FP32,
            dims: [ 1000 ]
        }
    ]
    説明

    構成ファイルのパラメーターの詳細については、「モデルリポジトリ」をご参照ください。

  2. OSSに次のディレクトリ構造を作成します。

    oss://bucketname/triton/model-repository/
        resnet18/
          config.pbtxt
          1/
            opt_resnet18.pt
    説明

    1/ はNVIDIA Triton Inference Serverの規約です。 値は、モデルのバージョン番号を示します。 モデルリポジトリは、モデルの異なるバージョンを格納できます。 詳細については、「モデルリポジトリ」をご参照ください。

  3. Arenaを使用してモデルをデプロイします。 モデルは、GPU共有モードまたはGPU排他モードでデプロイできます。

    • GPU排他モード: このモードを使用して、高い安定性を必要とする推論サービスをデプロイできます。 このモードでは、各GPUは1つのモデルのみを加速します。 モデルはGPUリソースと競合しません。 次のコマンドを実行して、GPU排他モードでモデルをデプロイできます。

      arena serve triton \
        --name=resnet18-serving \
        --gpus=1 \
        --replicas=1 \
        --image=nvcr.io/nvidia/tritonserver:21.05-py3 \
        --data=oss-pvc:/data \
        --model-repository=/data/triton/model-repository \
        --allow-metrics=true
    • GPU共有モード: このモードを使用して、ロングテール推論サービスまたはコスト効率が必要な推論サービスをデプロイできます。 このモードでは、GPUは複数のモデルで共有されます。 各モデルは、指定された量のGPUメモリのみを使用できます。 次のコマンドを実行して、モデルをGPU共有モードでデプロイできます。

      モデルをGPU共有モードでデプロイする場合は、-- gpumemoryパラメーターを設定する必要があります。 このパラメータは、各ポッドに割り当てられるメモリの量を指定します。 ベンチマーク結果のgpu_mem_usedメトリックに基づいて適切な値を指定できます。 たとえば、gpu_mem_usedメトリックの値が1.6 GBの場合、-- gpumemoryパラメーターを2 GBに設定できます。 このパラメーターの値は正の整数でなければなりません。

      arena serve triton \
        --name=resnet18 \
        --gpumemory=2 \
        --replicas=1 \
        --image=nvcr.io/nvidia/tritonserver:21.12-py3 \
        --data=oss-pvc:/data \
        --model-repository=/data/triton/model-repository \
        --allow-metrics=true
  4. 次のコマンドを実行して、デプロイメントのステータスを照会します。

    arena serve list -A

    期待される出力:

    NAMESPACE      NAME              TYPE    VERSION       DESIRED  AVAILABLE  ADDRESS         PORTS                   GPU
    default        resnet18-serving  Triton  202202141817  1        1          172.16.147.248  RESTFUL:8000,GRPC:8001  1

    AVAILABLEパラメーターの値がDESIREDパラメーターの値と等しい場合、モデルがデプロイされます。