このページでは、Google Cloud コンソールまたは Vertex AI API を使用して、カスタム トレーニング済みのモデルからオンライン(リアルタイム)予測を取得する方法について説明します。
オンライン予測の入力をフォーマットする
このセクションでは、予測入力インスタンスを JSON 形式にフォーマットしてエンコードする方法について説明します。この操作は、predict
または explain
メソッドを使用する場合に必要です。rawPredict
メソッドの場合は必要ありません。メソッドの選択については、エンドポイントにリクエストを送信するをご覧ください。
Python 用 Vertex AI SDK を使用して予測リクエストを送信する場合は、instances
フィールドなしでインスタンスのリストを指定します。たとえば、{ "instances": [
["the","quick","brown"], ... ] }
ではなく [
["the","quick","brown"], ... ]
と指定します。
モデルでカスタム コンテナを使用する場合は、入力を JSON 形式で記述する必要があります。また、コンテナで使用できる parameters
フィールドを追加する必要があります。詳細については、カスタム コンテナを含む予測入力をフォーマットするをご覧ください。
JSON 文字列としてインスタンスをフォーマットする
オンライン予測の基本的な形式はデータ インスタンスのリストです。これらは、トレーニング アプリケーションで入力を構成した方法に応じて、値のプレーンリストまたは JSON オブジェクトのメンバーのいずれかになります。scikit-learn と XGBoost のほとんどのモデルは入力として数値のリストを想定していますが、TensorFlow モデルはより複雑な入力にも対応しています。
次の例は、TensorFlow モデルの入力テンソルとインスタンス キーを示しています。
{"values": [1, 2, 3, 4], "key": 1}
次の規則に従う限り、JSON 文字列の構成は複雑になってもかまいません。
インスタンス データの最上位レベルは、Key-Value ペアの辞書である JSON オブジェクトにする必要があります。
インスタンス オブジェクト内の個々の値には、文字列、数字、またはリストを使用できます。JSON オブジェクトは埋め込めません。
リストには、同じ型(他のリストも含む)のアイテムのみが含まれている必要があります。文字列と数値を混在させることはできません。
オンライン予測の入力インスタンスを、projects.locations.endpoints.predict
呼び出しのメッセージ本文として渡します。詳細については、リクエスト本文のフォーマット要件をご覧ください。
各インスタンスを JSON 配列のアイテムにし、その配列を JSON オブジェクトの instances
フィールドとして指定します。次に例を示します。
{"instances": [
{"values": [1, 2, 3, 4], "key": 1},
{"values": [5, 6, 7, 8], "key": 2}
]}
予測入力のバイナリデータをエンコードする
バイナリデータは、JSON がサポートする UTF-8 エンコード文字列としてフォーマットできません。入力にバイナリデータがある場合は、base64 エンコーディングで表す必要があります。次の特殊なフォーマットが必要です。
エンコードされた文字列は、
b64
という 1 つのキーを持つ JSON オブジェクトとしてフォーマットする必要があります。Python 3 では、Base64 エンコードによりバイト シーケンスが出力されます。この出力を文字列に変換して JSON にシリアル化できるようにします。{'image_bytes': {'b64': base64.b64encode(jpeg_data).decode()}}
TensorFlow モデルのコードでは、入力 / 出力テンソルのエイリアスの名前を「_bytes」で終わらせる必要があります。
リクエストとレスポンスの例
このセクションでは、予測リクエスト本文とレスポンス本文の形式について説明します(TensorFlow、scikit-learn、XGBoost を例として使用)。
リクエスト本文の詳細
TensorFlow
リクエストの本文には、次の構造をしたデータが含まれています(JSON 表現)。
{
"instances": [
<value>|<simple/nested list>|<object>,
...
]
}
instances[]
オブジェクトは必須であり、予測の取得対象となるインスタンスのリストをこれに含める必要があります。
インスタンスのリストに含まれる各要素の構造は、モデルの入力定義によって決まります。インスタンスには、名前付き入力を(オブジェクトとして)含めることも、ラベルなし値のみを含めることもできます。
すべてのデータに名前付き入力が含まれるわけではありません。インスタンスは、単純な JSON 値(ブール値、数値、文字列)の場合もあれば、単純な値のリスト、または複雑なネスト構造のリストの場合もあります。
以下にリクエスト本文の例を示します。
各行が文字列値としてエンコードされた CSV データ:
{"instances": ["1.0,true,\\"x\\"", "-2.0,false,\\"y\\""]}
書式なしテキスト:
{"instances": ["the quick brown fox", "the lazy dog"]}
単語のリスト(文字列のベクトル)としてエンコードされた文:
{ "instances": [ ["the","quick","brown"], ["the","lazy","dog"], ... ] }
浮動小数点スカラー値:
{"instances": [0.0, 1.1, 2.2]}
整数のベクトル:
{ "instances": [ [0, 1, 2], [3, 4, 5], ... ] }
テンソル(この場合、2 次元のテンソル):
{ "instances": [ [ [0, 1, 2], [3, 4, 5] ], ... ] }
画像は、さまざまな方法で表現できます。次のエンコード スキームでは、最初の 2 つの次元は画像の行と列を表し、3 つ目の次元に各ピクセルの R、G、B 値のリスト(ベクトル)が含まれます。
{ "instances": [ [ [ [138, 30, 66], [130, 20, 56], ... ], [ [126, 38, 61], [122, 24, 57], ... ], ... ], ... ] }
データのエンコード
JSON 文字列は UTF-8 としてエンコードする必要があります。バイナリデータを送信するには、データを Base64 エンコードし、バイナリとしてマークする必要があります。JSON 文字列をバイナリとしてマークするには、b64
という名前の単一の属性の JSON オブジェクトに置き換えます。
{"b64": "..."}
次の例は、Base64 エンコードを必要とする 2 つのシリアル化された tf.Examples
インスタンスを示しています(例示のための架空データ)。
{"instances": [{"b64": "X5ad6u"}, {"b64": "IA9j4nx"}]}
次の例は、base64 エンコードを必要とする、JPEG 画像の 2 つのバイト文字列を示しています(例示のための架空のデータ)。
{"instances": [{"b64": "ASa8asdf"}, {"b64": "JLK7ljk3"}]}
複数の入力テンソル
一部のモデルでは、基盤となる TensorFlow グラフで複数の入力テンソルが受け入れられます。この場合、JSON の名前と値のペアの名前を使用して入力テンソルを識別します。
入力テンソルの別名 "tag"(文字列)と "image"(Base64 でエンコードされた文字列)を持つグラフの場合:
{ "instances": [ { "tag": "beach", "image": {"b64": "ASa8asdf"} }, { "tag": "car", "image": {"b64": "JLK7ljk3"} } ] }
入力テンソルの別名 "tag"(文字列)と "image"(8 ビット整数の 3 次元配列)を持つグラフの場合:
{ "instances": [ { "tag": "beach", "image": [ [ [138, 30, 66], [130, 20, 56], ... ], [ [126, 38, 61], [122, 24, 57], ... ], ... ] }, { "tag": "car", "image": [ [ [255, 0, 102], [255, 0, 97], ... ], [ [254, 1, 101], [254, 2, 93], ... ], ... ] }, ... ] }
scikit-learn
リクエストの本文には、次の構造をしたデータが含まれています(JSON 表現)。
{
"instances": [
<simple list>,
...
]
}
instances[]
オブジェクトは必須であり、予測の取得対象となるインスタンスのリストをこれに含める必要があります。次の例では、各入力インスタンスは浮動小数点数のリストです。
{
"instances": [
[0.0, 1.1, 2.2],
[3.3, 4.4, 5.5],
...
]
}
入力インスタンスの次元は、モデルが想定している次元と一致している必要があります。たとえば、モデルに 3 つの特徴が必要な場合、各入力インスタンスの長さは 3 である必要があります。
XGBoost
リクエストの本文には、次の構造をしたデータが含まれています(JSON 表現)。
{
"instances": [
<simple list>,
...
]
}
instances[]
オブジェクトは必須であり、予測の取得対象となるインスタンスのリストをこれに含める必要があります。次の例では、各入力インスタンスは浮動小数点数のリストです。
{
"instances": [
[0.0, 1.1, 2.2],
[3.3, 4.4, 5.5],
...
]
}
入力インスタンスの次元は、モデルが想定している次元と一致している必要があります。たとえば、モデルに 3 つの特徴が必要な場合、各入力インスタンスの長さは 3 である必要があります。
Vertex AI は、XGBoost の入力インスタンスのスパース表現をサポートしていません。
オンライン予測サービスは、ゼロと NaN
を区別して解釈します。特徴値がゼロの場合、対応する入力で 0.0
を使用します。特徴値が不足している場合は、対応する入力で "NaN"
を使用します。
次の例は、単一入力インスタンスを含む予測リクエストを表しています。ここで最初の特徴値は 0.0、2 番目の特徴値は 1.1、3 番目の特徴値はありません。
{"instances": [[0.0, 1.1, "NaN"]]}
PyTorch
モデルが PyTorch のビルド済みコンテナを使用する場合、TorchServe のデフォルト ハンドラは、各インスタンスが data
フィールドでラップされることを想定しています。例:
{
"instances": [
{ "data": , <value> },
{ "data": , <value> }
]
}
レスポンス本文の詳細
呼び出しが成功した場合、レスポンスの本文には、リクエストの本文内のインスタンスごとに、同じ順序で 1 つの予測エントリが含まれます。
{
"predictions": [
{
object
}
],
"deployedModelId": string
}
いずれかのインスタンスの予測に失敗した場合、レスポンスの本文には予測が含まれません。代わりに、単一のエラーエントリが含まれています。
{
"error": string
}
predictions[]
オブジェクトには、リクエストのインスタンスごとに 1 つの予測からなるリストが含まれます。
エラーの場合、error
文字列には問題を説明するメッセージが含まれます。インスタンスの処理中にエラーが発生した場合は、予測リストではなくエラーが返されます。
インスタンスごとに 1 つの予測があっても、予測の形式はインスタンスの形式に直接関係しません。予測には、モデルに定義された出力コレクションで指定されている形式が適用されます。予測のコレクションは JSON リストで返されます。リストの各メンバーは、単純な値、リスト、または多様な複雑度の JSON オブジェクトのいずれかです。モデルに複数の出力テンソルがある場合、各予測は各出力の名前と値のペアを含む JSON オブジェクトになります。名前はグラフの出力エイリアスを識別します。
レスポンス本文の例
TensorFlow
次の例は、いくつかの可能なレスポンスを示しています。
-
3 つの入力インスタンスの単純な予測セット。各予測は整数値です。
{"predictions": [5, 4, 3], "deployedModelId": 123456789012345678 }
-
より複雑な予測セット。予測のそれぞれに、出力テンソルに対応する
label
とscores
という 2 つの名前付き値が含まれます。label
の値は予測カテゴリ("car" または "beach")であり、scores
には可能性のあるカテゴリでそのインスタンスで発生する可能性のあることのリストが含まれます。{ "predictions": [ { "label": "beach", "scores": [0.1, 0.9] }, { "label": "car", "scores": [0.75, 0.25] } ], "deployedModelId": 123456789012345678 }
-
入力インスタンスの処理中にエラーが発生した場合のレスポンス:
{"error": "Divide by zero"}
scikit-learn
次の例は、いくつかの可能なレスポンスを示しています。
-
3 つの入力インスタンスの単純な予測セット。各予測は整数値です。
{"predictions": [5, 4, 3], "deployedModelId": 123456789012345678 }
-
入力インスタンスの処理中にエラーが発生した場合のレスポンス:
{"error": "Divide by zero"}
XGBoost
次の例は、いくつかの可能なレスポンスを示しています。
-
3 つの入力インスタンスの単純な予測セット。各予測は整数値です。
{"predictions": [5, 4, 3], "deployedModelId": 123456789012345678 }
-
入力インスタンスの処理中にエラーが発生した場合のレスポンス:
{"error": "Divide by zero"}
エンドポイントにリクエストを送信する
リクエストを送信するには、次の 3 つの方法があります。
未加工の予測リクエスト:
rawPredict
にリクエストを送信します。これにより、このページの入力形式に記載されているガイドラインに従うのではなく、任意の HTTP ペイロードを使用できます。未加工の予測は、次のような場合に取得できます。- カスタム コンテナを使用しており、ガイドラインとは異なるリクエストを受信し、レスポンスを送信している場合。
- 低レイテンシを必要とする場合。
rawPredict
は、シリアル化のステップをスキップし、リクエストを予測コンテナに直接転送します。 - NVIDIA Triton で予測を行っている場合。
説明リクエスト: リクエストを
explain
に送信します。Vertex Explainable AI 用にModel
を構成している場合は、オンライン説明を取得できます。オンライン説明リクエストはオンライン予測リクエストと同じ形式で、同様のレスポンスを返します。唯一の違いは、オンライン説明レスポンスには予測のほかに特徴アトリビューションが含まれる点です。
オンライン予測リクエストを送信する
gcloud
次の例では、gcloud ai endpoints predict
コマンドを使用します。
ローカル環境のファイルに書き込むには、次の JSON オブジェクトを作成します。ファイル名は任意です。この例では、
request.json
という名前を使用しています。{ "instances": INSTANCES }
次のように置き換えます。
- INSTANCES: 予測を取得するインスタンスの JSON 配列。各インスタンスの形式は、トレーニング済みの ML モデルが想定する入力によって異なります。詳細については、オンライン予測の入力形式をご覧ください。
次のコマンドを実行します。
gcloud ai endpoints predict ENDPOINT_ID \ --region=LOCATION_ID \ --json-request=request.json
次のように置き換えます。
- ENDPOINT_ID: エンドポイントの ID。
- LOCATION_ID: Vertex AI を使用するリージョン。
REST
リクエストのデータを使用する前に、次のように置き換えます。
- LOCATION_ID: Vertex AI を使用するリージョン。
- PROJECT_ID: 実際のプロジェクト ID
- ENDPOINT_ID: エンドポイントの ID。
- INSTANCES: 予測を取得するインスタンスの JSON 配列。各インスタンスの形式は、トレーニング済みの ML モデルが想定する入力によって異なります。詳細については、オンライン予測の入力形式をご覧ください。
HTTP メソッドと URL:
POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:predict
リクエストの本文(JSON):
{ "instances": INSTANCES }
リクエストを送信するには、次のいずれかのオプションを選択します。
curl
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:predict"
PowerShell
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:predict" | Select-Object -Expand Content
- PREDICTIONS: リクエスト本文に含めたインスタンスごとに 1 つの予測が存在する JSON 配列。
-
DEPLOYED_MODEL_ID: 予測を行った
DeployedModel
の ID。
{ "predictions": PREDICTIONS, "deployedModelId": "DEPLOYED_MODEL_ID" }
Java
このサンプルを試す前に、Vertex AI クイックスタート: クライアント ライブラリの使用にある Java の設定手順を完了してください。詳細については、Vertex AI Java API のリファレンス ドキュメントをご覧ください。
Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Node.js
このサンプルを試す前に、Vertex AI クイックスタート: クライアント ライブラリの使用にある Node.js の設定手順を完了してください。詳細については、Vertex AI Node.js API のリファレンス ドキュメントをご覧ください。
Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。
Python
Vertex AI SDK for Python のインストールまたは更新の方法については、Vertex AI SDK for Python をインストールするをご覧ください。 詳細については、Python API リファレンス ドキュメントをご覧ください。
専用エンドポイントにオンライン予測リクエストを送信する
専用エンドポイントは新しい URL パスを使用します。このパスは、REST API の dedicatedEndpointDns
フィールドまたは Vertex AI SDK for Python の Endpoint.dedicated_endpoint_dns
から取得できます。次のコードを使用して、エンドポイント パスを手動で作成することもできます。
f"https://ENDPOINT_ID.LOCATION_ID-PROJECT_NUMBER.prediction.vertexai.goog/v1/projects/PROJECT_NUMBER/locations/LOCATION_ID/endpoints/ENDPOINT_ID:predict"
次のように置き換えます。
- ENDPOINT_ID: エンドポイントの ID。
- LOCATION_ID: Vertex AI を使用するリージョン。
- PROJECT_NUMBER: プロジェクト番号。これはプロジェクト ID とは異なります。プロジェクト番号は、Google Cloud コンソールでプロジェクトの [プロジェクトの設定] ページを表示すると確認できます。
Vertex AI SDK for Python を使用して専用エンドポイントに予測を送信するには、use_dedicated_endpoint
パラメータを True
に設定します。
endpoint.predict(instances=instances, use_dedicated_endpoint=True)
オンラインの未加工予測リクエストを送信する
gcloud
次の例では、gcloud ai endpoints raw-predict
コマンドを使用しています。
-
コマンドラインで指定された REQUEST で JSON オブジェクトを使用して予測をリクエストするには:
gcloud ai endpoints raw-predict ENDPOINT_ID \ --region=LOCATION_ID \ --request=REQUEST
image.jpeg
ファイルに保存されている画像と適切なContent-Type
ヘッダーを使用して予測をリクエストするには:gcloud ai endpoints raw-predict ENDPOINT_ID \ --region=LOCATION_ID \ --http-headers=Content-Type=image/jpeg \ --request=@image.jpeg
次のように置き換えます。
- ENDPOINT_ID: エンドポイントの ID。
- LOCATION_ID: Vertex AI を使用するリージョン。
- REQUEST: 予測を取得するリクエストのコンテンツ。リクエストの形式は、カスタム コンテナが想定するものによって異なります。JSON オブジェクトとは限りません。
Python
Vertex AI SDK for Python のインストールまたは更新の方法については、Vertex AI SDK for Python をインストールするをご覧ください。 詳細については、Python API リファレンス ドキュメントをご覧ください。
レスポンスには次の HTTP ヘッダーが含まれます。
X-Vertex-AI-Endpoint-Id
: この予測を処理したEndpoint
の ID。X-Vertex-AI-Deployed-Model-Id
: この予測を処理したエンドポイントのDeployedModel
の ID。
オンライン説明リクエストを送信する
gcloud
次の例では、gcloud ai endpoints explain
コマンドを使用します。
ローカル環境のファイルに書き込むには、次の JSON オブジェクトを作成します。ファイル名は任意です。この例では、
request.json
という名前を使用しています。{ "instances": INSTANCES }
次のように置き換えます。
- INSTANCES: 予測を取得するインスタンスの JSON 配列。各インスタンスの形式は、トレーニング済みの ML モデルが想定する入力によって異なります。詳細については、オンライン予測の入力形式をご覧ください。
次のコマンドを実行します。
gcloud ai endpoints explain ENDPOINT_ID \ --region=LOCATION_ID \ --json-request=request.json
次のように置き換えます。
- ENDPOINT_ID: エンドポイントの ID。
- LOCATION_ID: Vertex AI を使用するリージョン。
必要に応じて、
Endpoint
の特定のDeployedModel
に説明リクエストを送信する場合は、--deployed-model-id
フラグを指定します。gcloud ai endpoints explain ENDPOINT_ID \ --region=LOCATION \ --deployed-model-id=DEPLOYED_MODEL_ID \ --json-request=request.json
前述のプレースホルダのほかに、次のコードを置き換えます。
-
DEPLOYED_MODEL_ID(省略可): 説明を取得する、デプロイ済みモデルの ID。この ID は
predict
メソッドのレスポンスに含まれます。特定のモデルの説明をリクエストする必要があり、複数のモデルが同じエンドポイントにデプロイされている場合は、この ID を使用して、その特定のモデルに説明が返されるようにします。
REST
リクエストのデータを使用する前に、次のように置き換えます。
- LOCATION_ID: Vertex AI を使用するリージョン。
- PROJECT_ID: 実際のプロジェクト ID
- ENDPOINT_ID: エンドポイントの ID。
- INSTANCES: 予測を取得するインスタンスの JSON 配列。各インスタンスの形式は、トレーニング済みの ML モデルが想定する入力によって異なります。詳細については、オンライン予測の入力形式をご覧ください。
HTTP メソッドと URL:
POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:explain
リクエストの本文(JSON):
{ "instances": INSTANCES }
リクエストを送信するには、次のいずれかのオプションを選択します。
curl
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:explain"
PowerShell
リクエスト本文を request.json
という名前のファイルに保存して、次のコマンドを実行します。
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:explain" | Select-Object -Expand Content
- PREDICTIONS: リクエスト本文に含めたインスタンスごとに 1 つの予測が存在する JSON 配列。
- EXPLANATIONS: 説明の JSON 配列(予測ごとに 1 つ)。
-
DEPLOYED_MODEL_ID: 予測を行った
DeployedModel
の ID。
{ "predictions": PREDICTIONS, "explanations": EXPLANATIONS, "deployedModelId": "DEPLOYED_MODEL_ID" }
Python
Vertex AI SDK for Python のインストールまたは更新の方法については、Vertex AI SDK for Python をインストールするをご覧ください。 詳細については、Python API リファレンス ドキュメントをご覧ください。
次のステップ
- オンライン予測のロギングについて理解する。