モデルサーバーが、例えば未加工の Base64 イメージではなく、テンソルのような前処理済み入力を想定している場合、トランスフォーマーがそのギャップを埋めます。単一の InferenceService 内で、以下の3つのハンドラを順次実行します。
preprocessハンドラは、未加工の入力をモデルが想定するフォーマットに変換します。例えば、Base64 イメージをデコードしてテンソルに変換します。処理されたデータは、推論のためにプレディクターに転送されます。
プレディクターの応答は、クライアントに返される前に
postprocessハンドラを通過します。
デフォルトでは、トランスフォーマーは REST を介してプレディクターと通信します。
前提条件
開始する前に、以下が準備できていることを確認してください。
Service Mesh (ASM) 上で動作する KServe 環境。セットアップ手順については、「KServe と ASM の統合」をご参照ください。
ご利用のクラスターにアクセスできるように設定された
kubectl(任意) カスタムトランスフォーマーイメージをビルドする場合、インストール済みの Docker
(任意) カスタムイメージをプッシュする場合、コンテナレジストリへのアクセス
このチュートリアルでは KServe 0.10 を使用します。バージョンが異なると、必要な入力データ形式が異なる場合があります。アップストリームリファレンスについては、「Deploy Transformer with InferenceService」をご参照ください。
トランスフォーマー Docker イメージの作成
以下のいずれかのメソッドを選択します。
| メソッド | 使用するケース |
|---|---|
| ソースからビルド | トランスフォーマーのロジックをカスタマイズする必要がある場合 |
| ビルド済みイメージ | デフォルトのイメージトランスフォーマーを無修正で使用したい場合 |
ソースからビルド
KServe GitHub リポジトリの kserve/python ディレクトリからイメージをビルドします。
cd python
docker build -t <your-registry-url>/image-transformer:latest -f custom_transformer.Dockerfile .
docker push <your-registry-url>/image-transformer:latest<your-registry-url> を、ご利用のコンテナレジストリ URL (例:registry.example.com/ml-models) に置き換えてください。
ビルド済みイメージの使用
InferenceService YAML で、以下のイメージを直接使用します。
asm-registry.cn-hangzhou.cr.aliyuncs.com/asm/kserve-image-custom-transformer:0.10トランスフォーマーを使用した InferenceService のデプロイ
デフォルトでは、InferenceService は TorchServe を使用して PyTorch モデルをサービングします。この例では、事前学習済みの MNIST 手書き数字分類器を、カスタムイメージトランスフォーマーとともにデプロイします。
transformer-new.yamlという名前のファイルを作成します。apiVersion: serving.kserve.io/v1beta1 kind: InferenceService metadata: name: torch-transformer spec: predictor: model: modelFormat: name: pytorch storageUri: gs://kfserving-examples/models/torchserve/image_classifier/v1 transformer: containers: - image: asm-registry.cn-hangzhou.cr.aliyuncs.com/asm/kserve-image-custom-transformer:0.10 name: kserve-container command: - "python" - "-m" - "model" args: - --model_name - mnistフィールド 説明 spec.predictor.model.storageUriTorchServe によってサービングされる MNIST PyTorch モデルへの Google Cloud Storage パス spec.transformer.containers[].image受信イメージデータを前処理するトランスフォーマーイメージ spec.transformer.containers[].args--model_name mnistは、トランスフォーマーにターゲットとなるモデルを指示しますInferenceService をデプロイします。
kubectl apply -f transformer-new.yamlInferenceService の準備が完了するまで待ちます。
kubectl get inferenceservice torch-transformer続行する前に、
READY列にTrueと表示されることを確認してください。
予測の実行
入力データの準備
サンプル画像を Base64 でエンコードし、input.json という名前のファイルに保存します。次の例では、手書きの数字の画像を使用しています。

{
"instances": [
{
"image": {
"b64": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAAAw0lEQVR4nGNgGFggVVj4/y8Q2GOR83n+58/fP0DwcSqmpNN7oOTJw6f+/H2pjUU2JCSEk0EWqN0cl828e/FIxvz9/9cCh1zS5z9/G9mwyzl/+PNnKQ45nyNAr9ThMHQ/UG4tDofuB4bQIhz6fIBenMWJQ+7Vn7+zeLCbKXv6z59NOPQVgsIcW4QA9YFi6wNQLrKwsBebW/68DJ388Nun5XFocrqvIFH59+XhBAxThTfeB0r+vP/QHbuDCgr2JmOXoSsAAKK7bU3vISS4AAAAAElFTkSuQmCC"
}
}
]
}予測リクエストの送信
サービスホスト名を取得します。
SERVICE_NAME=torchserve-transformer SERVICE_HOSTNAME=$(kubectl get inferenceservice $SERVICE_NAME -o jsonpath='{.status.url}' | cut -d "/" -f 3) echo $SERVICE_HOSTNAME期待される出力:
torchserve-transformer.default.example.comASM イングレスゲートウェイ経由でリクエストを送信します。
イングレスゲートウェイの IP アドレスを確認するには、「イングレスゲートウェイの IP アドレスの取得」をご参照ください。
MODEL_NAME=mnist INPUT_PATH=@./input.json ASM_GATEWAY="<ingress-gateway-ip>" # ご利用のイングレスゲートウェイ IP アドレスに置き換えてください curl -v -H "Host: ${SERVICE_HOSTNAME}" -d $INPUT_PATH http://${ASM_GATEWAY}/v1/models/$MODEL_NAME:predict
結果の検証
リクエストが成功すると、HTTP 200 とともに JSON 形式の予測が返されます。
< HTTP/1.1 200 OK
< content-length: 19
< content-type: application/json
< server: istio-envoy
<
{"predictions":[2]}予測 [2] は、モデルが入力イメージを数字の 2 として分類したことを意味します。これにより、トランスフォーマーが Base64 イメージをデコードし、テンソルに変換して MNIST プレディクターに転送したことが確認できます。
次のステップ
KServe トランスフォーマーリファレンス (v0.10) -- カスタムトランスフォーマーのソースコードと例
KServe と ASM の統合 -- 追加の推論サービスデプロイパターン