モデルのエクスポート

このページでは、AutoML Tables を使用してカスタムモデルを Cloud Storage にエクスポートし、モデルをサーバーにダウンロードしてから、Docker を使用してモデルを予測に使用できるようにする方法について説明します。

エクスポートしたモデルは、Advanced Vector Extensions(AVX)命令セットをサポートする x86 アーキテクチャ CPU でのみ実行できます。

はじめに

モデルをエクスポートする手順は、以下のとおりです。

  1. モデルをエクスポートします
  2. モデルサーバーを実行します
  3. 予測をリクエストします

始める前に

このタスクを実行するには、次のタスクを完了しておく必要があります。

  • 始める前にの説明に従ってプロジェクトを設定します。
  • ダウンロードするモデルをトレーニングします
  • エクスポートしたモデルの実行に使用するサーバーに Cloud SDK をインストールし、初期化します。
  • Docker をサーバーにインストールします。
  • AutoML Tables モデルサーバーの Docker イメージを pull します。

    sudo docker pull gcr.io/cloud-automl-tables-public/model_server
    

モデルのエクスポート

2019 年 8 月 23 日より前に作成されたモデルはエクスポートできません。

Console

  1. Google Cloud Console で [AutoML テーブル] ページに移動します。

    [AutoML テーブル] ページに移動

  2. 左側のナビゲーション パネルで [モデル] タブを選択します。

  3. エクスポートするモデルの [その他の操作] メニューで [モデルをエクスポート] をクリックします。

    [モデルをエクスポート] を含む [その他の操作] メニュー

  4. 目的の場所で Cloud Storage フォルダを選択または作成します。

    バケットは、バケットの要件を満たしている必要があります。

    モデルを最上位のバケットにエクスポートすることはできません。少なくとも 1 レベルのフォルダを使用する必要があります。

  5. [エクスポート] をクリックします。

    モデルのエクスポート ウィンドウ

    次のセクションでは、エクスポートしたモデルをサーバーにダウンロードします。

REST とコマンドライン

モデルを Cloud Storage にエクスポートするには、models.export メソッドを使用します。

リクエストのデータを使用する前に、次のように置き換えます。

  • endpoint: グローバル ロケーションの場合は automl.googleapis.com、EU リージョンの場合は eu-automl.googleapis.com
  • project-id: Google Cloud プロジェクト ID
  • location:リソースのロケーション:グローバルの場合はus-central1、EUの場合はeu
  • model-id: デプロイするモデルの ID。例: TBL543
  • gcs-destination : Cloud Storage 内の出力先フォルダ。例: gs://export-bucket/exports

    モデルを最上位のバケットにエクスポートすることはできません。少なくとも 1 レベルのフォルダを使用する必要があります。

HTTP メソッドと URL:

POST https://endpoint/v1beta1/projects/project-id/locations/location/models/model-id:export

JSON 本文のリクエスト:

{
  "outputConfig": {
    "modelFormat": "tf_saved_model",
    "gcsDestination": {
      "outputUriPrefix": "gcs-destination"
    }
  }
}

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://endpoint/v1beta1/projects/project-id/locations/location/models/model-id:export"

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth application-default print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://endpoint/v1beta1/projects/project-id/locations/location/models/model-id:export" | Select-Object -Expand Content

次のような JSON レスポンスが返されます。

{
  "name": "projects/292381/locations/us-central1/operations/TBL543",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.automl.v1beta1.OperationMetadata",
    "createTime": "2019-12-30T18:23:47.728373Z",
    "updateTime": "2019-12-30T18:23:47.728373Z",
    "worksOn": [
      "projects/292381/locations/us-central1/models/TBL543"
    ],
    "exportModelDetails": {
      "outputInfo": {
        "gcsOutputDirectory": "gs://export-bucket/exports/model-export/tbl/tf_saved_model-automl_integration_test_model-2019-12-30T18:23:47.461Z/"
      }
    },
    "state": "RUNNING"
  }
}

モデルのエクスポートは長時間実行オペレーションです。オペレーションのステータスをポーリングするか、オペレーションが完了するまで待つことができます。詳細

モデルサーバーの実行

このタスクでは、エクスポートしたモデルを Cloud Storage からダウンロードし、Docker コンテナを起動して、モデルが予測リクエストを受信できるようにします。

モデルは、Docker コンテナ内で実行する必要があります。

