NTT DATA TECH
🦁

Vertex AI で実現するオンライン需要予測 — ブラウザのみで完結する構築ガイド

に公開

Vertex AI で実現するオンライン需要予測 — ブラウザのみで完結する構築ガイド

はじめに

この手順でできること

Google Cloud の Vertex AI を使用して、オンライン(リアルタイム)需要予測 を REST API 経由で実行できる環境をハンズオンで構築します。

通常、Vertex AI Forecast(AutoML Forecasting)はバッチ推論のみ対応ですが、Tabular Workflow for Forecasting テンプレートを使用することで、学習済みモデルを Vertex AI Endpoint にデプロイし、API 経由のオンライン推論 が可能になります。

💡 ポイント: すべての手順を Google Cloud コンソール(ブラウザ GUI)のみ で完結できます。ローカル環境へのツールインストールは不要です。

アーキテクチャ概要

BigQuery (公開データ: Iowa Liquor Sales)
    ↓ SQLクエリで前処理
BigQuery (前処理済みテーブル)
    ↓ Vertex AI Pipelines テンプレートギャラリー
Tabular Workflow for Forecasting パイプライン
  ├─ データ検証
  ├─ 特徴量エンジニアリング
  ├─ AutoML Forecasting 学習
  ├─ モデル評価
  └─ Model Registry に登録
    ↓ コンソールからデプロイ
Vertex AI Endpoint (オンライン推論)
    ↓ REST API / コンソールUIでテスト
予測結果(JSON)

使用データセット

項目 内容
データセット名 Iowa Liquor Sales
BigQuery テーブル bigquery-public-data.iowa_liquor_sales.sales
ライセンス CC0(パブリックドメイン) — 商用・非商用問わず自由に利用可能
内容 アイオワ州における酒類販売の取引記録(日付、店舗、商品カテゴリ、販売数量など)

前提条件

  • Google Cloud プロジェクトが作成済みであること
  • プロジェクトに課金アカウントが紐付けられていること
  • プロジェクトのオーナーまたは編集者権限を持つアカウントでログインしていること
  • Web ブラウザ(Chrome 推奨)を使用できること

⚠️ 重要: 構築完了後は必ずクリーンアップを実施してください。Endpoint を削除し忘れると継続的に課金されます。


1. GCP API の有効化

使用するサービスの API を有効化します。

手順

  1. Google Cloud コンソール にログイン
  2. 画面上部のプロジェクトセレクタで、使用するプロジェクトを選択
  3. 左側ナビゲーションメニュー 「API とサービス」 > 「ライブラリ」 をクリック

以下の 5 つの API を検索して有効化します:

API 名 検索キーワード
Vertex AI API Vertex AI
BigQuery API BigQuery
Cloud Storage API Cloud Storage
Compute Engine API Compute Engine
Dataflow API Dataflow

各 API について:

  1. 検索ボックスに API 名を入力
  2. 検索結果から対象の API をクリック
  3. 「有効にする」 ボタンをクリック
  4. 「API が有効です」と表示されれば完了

📝 すでに有効になっている場合は「管理」ボタンが表示されます。その場合は操作不要です。


2. Cloud Storage バケットの作成

パイプラインの中間データやアーティファクトを保存するためのバケットを作成します。

手順

  1. ナビゲーションメニュー 「Cloud Storage」 > 「バケット」 をクリック
  2. 「作成」 ボタンをクリック
  3. 以下を設定:
設定項目
バケット名 {あなたのプロジェクトID}-forecast-pipeline
ロケーション タイプ Region
リージョン us-central1 (Iowa)
ストレージクラス Standard(デフォルト)
アクセス制御 均一(デフォルト)
  1. 「作成」 をクリック

📝 バケット名はグローバルで一意である必要があります。プロジェクト ID をプレフィックスに使うことで重複を避けられます。

📝 リージョンは us-central1 を選択してください。BigQuery 公開データセットとの互換性の観点から推奨されます。


3. IAM 権限の確認

パイプライン実行に必要な IAM 権限を確認します。Compute Engine のデフォルト サービスアカウントにはプロジェクト 編集者 ロールが自動付与されているため、本手順で必要な権限は既に付与済みです。ここでは確認のみ行います。

手順

  1. ナビゲーションメニュー 「IAM と管理」 > 「IAM」 をクリック
  2. プリンシパル一覧から Compute Engine のデフォルト サービスアカウント を探す
    • 形式: {数値}-compute@developer.gserviceaccount.com
  3. 該当アカウントの鉛筆アイコン(編集)をクリック
  4. 以下のロールが付与されていることを確認:
