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デバイスにロードするレプリカの数を指定することもできます