モデルサーバーを実行するには:

  1. モデルを実行するマシンで、エクスポートしたモデルを保存するディレクトリに移動します。

  2. エクスポートしたモデルをダウンロードします。

    gsutil cp -r gcs-destination/* .

    ここで gcs-destination は Cloud Storage 内のエクスポートしたモデルの場所へのパスです。例:

    gsutil cp -r gs://export-us-central1/models/* .
    

    モデルは、以下のパスの現在のディレクトリにコピーされます。

    ./model-export/tbl/tf_saved_model-<model-name>-<export-timestamp>

  3. タイムスタンプを含むディレクトリの名前を変更します。

    mv model-export/tbl/tf_saved_model-<model-name>-<export-timestamp> model-export/tbl/<new-dir-name>
    

    タイムスタンプ形式は、ディレクトリを Docker で無効にします。

  4. 作成したディレクトリ名を使用して、Docker コンテナを起動します。

    docker run -v `pwd`/model-export/tbl/new_folder_name:/models/default/0000001 -p 8080:8080 -it gcr.io/cloud-automl-tables-public/model_server
    

モデルサーバーは、Ctrl-C を使用していつでも停止できます。

モデルサーバーの Docker コンテナの更新

モデルをエクスポートすると、モデルサーバーの Docker コンテナをダウンロードされます。このため、モデルサーバーを明示的に更新して、アップデートとバグの修正を取得する必要があります。次のコマンドを使用して、モデルサーバーを定期的に更新する必要があります。

    docker pull gcr.io/cloud-automl-tables-public/model_server

エクスポートしたモデルからの予測の取得

AutoML Tables イメージ コンテナのモデルサーバーが予測リクエストを処理し、予測結果を返します。

バッチ予測は、エクスポートしたモデルでは使用できません。

予測データの形式

予測リクエストのデータ(payload フィールド)には、次の JSON 形式を指定します。

{ "instances": [ { "column_name_1": value, "column_name_2": value, … } , … ] }

必要な JSON データ型は、列の AutoML Tables データ型によって異なります。詳細については、行オブジェクトの形式をご覧ください。

次の例は、カテゴリ列、数値配列、構造体の 3 つの列を持つリクエストを示しています。このリクエストには 2 つの行が含まれています。

{
  "instances": [
    {
      "categorical_col": "mouse",
      "num_array_col": [
        1,
        2,
        3
      ],
      "struct_col": {
        "foo": "piano",
        "bar": "2019-05-17T23:56:09.05Z"
      }
    },
    {
      "categorical_col": "dog",
      "num_array_col": [
        5,
        6,
        7
      ],
      "struct_col": {
        "foo": "guitar",
        "bar": "2019-06-17T23:56:09.05Z"
      }
    }
  ]
}

予測リクエストの作成

  1. リクエスト データをテキスト ファイルに入力します(tmp/request.json など)。

    ミニバッチ サイズと呼ばれる予測リクエストのデータ行数は、予測レイテンシとスループットに影響します。ミニバッチ サイズが大きいほど、レイテンシとスループットが高くなります。レイテンシを短縮するには、ミニバッチ サイズを小さくします。スループットを向上させるには、ミニバッチ サイズを増やします。最も一般的なミニバッチ サイズは、1、32、64、128、256、512、1024 です。

  2. 予測をリクエストします。

    curl -X POST --data @/tmp/request.json http://localhost:8080/predict
    

予測結果の形式

結果の形式は、モデルのタイプによって異なります。

分類モデルの結果

分類モデル(バイナリとマルチクラス)の予測結果は、ターゲット列の潜在値ごとに確率スコアを返します。このスコアの使用方法を決定する必要があります。たとえば、提供されたスコアからバイナリ分類を取得するには、しきい値を指定します。「A」と「B」の 2 つのクラスがある場合、「A」のスコアが選択したしきい値より大きい場合は「A」、そうでない場合は「B」と分類します。不均衡なデータセットの場合、しきい値が 100% または 0% に近づくことがあります。

分類モデルの結果ペイロードは、次の例のようになります。

{
  "predictions": [
    {
      "scores": [
        0.539999994635582,
        0.2599999845027924,
        0.2000000208627896
      ],
      "classes": [
        "apple",
        "orange",
        "grape"
      ]
    },
    {
      "scores": [
        0.23999999463558197,
        0.35999998450279236,
        0.40000002086278963
      ],
      "classes": [
        "apple",
        "orange",
        "grape"
      ]
    }
  ]
}

回帰モデルの結果

予測値は、予測リクエストの有効な各行に対して返されます。エクスポートしたモデルの予測間隔は返されません。

回帰モデルの結果ペイロードは、次の例のようになります。

{
  "predictions": [
    3982.3662109375,
    3982.3662109375
  ]
}