ロール 説明
編集者 (roles/editor) プロジェクトリソースの幅広い操作権限(デフォルトで付与済み)

📝 編集者ロールには Vertex AI、BigQuery、Cloud Storage に対する操作権限が含まれているため、追加のロール付与は不要です。

⚠️ Compute Engine デフォルト サービスアカウント使用時の注意
本手順ではパイプライン実行のサービスアカウントとして Compute Engine のデフォルト サービスアカウント({数値}-compute@developer.gserviceaccount.com)を使用しますが、以下のリスクがあります:

  • 過剰な権限: デフォルト サービスアカウントにはプロジェクト 編集者 ロールが自動付与されていることが多く、必要以上に広い権限を持ちます。万が一サービスアカウントキーが漏洩した場合、プロジェクト内のほぼすべてのリソースが操作可能になります。
  • 共有リスク: デフォルト サービスアカウントは Compute Engine VM、Cloud Functions、App Engine など複数のサービスで共有されるため、一つのサービスの侵害が他のサービスにも波及します。
  • 監査の困難さ: 複数のサービスが同一アカウントを使用するため、Cloud Audit Logs でどのサービスがどの操作を行ったか特定しにくくなります。

本番環境では、最小権限の原則に従い、パイプライン専用のサービスアカウントを作成して必要なロールのみを付与することを強く推奨します。 本手順は学習・検証目的のため、簡便さを優先してデフォルト サービスアカウントを使用しています。


4. 公開データセットの確認

BigQuery の公開データセット「Iowa Liquor Sales」のスキーマとデータを確認します。

手順

  1. ナビゲーションメニュー 「BigQuery」 をクリック(BigQuery Studio が開きます)

  2. 左上アイコンの エクスプローラー をクリック

  3. エクスプローラーの 「+ データを追加」 をクリック

  4. フィルタ条件の 「一般公開データセット」 をクリック

  5. 検索ボックスに iowa liquor と入力

  6. 「Iowa Liquor Retail Sales」 を選択し、「データセットを表示」 をクリック

または、SQL エディタで以下のクエリを直接実行してスキーマとデータ量を確認できます:

-- テーブルのスキーマと行数を確認
SELECT
  column_name,
  data_type
FROM `bigquery-public-data.iowa_liquor_sales.INFORMATION_SCHEMA.COLUMNS`
WHERE table_name = 'sales';
-- データの概要を確認
SELECT
  COUNT(*) AS total_rows,
  MIN(date) AS min_date,
  MAX(date) AS max_date,
  COUNT(DISTINCT store_number) AS unique_stores,
  COUNT(DISTINCT category_name) AS unique_categories
FROM `bigquery-public-data.iowa_liquor_sales.sales`;

確認ポイント:

  • date: 販売日
  • store_number: 店舗番号
  • category_name: 商品カテゴリ名
  • bottles_sold: 販売本数(これが予測対象)

5. データの前処理

需要予測に適した形式にデータを前処理し、自プロジェクトの BigQuery テーブルに保存します。

5-1. データセットの作成

  1. BigQuery コンソールの左側パネルで、自分のプロジェクト名の右側にある 「⋮」(三点メニュー) をクリック

  2. 「データセットを作成」 を選択

  3. 以下を設定:

設定項目
データセット ID forecast_dataset
ロケーション US(米国の複数のリージョン)
  1. 「データセットを作成」 をクリック

5-2. 前処理 SQL の実行

BigQuery の SQL エディタに以下のクエリを貼り付けて実行します。
このクエリは、日次 × 店舗 × 商品カテゴリ別の販売数量を集計し、欠損日を 0 で補完します。

-- 前処理: 日次 × 店舗 × カテゴリ別に集計し、欠損日を補完
CREATE OR REPLACE TABLE `forecast_dataset.iowa_liquor_daily` AS

