GPU推論

モデル・デプロイメントを使用してGPUインスタンスで推論を実行する方法について学習します。GPUは、CPUと比較してコンピュート集中型モデルにより、パフォーマンス上の利点を提供します。

GPUは、機械学習推論のユース・ケース(主に、大規模言語モデル、音声、画像認識などのディープ・ラーニング・モデル)に最適です。GPUではパラレル処理機能と高メモリー帯域幅が使用されるため、従来のCPUよりもはるかに高速に大量のデータおよび複雑な計算を処理できます。その結果、推論時間が大幅に短縮され、パフォーマンスが向上します。

データ・サイエンス・モデルのデプロイメントでは、いくつかの方法を使用して、GPUシェイプへのモデルのデプロイをサポートしています:

フル管理

サービスでは、デフォルトの推論サーバーを使用して、選択したGPUシェイプにモデルをデプロイします。score.pyファイルを使用して、GPUの使用方法を制御できます。

コンテナ・ベース

推論サーバーには独自のカスタム・コンテナを使用します。コンテナとscore.pyファイルの両方からGPUを使用します。

NVIDIA Triton推論サーバー

Triton Inference Serverは優れたGPU使用量を提供し、GPUをゼロから使いやすく構築されています。Tritonコンテナは、モデル・デプロイメントの作成時に使用できます。

モデル・アーティファクトの準備

モデル・デプロイメントには、モデル・カタログに格納されているモデル・アーティファクトと、モデルがアクティブ状態である必要があります。モデル・アーティファクトのscore.pyは、GPUデバイス変数を公開する必要があります。load_model関数は、モデルを選択したGPUデバイスに移動する必要があります。次に、predict関数は入力テンソルをGPUデバイスに移動する必要があります。GPUデバイスで推論を計算した後、関数から戻る前に出力テンソルをCPUに戻す必要があります。

ヒント

ADS SDKを使用してモデル・アーティファクトを自動的に生成することを検討してください。

ADS SDKは、GPUがPyTorchおよびTensorFlowフレームワークに対してサポートするscore.pyファイルの自動生成を提供します。

次のscore.py例では、使用可能なGPUデバイスを使用して、Resnet152 PyTorchモデルで推論を実行します。

import numpy as np
import os
import torch
from torch import nn
import io
from PIL import Image
import base64
from random import randint
  
  
Image.MAX_IMAGE_PIXELS = None
  
model_name = 'PyTorch_ResNet152.pth'
  
# get an available GPU device 
def get_torch_device():
    num_devices = torch.cuda.device_count()
    if num_devices == 0:
        return "cpu"
    if num_devices == 1:
        return "cuda:0"
    else:
        return f"cuda:{randint(0, num_devices-1)}"
  
print("Device selected for inference", get_torch_device())
device = torch.device(get_torch_device())
 
def load_model(model_file_name=model_name):
    """
    Loads model from the serialized format
  
    Returns
    -------
    model:  Pytorch model instance
    """
    print(f"Devcie {device}")
    model_dir = os.path.dirname(os.path.realpath(__file__))
    contents = os.listdir(model_dir)
    if model_file_name in contents:
        model.load_state_dict(torch.load(os.path.abspath(model_file_name)))    
        model = model.to(device)
        print(f"model saved to {model.get_device()}")
        return model
    else:
        raise FileNotFoundError(f'{model_file_name} is not found in model directory {model_dir}.')
 
def predict(data, model=load_model()):
    """
    Returns prediction given the model and data to predict
  
    Parameters
    ----------
    model: Model instance returned by load_model API
    data: Data format in json
  
    Returns
    -------
    predictions: Output from scoring server
        Format: {'prediction':output from model.predict method}
  
    """
  
    img_bytes = io.BytesIO(base64.b64decode(data.encode('utf-8')))
    image = Image.open(img_bytes).resize((224, 224))
    arr = np.array(image)
    X = torch.FloatTensor(np.transpose(arr, axes=(2, 0, 1))).unsqueeze(0)
    X = X.to(device)
    with torch.no_grad():
        Y = model(X).to("cpu")
        pred = torch.nn.functional.softmax(Y[0], dim=0).argmax().item()
    return {'prediction': pred}

モデル・ランタイム依存関係を持つConda環境

モデル・アーティファクトのruntime.yamlファイルには、GPU依存関係を含むconda環境が含まれている必要があります。

次の例では、runtime.yamlファイルは、INFERENCE_ENV_PATH環境変数で定義されたオブジェクト・ストレージ・パスから公開済のconda環境をプルするようにモデル・デプロイメントに指示します:

MODEL_ARTIFACT_VERSION: '3.0'
MODEL_DEPLOYMENT:
  INFERENCE_CONDA_ENV:
    INFERENCE_ENV_PATH: oci://service-conda-packs@id19sfcrra6z/service_pack/gpu/PyTorch_1.10_for_GPU_on_Python_3.8/1.0/pytorch110_p38_gpu_v1
    INFERENCE_ENV_SLUG: pytorch_pack_v1
    INFERENCE_ENV_TYPE: data_science
    INFERENCE_PYTHON_VERSION: 3.8

モデル・デプロイメントの作成

GPUモデル・アーティファクトの作成後、モデル・デプロイメントを作成し、サポートされているGPUシェイプのいずれかを選択します。

モデル・デプロイメントでは、推論サーバーを使用する場合、独自のコンテナの持込みを実行時の依存関係としてサポートします。モデル・デプロイメントの作成時に、GPUシェイプのいずれかを選択する必要があります。

モデル・レプリカ

サービス管理推論サーバーを使用する場合、モデル・デプロイメントでは、複数のモデル・レプリカが使用可能なGPUカードにロードされ、スループットが向上します。モデル・レプリカの数は次に基づいて計算されます。

  • モデルのサイズ。

  • GPUカードで利用可能なメモリ。

  • GPUカード数。

  • コンピュート・シェイプで使用可能な論理CPUコア。

たとえば、モデルはメモリーに2 GBを取り、16 GB GPUメモリーを搭載した1 GPUカードを持つVM.GPU2.1シェイプが選択されています。モデル・デプロイメントでは、モデルのロードにGPUメモリーの割合(約70%)が割り当てられ、推論中に残りのメモリーが実行時計算用に保存されます。モデル・デプロイメントでは、1つのGPUカードに5つのレプリカ(メモリー内のモデルの16*(0.7)/2 GBサイズ)がロードされます。2枚のカードが使用可能な場合は、各カードに5つのモデルが搭載された合計10個のモデル複製がロードされます。

自動生成された score.pyファイルでは、モデル複製のGPUカードへの配布はランダムなアルゴリズムに基づいて行われ、各カードにほぼ同数の複製が統計的に配置されます。ただし、WEB_CONCURRENCYアプリケーション環境変数を使用して、レプリカの数を変更できます。

GPU推論のためのTritonの使用

NVIDIA Triton Inference Serverは、チームがGPUまたはCPUベースのインフラストラクチャ上の任意のフレームワークからトレーニング済みのAIモデルを導入、実行、拡張できるようにすることで、AI推論を合理化および標準化します。

モデル・デプロイメントで使用するNVIDIA Triton推論サーバーの設定

GPU推論を有効にするには、config.pbtxtにインスタンス・グループにKIND_GPUが含まれている必要があります。インスタンス・グループ構成を変更して、モデルがGPUデバイスにロードするレプリカの数を指定することもできます