WITH
  -- 対象データの抽出と日次集計
  daily_sales AS (
    SELECT
      date,
      CAST(store_number AS STRING) AS store_id,
      category_name,
      SUM(bottles_sold) AS bottles_sold,
      SUM(sale_dollars) AS sale_dollars
    FROM `bigquery-public-data.iowa_liquor_sales.sales`
    WHERE
      date BETWEEN DATE_SUB(CURRENT_DATE(), INTERVAL 2 YEAR) AND CURRENT_DATE()
      AND store_number IS NOT NULL
      AND category_name IS NOT NULL
      AND bottles_sold > 0
    GROUP BY date, store_number, category_name
  ),

  -- 売上上位の店舗×カテゴリに絞る(データ量の制御)
  top_series AS (
    SELECT
      store_id,
      category_name,
      SUM(bottles_sold) AS total_sold
    FROM daily_sales
    GROUP BY store_id, category_name
    HAVING COUNT(DISTINCT date) >= 100  -- 100日以上データがある組合せのみ
    ORDER BY total_sold DESC
    LIMIT 50  -- 上位50系列に絞る
  ),

  -- 日付マスタ(連続した日付を生成)
  date_spine AS (
    SELECT date
    FROM UNNEST(
      GENERATE_DATE_ARRAY(
        DATE_SUB(CURRENT_DATE(), INTERVAL 2 YEAR),
        CURRENT_DATE(),
        INTERVAL 1 DAY
      )
    ) AS date
  ),

  -- 対象の店舗×カテゴリと日付の全組み合わせを生成
  all_combinations AS (
    SELECT
      d.date,
      t.store_id,
      t.category_name
    FROM date_spine d
    CROSS JOIN top_series t
  )

-- 全組み合わせに対して販売データを LEFT JOIN し、欠損を 0 で補完
SELECT
  ac.date,
  ac.store_id,
  ac.category_name,
  CONCAT(ac.store_id, '_', ac.category_name) AS time_series_id,
  COALESCE(ds.bottles_sold, 0) AS bottles_sold,
  COALESCE(ds.sale_dollars, 0.0) AS sale_dollars
FROM all_combinations ac
LEFT JOIN daily_sales ds
  ON ac.date = ds.date
  AND ac.store_id = ds.store_id
  AND ac.category_name = ds.category_name
ORDER BY time_series_id, date;

実行方法:

  1. BigQuery コンソールで 「+ 新しいクエリ」 をクリック
  2. 上記の SQL をすべて貼り付ける
  3. 「実行」 ボタンをクリック
  4. 「このステートメントで新しいテーブル iowa_liquor_daily が作成されました。」と表示されれば成功

📝 このクエリは売上上位 50 系列 × 直近 2 年間のデータを生成します。学習コストを抑えつつ、十分な精度を確保するためのバランスです。

5-3. Vertex AI データセットの作成

パイプライン実行時に必要となる Vertex AI データセットを作成します。

  1. ナビゲーションメニュー 「Vertex AI」 > 「データセット」 をクリック
  2. 「作成」 をクリック
  3. 以下を設定:
設定項目
データセット名 iowa-liquor-dataset
データタイプ 表形式
目標 予測
リージョン us-central1
  1. 「作成」 をクリック
  2. データソースの選択画面で 「テーブルまたはビューを BigQuery から選択」 を選択
  3. forecast_dataset.iowa_liquor_daily テーブルを指定して 「続行」 をクリック
  4. データセットの詳細画面が表示されたら、作成完了

5-4. メタデータ アーティファクト ID の確認

  1. ナビゲーションメニュー 「Vertex AI」 > 「ML メタデータ」 をクリック
  2. リージョンが us-central1 であることを確認
  3. 一覧から、Step 5-3 で作成したデータセットに対応するアーティファクトを探す
  4. アーティファクト ID(UUID 形式、例: 323c30a7-a4a5-4cfc-add6-308c395b9009)を控える

📝 この ID を控えてください: Step 8 のパイプライン アーティファクト設定(vertex_dataset)で使用します。

補足: なぜデータの前処理が必要なのか

元データ(Iowa Liquor Sales)はそのままでは時系列予測モデルの入力として使用できません。前処理では以下の 4 つの変換を行っています。

変換内容 理由
日次 × 店舗 × カテゴリ別に集計 元データは 1 行=1 取引のトランザクション形式ですが、Tabular Workflow for Forecasting は「日付 × 系列 ID」ごとに 1 行の集計済みデータを必要とするため
欠損日(販売 0 の日)を 0 で補完 売上がない日にはレコードが存在しませんが、時系列モデルは連続した日付系列を前提とするため、全日付 × 全系列の組み合わせを生成し 0 で埋めています
データ量の絞り込み(上位 50 系列 × 直近 2 年間) 元データは数千万行規模のため、すべてを学習に使うとコストと時間が膨大になります。データが十分にある系列(100 日以上)の上位 50 に絞ることで、学習コストを抑えつつ精度を確保しています
系列識別キー time_series_id の生成 予測モデルは「どの店舗のどの商品カテゴリの時系列か」を識別するキーが必要ですが、元データにはそのようなカラムがありません。そこで store_idcategory_name_ で結合し、例えば 2604_AMERICAN VODKAS のような一意の合成キーを作成しています。このキーをパイプラインの time_series_identifier_columns パラメータで指定します

6. 前処理済みデータの確認

作成したテーブルの内容を確認します。

手順

BigQuery の SQL エディタで以下を実行:

-- レコード件数と基本統計を確認
SELECT
  COUNT(*) AS total_rows,
  MIN(date) AS min_date,
  MAX(date) AS max_date,
  COUNT(DISTINCT time_series_id) AS num_series,
  AVG(bottles_sold) AS avg_bottles_sold,
  MAX(bottles_sold) AS max_bottles_sold
FROM `forecast_dataset.iowa_liquor_daily`;
-- サンプルデータを確認
SELECT *
FROM `forecast_dataset.iowa_liquor_daily`
ORDER BY time_series_id, date
LIMIT 20;

確認ポイント:

  • total_rows: 数万行程度(50 系列 × 730 日 ≈ 36,500 行)
  • num_series: 50
  • min_date / max_date: 直近 2 年間の範囲
  • データに NULL がないこと

7. Tabular Workflow パイプラインの起動

Vertex AI のテンプレートギャラリーから Forecasting パイプラインを起動します。

手順

  1. ナビゲーションメニュー 「Vertex AI」 > 「ダッシュボード」 をクリック

  2. ナビゲーションメニュー下部 「パイプライン」 をクリック

  3. 上部の 「パイプラインを作成」 または 「実行を作成」 をクリック

  4. 「テンプレートから選択」 を選択

  5. テンプレートギャラリータブで 「Learn to Learn」 で検索

  6. 「Learn to Learn Forecasting Pipeline on Tabular Workflows」 テンプレートを選択

  7. 「実行を作成」 をクリック

📝 テンプレート名は Google Cloud のアップデートにより変更されることがあります。「Forecast」「AutoML」を含むテンプレートを探してください。


8. パイプラインパラメータの設定

テンプレート起動後、以下のパラメータを 上から順に 設定します。

基本設定

パラメータ 設定値 説明
パイプライン名 iowa-liquor-forecast 任意の名前
リージョン us-central1(アイオワ) GCS バケットと同じリージョン

Cloud Storage のロケーション

パラメータ 設定値 説明
出力ディレクトリ {プロジェクトID}-forecast-pipeline/output/ Step 2 で作成したバケットを選択

パイプライン パラメータ(変更が必要な項目)

以下のパラメータはデフォルト値から変更が必要です。UI 上ではアルファベット順に並んでいるため、上から順にスクロールしながら該当項目を設定してください。

パラメータ名 設定値 説明
context_window 30 直近 30 日分のデータをコンテキストとして使用(デフォルト: 0)
data_source_bigquery_table_path bq://{プロジェクトID}.forecast_dataset.iowa_liquor_daily Step 5 で作成したテーブル
forecast_horizon 7 7 日先まで予測(デフォルト: 0)
location us-central1 パイプライン実行リージョン
optimization_objective minimize-rmse 二乗平均平方根誤差を最小化
project {プロジェクトID} 使用する GCP プロジェクト ID
root_dir gs://{プロジェクトID}-forecast-pipeline GCS ルート出力ディレクトリ
target_column bottles_sold 予測対象の値(販売本数)
time_column date 時系列の日付カラム
time_series_identifier_columns ["time_series_id"] 各時系列を識別するキーのリスト
train_budget_milli_node_hours 1000 学習時間予算(1000 = 1 ノード時間)。
feature_transform_engine_dataflow_machine_type n2-standard-4 特徴量変換 Dataflow マシンタイプ(デフォルト: n1-standard-16)。デフォルトの n1-standard-16 では ZONE_RESOURCE_POOL_EXHAUSTED(ゾーンのリソース在庫切れ)で Dataflow ワーカーが起動しない場合がある。 n2-standard-4 に変更することでリソース確保の成功率が大幅に向上する。
feature_transform_engine_dataflow_max_num_workers 5 特徴量変換 Dataflow 最大ワーカー数(デフォルト: 10)。50 系列 × 36,500 行程度のデータ量であれば 5 ワーカーで十分処理可能。
num_selected_trials 2 選択するトライアル数(デフォルト: 10)。並列トライアル数を 2 に制限しているため、合わせて縮小。
stage_1_num_parallel_trials 2 ステージ 1 の並列トライアル数(デフォルト: 35)
stage_2_num_parallel_trials 2 ステージ 2 の並列トライアル数(デフォルト: 35)
transformations {"auto": ["bottles_sold"], "timestamp": ["date"]} 特徴量変換の設定(auto で型を自動判定。)
evaluation_batch_explain_machine_type n2-highmem-8 評価時のバッチ説明マシンタイプ(デフォルト: n1-highmem-8)。n2 系に変更してリソース確保の成功率を向上。
evaluation_batch_explain_max_replica_count 2 評価時のバッチ説明最大レプリカ数(デフォルト: 22
evaluation_batch_explain_starting_replica_count 2 評価時のバッチ説明初期レプリカ数(デフォルト: 22
evaluation_batch_predict_machine_type n2-standard-16 評価時のバッチ予測マシンタイプ(デフォルト: n1-standard-16)。n2 系に変更。
evaluation_batch_predict_max_replica_count 2 評価時のバッチ予測最大レプリカ数(デフォルト: 25
evaluation_batch_predict_starting_replica_count 2 評価時のバッチ予測初期レプリカ数(デフォルト: 25
evaluation_dataflow_machine_type n2-standard-16 評価用 Dataflow マシンタイプ(デフォルト: n1-standard-16)。n2 系に変更。
evaluation_dataflow_max_num_workers 2 評価用 Dataflow 最大ワーカー数(デフォルト: 25
evaluation_dataflow_starting_num_workers 2 評価用 Dataflow 初期ワーカー数(デフォルト: 22

⚠️ stage_1_num_parallel_trials / stage_2_num_parallel_trials をデフォルト値の 35 から 2 に変更する理由

新規の GCP プロジェクトでは Vertex AI の Restricted image training CPUs クォータ(リージョンごとの学習用 CPU 上限)がデフォルトで 42 CPU 程度に設定されています。各トライアルは n1-standard-8(8 CPU)のワーカーを 1 台使用するため、並列トライアル数 × 8 がクォータ上限を超えるとパイプラインが RESOURCE_EXHAUSTED エラーで失敗します。

  • デフォルト 35 並列の場合: 35 × 8 = 280 CPU 必要 → クォータ 42 を大幅超過
  • 2 並列に変更した場合: 2 × 8 = 16 CPU → クォータ 42 以内で安全に実行可能

クォータ上限は「IAM と管理」>「割り当て」で Restricted image training CPUs を検索して確認できます。本番環境で学習速度を上げたい場合は、同画面からクォータ引き上げをリクエストし、承認後に並列数を増やしてください。

パイプライン パラメータ(デフォルトのまま)

以下のパラメータはデフォルト値のまま変更不要です。参考としてパラメータ名と説明を記載します。

パラメータ名 デフォルト値 説明
available_at_forecast_columns [] 予測時に利用可能なカラム
data_source_csv_filenames (空) CSV ファイルパス(BigQuery 使用時は不要)
dataflow_service_account (空) Dataflow サービスアカウント
dataflow_subnetwork (空) Dataflow サブネットワーク
dataflow_use_public_ips true Dataflow でパブリック IP を使用
enable_probabilistic_inference false 確率的推論の有効化
encryption_spec_key_name (空) KMS 暗号化キー名
evaluated_examples_bigquery_path (空) 評価結果の BigQuery 出力先
evaluation_dataflow_disk_size_gb 50 評価用 Dataflow ディスクサイズ (GB)
fast_testing false 内部テスト用フラグ
feature_transform_engine_bigquery_staging_full_dataset_id (空) 特徴量変換のステージングデータセット ID
feature_transform_engine_dataflow_disk_size_gb 40 特徴量変換 Dataflow ディスクサイズ (GB)
group_columns [] 時系列階層グループのカラム
group_temporal_total_weight 0 グループ×ホライズン集約の損失重み
group_total_weight 0 グループ集約の損失重み
holiday_regions [] 祝日効果を適用する地域
model_description (空) モデルの説明文
model_display_name (自動生成) モデル表示名

| predefined_split_key | (空) | 事前定義の分割カラム |
| quantiles | [] | 確率的推論の分位数 |
| run_evaluation | false | テスト分割での評価の実行 |
| stage_1_tuner_worker_pool_specs_override | [] | ステージ 1 チューナーのワーカープール設定 |
| stage_1_tuning_result_artifact_uri | (空) | ステージ 1 チューニング結果の GCS URI |
| stage_2_trainer_worker_pool_specs_override | [] | ステージ 2 トレーナーのワーカープール設定 |
| study_spec_parameters_override | [] | スタディ仕様パラメータの上書き |
| temporal_total_weight | 0 | ホライズン集約の損失重み |
| test_fraction | -1 | テスト分割比率(-1 で自動) |
| time_series_attribute_columns | [] | 時系列で不変の属性カラム |
| timestamp_split_key | (空) | タイムスタンプ分割カラム |
| training_fraction | -1 | 学習分割比率(-1 で自動) |
| unavailable_at_forecast_columns | [] | 予測時に利用不可のカラム |
| validation_fraction | -1 | 検証分割比率(-1 で自動) |
| weight_column | (空) | 重みカラム |
| window_max_count | 0 | 最大ウィンドウ数 |
| window_predefined_column | (空) | ウィンドウ開始位置カラム |
| window_stride_length | 0 | ウィンドウのストライド長 |

パイプライン アーティファクト

パラメータ名 設定値 説明
parent_model (空) 既存の親モデル(新規作成時は空のまま)
vertex_dataset ※必須 Step 5-4 で控えたメタデータ アーティファクト ID を入力 UUID 形式(例: 323c30a7-a4a5-4cfc-add6-308c395b9009

📝 パラメータの名称や入力欄のレイアウトはテンプレートのバージョンにより異なる場合があります。上記の設定値を該当する項目に入力してください。

すべての設定が完了したら 「送信」 をクリックします。


9. パイプラインの実行モニタリング

パイプラインが開始されると、DAG(有向非巡回グラフ)ビューで進捗を確認できます。

手順

  1. パイプライン実行後、自動的に実行詳細画面に遷移します
  2. DAG ビューで各ステップのステータスを確認:
    • 🔵 : 実行中
    • : 完了
    • : 失敗
  3. 各ステップをクリックすると、ログや出力の詳細を確認できます

主要なステップと役割

ステップ 内容
Data validation 入力データのスキーマ・品質チェック
Feature engineering 特徴量の自動生成(ラグ特徴量、移動平均など)
Training AutoML Forecasting モデルの学習
Evaluation モデルの評価メトリクス計算
Model upload Model Registry への登録

⏱️ 所要時間: 1〜3 時間程度(データ量と学習バジェットに依存)。学習完了まで画面を閉じても構いません。パイプラインはバックグラウンドで実行されます。

完了確認

パイプラインのすべてのステップが ✅(緑)になったら完了です。


10. モデル評価の確認

学習が完了したモデルの精度を確認します。

手順

  1. ナビゲーションメニュー 「Vertex AI」 > 「Model Registry」 をクリック
  2. 一覧からパイプラインで作成されたモデルを選択(モデル名をクリック)
  3. 「評価」 タブをクリック
  4. 以下のメトリクスを確認:
メトリクス 説明 値の見方
MAE (Mean Absolute Error) 平均絶対誤差 値が小さいほど良い。予測値と実測値の平均的なズレ
RMSE (Root Mean Squared Error) 二乗平均平方根誤差 値が小さいほど良い。大きなズレをより重視した指標
MAPE (Mean Absolute Percentage Error) 平均絶対パーセント誤差 値が小さいほど良い。パーセンテージでの誤差率

📝 判断基準の目安:

  • MAPE < 20%: 実用レベル
  • MAPE < 10%: 良好
  • MAPE < 5%: 優秀
    (需要予測においてはデータやドメインにより基準が異なります)

11. Endpoint の作成とモデルのデプロイ

学習済みモデルを Vertex AI Endpoint にデプロイして、オンライン推論を有効にします。

11-1. Endpoint の作成

  1. ナビゲーションメニュー 「Vertex AI」 > 「エンドポイント」 をクリック
  2. 「作成」 をクリック
  3. 以下を設定:
設定項目
エンドポイント名 forecast-online-endpoint
リージョン us-central1
アクセス 標準(Standard)
  1. 「続行」 をクリック

11-2. モデル設定

  1. 以下を設定:
設定項目
モデル名 automl-forecasting-model-...(先ほど学習させたモデルを選択)
トラフィック分割 100 %
レプリカの最小数 1
レプリカの最大数 1
マシンタイプ n1-standard-4(4 vCPU, 15 GB メモリ)
  1. その他の設定はデフォルトのまま

  2. 「完了」 をクリック

  3. 確認画面が出てくるので 「作成」 をクリック

⏱️ デプロイ完了まで 10〜30 分 程度かかります。

11-3. デプロイ完了の確認

  1. 「Vertex AI」 > 「オンライン予測」forecast-online-endpointステータス「アクティブ」 になっていることを確認

12. オンライン推論テスト(コンソール UI)

デプロイしたモデルにテストリクエストを送信し、予測結果を確認します。

手順

  1. 「Vertex AI」 > 「Model Registry」 > automl-forecasting-model-upload-... をクリック
  2. 「デプロイとテスト」 タブをクリック
  3. リクエスト JSON を入力

モデルの入力スキーマは以下の形式です。学習時に指定した transformations のカラム(bottles_solddate)のみが入力フィールドとなります。

入力形式のルール:

フィールド 要素数 説明
date 文字列の配列 37(= context_window 30 + forecast_horizon 7) 連続した日付。先頭 30 日がコンテキスト、末尾 7 日が予測対象期間
bottles_sold 文字列の配列 30(= context_window) コンテキストウィンドウ分の販売本数。予測対象期間分は不要

📝 上記の例は 4829_AMERICAN VODKAS 系列の 2026-02-01〜2026-03-02(30日間)をコンテキストとし、2026-03-03〜2026-03-09(7日間)の予測を求めるリクエストです。(30日分の過去データを見て、7日先を予測する)

date 欄に入力する値(初期値をすべて消してから貼り付け):

["2026-02-01","2026-02-02","2026-02-03","2026-02-04","2026-02-05","2026-02-06","2026-02-07","2026-02-08","2026-02-09","2026-02-10","2026-02-11","2026-02-12","2026-02-13","2026-02-14","2026-02-15","2026-02-16","2026-02-17","2026-02-18","2026-02-19","2026-02-20","2026-02-21","2026-02-22","2026-02-23","2026-02-24","2026-02-25","2026-02-26","2026-02-27","2026-02-28","2026-03-01","2026-03-02","2026-03-03","2026-03-04","2026-03-05","2026-03-06","2026-03-07","2026-03-08","2026-03-09"]

bottles_sold 欄に入力する値(初期値をすべて消してから貼り付け):

["0","798","0","48","1188","0","0","0","1182","24","12","648","42","0","0","1104","72","24","1110","36","0","0","1285","12","30","504","0","0","0","0"]
  1. 「予測」 をクリック
  2. レスポンスとして予測結果が表示されます (2026-03-03〜2026-03-09の7日間における予測販売数)

レスポンス例


13. REST API でのオンライン推論テスト(オプション: Cloud Shell)

コンソールの Cloud Shell から REST API 経由でオンライン推論をテストできます。

手順

  1. Google Cloud コンソール右上の Cloud Shell アイコン >_ をクリック
  2. Cloud Shell ターミナルが起動したら、以下のコマンドを実行:
# 変数の設定(自分の環境に合わせて変更してください)
PROJECT_ID="your-project-id"
ENDPOINT_ID="your-endpoint-id"  # Endpoint詳細画面で確認可能
REGION="us-central1"

# アクセストークンの取得
ACCESS_TOKEN=$(gcloud auth print-access-token)

# オンライン推論リクエスト
# date: context_window(30) + forecast_horizon(7) = 37 要素
# bottles_sold: context_window(30) = 30 要素
# すべて文字列型で指定する
curl -X POST \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
  -H "Content-Type: application/json" \
  "https://${REGION}-aiplatform.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/endpoints/${ENDPOINT_ID}:predict" \
  -d '{
    "instances": [
      {
        "date": [
          "2026-02-01", "2026-02-02", "2026-02-03", "2026-02-04", "2026-02-05",
          "2026-02-06", "2026-02-07", "2026-02-08", "2026-02-09", "2026-02-10",
          "2026-02-11", "2026-02-12", "2026-02-13", "2026-02-14", "2026-02-15",
          "2026-02-16", "2026-02-17", "2026-02-18", "2026-02-19", "2026-02-20",
          "2026-02-21", "2026-02-22", "2026-02-23", "2026-02-24", "2026-02-25",
          "2026-02-26", "2026-02-27", "2026-02-28", "2026-03-01", "2026-03-02",
          "2026-03-03", "2026-03-04", "2026-03-05", "2026-03-06", "2026-03-07",
          "2026-03-08", "2026-03-09"
        ],
        "bottles_sold": [
          "0", "798", "0", "48", "1188",
          "0", "0", "0", "1182", "24",
          "12", "648", "42", "0", "0",
          "1104", "72", "24", "1110", "36",
          "0", "0", "1285", "12", "30",
          "504", "0", "0", "0", "0"
        ]
      }
    ]
  }'

📝 ENDPOINT_ID は、「Vertex AI」 > 「オンライン予測」 > エンドポイント詳細画面の URL やエンドポイント情報から確認できます(数字の ID)。

正常時のレスポンス

HTTP ステータス 200 とともに、以下のような JSON が返されます:

{
  "predictions": [
    {
      "value": [
        63.01,
        139.73,
        658.61,
        92.00,
        53.23,
        46.83,
        657.03
      ]
    }
  ],
  "deployedModelId": "59857962771939328",
  "model": "projects/{project-number}/locations/us-central1/models/{model-id}",
  "modelVersionId": "1"
}

14. クリーンアップ

⚠️ 重要: テストが完了したら、以下の手順で必ずリソースを削除してください。特に Endpoint は稼働中に継続的に課金されます。

リソースは依存関係の都合上、以下の順序で削除 してください。

14-1. Endpoint からモデルをアンデプロイ → Endpoint を削除

  1. 「Vertex AI」 > 「オンライン予測」 をクリック
  2. forecast-online-endpoint をクリック
  3. デプロイされているモデルの 「⋮」 > 「エンドポイントからモデルをアンデプロイ」 をクリック
  4. 確認ダイアログで 「アンデプロイ」 をクリック
  5. アンデプロイ完了後、エンドポイント一覧に戻る
  6. forecast-online-endpoint「⋮」 > 「エンドポイントを削除」 をクリック
  7. 確認ダイアログで 「削除」 をクリック

14-2. Model Registry からモデルを削除

  1. 「Vertex AI」 > 「Model Registry」 をクリック
  2. 対象のモデルの 「⋮」 > 「モデルを削除」 をクリック
  3. 確認ダイアログで 「削除」 をクリック

14-3. パイプライン実行の削除

  1. 「Vertex AI」 > 「パイプライン」 をクリック
  2. 対象のパイプライン実行の 「⋮」 > 「削除」 をクリック
  3. 確認ダイアログで 「削除」 をクリック

14-4. BigQuery データセット・テーブルの削除

  1. 「BigQuery」 をクリック
  2. 左側パネルで自分のプロジェクト > forecast_dataset を見つける
  3. forecast_dataset の右側 「⋮」 > 「データセットを削除」 をクリック
  4. 確認のためデータセット ID forecast_dataset を入力し 「削除」 をクリック

14-5. Cloud Storage バケットの削除

  1. 「Cloud Storage」 > 「バケット」 をクリック
  2. {プロジェクトID}-forecast-pipeline にチェックを入れる
  3. 「削除」 ボタンをクリック
  4. 確認のためバケット名を入力し 「削除」 をクリック

✅ すべてのリソースが削除されたことを確認してください。「Vertex AI」 > 「オンライン予測」 でエンドポイントが残っていないことを最終確認してください。


15. コスト見積もり詳細

リソース 単価 本手順での想定使用量 見積もり費用
AutoML Forecasting 学習 〜$19/ノード時間 1〜3 ノード時間 $19〜$57
Vertex AI Endpoint (n1-standard-4) 〜$0.19/時間 2〜5 時間(テスト) $0.4〜$1.0
BigQuery クエリ実行 $5/TB(最初の 1TB/月は無料) 数 GB $0(無料枠内)
Cloud Storage $0.02/GB/月 数 GB $0.1 未満
合計 $20〜$60 程度

💡 コストの大部分は AutoML Forecasting の学習です。budget_milli_node_hours1000(= 1 ノード時間)に設定することで、学習コストを最小限に抑えられます。


16. トラブルシューティング

パイプラインが失敗する

症状 原因 対処法
権限エラー (Permission Denied) サービスアカウントの IAM 権限不足 Step 3 の権限を再確認
データソースが見つからない BigQuery テーブル URI の入力ミス bq://プロジェクトID.forecast_dataset.iowa_liquor_daily の形式を確認
GCS バケットエラー バケットのリージョン不一致 バケットとパイプラインが同じリージョン(us-central1)であることを確認
学習ステップで失敗 データ品質の問題 Step 6 でデータに NULL や異常値がないことを確認
クォータ超過 (restricted_image_training_cpus) 並列トライアル数がクォータ上限を超過 stage_1_num_parallel_trials / stage_2_num_parallel_trials2 程度に下げる。「IAM と管理」>「割り当て」で Restricted image training CPUs の上限を確認

Endpoint にデプロイできない

症状 原因 対処法
クォータエラー リソースクォータの上限 Google Cloud コンソール「IAM と管理」>「割り当て」で 該当するVMインスタンス のクォータを確認
モデルが選択できない モデルのリージョン不一致 Endpoint とモデルが同じリージョンであることを確認

推論テストで結果が返らない

症状 原因 対処法
400 Bad Request リクエスト JSON のフォーマット不正 Model Registry でモデルの入力スキーマを確認し、JSON を修正
503 Service Unavailable モデルがまだデプロイ中 Endpoint 画面でステータスが「デプロイ済み」になるまで待機
認証エラー アクセストークンの有効期限切れ gcloud auth print-access-token で再取得

17. 参考リンク


NTT DATA TECH
NTT DATA TECH
設定によりコメント欄が無効化されています