Contents
1. はじめに ― BigQuery ML の位置付け
| 項目 | 内容 |
|---|---|
| 主な特徴 | - SQL だけでデータ選択・前処理・学習が可能 - データは BigQuery に常駐 したまま分散トレーニングが実行され、ETL コストを削減 |
| 対象ユースケース | - 大規模テーブルに対する回帰・分類・クラスタリング - バッチ予測や簡易なオンラインスコアリング |
| 制限の概要 | - ディープラーニング系(TensorFlow/Keras、PyTorch 等)は未サポート - モデルサイズは 10 GB まで エクスポート可能(2024 年時点) - 高度な特徴量エンジニアリングは外部ツールと併用が推奨 |
2. CREATE MODEL の基本構文と注意点
2.1 基本形
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
CREATE OR REPLACE MODEL `project.dataset.model_name` OPTIONS( model_type='XGBOOST', -- LINEAR_REG, LOGISTIC_REG, KMEANS 等が利用可能 max_iterations=100, learn_rate=0.05, input_label_cols=['label'] -- ラベル列(省略可だが明示した方が安全) ) AS SELECT feature1, feature2, label FROM `project.dataset.training_table`; |
2.2 実装上のポイント
| 項目 | 補足説明 |
|---|---|
model_type の選択 |
現在サポートされているアルゴリズムは公式ドキュメントの Supported models ページに一覧があります(例: XGBOOST, LINEAR_REG, LOGISTIC_REG, KMEANS) |
| データ前処理 | CREATE MODEL の AS SELECT 部分で SQL 関数(SAFE_CAST, CASE WHEN など)を用いて欠損値処理やカテゴリ変換が可能です。ただし、複雑なウィンドウ関数や外部データ結合はクエリコストが高くなる点に留意 |
| ハイパーパラメータの上書き | OPTIONS に記載した項目はトレーニング時に自動適用されますが、アルゴリズム固有のオプションは公式ドキュメントでサポート状況を確認してください |
| モデルサイズ制限 | 2024 年 3 月現在、エクスポート可能な BQML モデルは 10 GB が上限です。大規模な XGBoost のツリーモデルは事前に max_depth や num_parallel_tree を抑えてサイズを管理しましょう |
2.3 「SQLだけで完結」ではない点
- 特徴量エンジニアリング:高度な変換(例: テキスト埋め込み、画像前処理)は外部の Dataflow/Dataproc ジョブや Vertex AI Pipelines が必要です。
- モデル評価・チューニング:
ML.EVALUATEで指標を取得できますが、ハイパーパラメータ探索(Grid Search 等)には Cloud Composer や自作スクリプトの組み合わせが一般的です。
3. トレーニング時に設定できる主なオプション
| オプション | 説明 | 推奨設定例 |
|---|---|---|
max_iterations |
学習回数上限(早期停止と併用) | 100 |
learn_rate |
勾配降下のステップ幅(XGBOOST のみ) | 0.05 |
early_stop |
バリデーションスコアが改善しない場合に自動停止 | TRUE |
validation_split |
学習データの何%を検証用に使用するか | 0.2 |
subsample |
各イテレーションでサンプリングするデータ比率(XGBOOST) | 0.8 |
input_label_cols |
ラベル列名(省略可) | ['label'] |
ポイント:ハイパーパラメータはクエリ実行時に BigQuery の分散エンジンで評価され、スケールアウトが自動的に適用されます。
4. モデルのエクスポートと Vertex AI Model Registry への登録
4.1 エクスポート手順(2024 年版)
※
bq extractの--destination_format=ML_MODELは公式に推奨されている方法です。実行前に Cloud Storage バケットの書き込み権限が付与されたサービスアカウントを使用してください。
|
1 2 3 4 5 6 7 8 9 |
# 1️⃣ エクスポート先バケット作成(必要なら) gsutil mb -p YOUR_PROJECT_ID gs://my-bqml-models/ # 2️⃣ BQML モデルを Cloud Storage にエクスポート bq extract \ --destination_format=ML_MODEL \ project.dataset.model_name \ gs://my-bqml-models/model_export/ |
- エクスポート結果は
.json(メタデータ) と.pb(モデル本体) の 2 ファイルに分割されます。
4.2 Vertex AI Model Registry へアップロード
|
1 2 3 4 5 6 |
gcloud ai models upload \ --region=us-central1 \ --display-name=bqml_fraud_model \ --container-image-uri=us-docker.pkg.dev/vertex-ai/prediction/xgboost-cpu.1-5:latest \ --artifact-uri=gs://my-bqml-models/model_export/ |
| パラメータ | 説明 |
|---|---|
--container-image-uri |
Vertex AI が提供する推論コンテナ。XGBoost 用は xgboost-cpu(CPU)または xgboost-gpu が選択可能 |
--artifact-uri |
先ほどエクスポートした Cloud Storage のパス |
参考:Google のベストプラクティス「ML on GCP – Architecture」(リンク) でも同様のフローが推奨されています。
5. デプロイメントパターンと実装例
| パターン | 主な利用シーン | 実装手順概要 |
|---|---|---|
| オンライン予測(Vertex AI エンドポイント) | リアルタイムスコアリング、レイテンシが数百ミリ秒以内必要なケース | エンドポイント作成 → gcloud ai models deploy でモデルをデプロイ |
バッチ予測(BigQuery の ML.PREDICT) |
夜間集計や大量データの一括スコアリング | ML.PREDICT を SQL に組み込み、クエリ実行だけで完結 |
| ストリーミング予測(Dataflow + Vertex AI) | 取引ログや IoT データなどのリアルタイムストリーム処理 | Dataflow が Pub/Sub 経由で受信 → カスタム DoFn からエンドポイントへ HTTP 呼び出し |
5.1 オンラインエンドポイント作成例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# エンドポイント作成 gcloud ai endpoints create \ --region=us-central1 \ --display-name=fraud_endpoint # デプロイ(モデル ID は `gcloud ai models list` で取得) MODEL_ID=$(gcloud ai models list --filter="displayName=bqml_fraud_model" \ --format="value(name)") gcloud ai models deploy $MODEL_ID \ --region=us-central1 \ --endpoint=$(gcloud ai endpoints list --filter="displayName=fraud_endpoint" \ --format="value(name)") \ --machine-type=n1-standard-4 \ --min-replica-count=1 \ --max-replica-count=10 \ --traffic-split=0=100 |
- オートスケールは
--min-replica-count/--max-replica-countに加えて、エンドポイントの自動スケーリング設定で CPU 利用率や QPS を基準に調整できます(後述)。
5.2 バッチ予測(BigQuery)
|
1 2 3 4 5 6 7 |
CREATE OR REPLACE TABLE `project.dataset.fraud_score` AS SELECT * FROM ML.PREDICT( MODEL `project.dataset.bqml_fraud_model`, (SELECT * FROM `project.dataset.new_transactions`) ); |
- 利点:データが BigQuery 内に留まるため、追加のネットワークコストやレイテンシが発生しません。
- 注意:
ML.PREDICTは内部で BQML の推論エンジンを使用するため、Vertex AI エンドポイントは呼び出されません。
5.3 Dataflow と Vertex AI の連携例(Python)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import apache_beam as beam from apache_beam.options.pipeline_options import PipelineOptions import requests, json, os class PredictDoFn(beam.DoFn): def __init__(self, endpoint_url, token): self.endpoint_url = endpoint_url self.token = token def process(self, element): payload = {"instances": [element]} resp = requests.post( self.endpoint_url, headers={"Authorization": f"Bearer {self.token}", "Content-Type": "application/json"}, data=json.dumps(payload) ) result = resp.json() element["prediction"] = result.get("predictions", [{}])[0] yield element options = PipelineOptions(project='YOUR_PROJECT', region='us-central1') with beam.Pipeline(options=options) as p: (p | "ReadFromBQ" >> beam.io.ReadFromBigQuery(query=""" SELECT transaction_id, amount, merchant FROM `project.dataset.raw_transactions` """, use_standard_sql=True) | "Predict" >> beam.ParDo(PredictDoFn( endpoint_url='https://us-central1-aiplatform.googleapis.com/v1/projects/YOUR_PROJECT/locations/us-central1/endpoints/ENDPOINT_ID:predict', token=os.getenv('ACCESS_TOKEN'))) | "WriteToBQ" >> beam.io.WriteToBigQuery('project.dataset.scored_transactions') ) |
- コスト注意:Dataflow から外部エンドポイントへ HTTP リクエストを送る際は、ネットワーク egress が発生します。料金シミュレーションは GCP Pricing Calculator で事前に確認してください。
6. 運用最適化 ― コスト・スケーリング・モニタリング
6.1 課金モデルの選択
| 項目 | オンデマンド課金 | フラットレート(予約) |
|---|---|---|
| 請求単位 | BQML:クエリ処理量(TB) Vertex AI:予測リクエスト数+インスタンス時間 |
月額固定 + 使用上限オプション |
| メリット | 低トラフィック時に費用が抑えられる | 高負荷期でもコストを予測しやすい |
| 推奨シナリオ | バッチ処理が季節変動する場合 | 常時オンラインサービス、SLA が重要なケース |
根拠:2024 年 3 月に公開された Zenn 記事「BigQuery ML の課金はデータ量ベース」(リンク) によると、BQML は 処理したデータ量 が直接課金対象です。
6.2 Vertex AI エンドポイントのオートスケーリング設定
|
1 2 3 4 5 6 7 8 |
gcloud ai endpoints update \ --region=us-central1 \ --endpoint=fraud_endpoint \ --autoscaling-min-nodes=1 \ --autoscaling-max-nodes=20 \ --autoscaling-metric=cpu_utilization \ --target-cpu-utilization=0.6 |
--target-cpu-utilization=0.6は CPU 使用率が 60 % を超えると自動でスケールアウトします。- スケーリングポリシーは QPS(requests_per_second) や レイテンシ にも変更可能です。
6.3 Cloud Monitoring とログの可視化
- ダッシュボード作成
- メトリクス:
model/deployed_models/*/prediction_count、prediction_latency -
推奨表示形式: 時系列グラフ+アラートしきい値(例:レイテンシ > 500 ms)
-
ログエクスポート(予測リクエストの詳細を BigQuery に保存)
|
1 2 3 4 |
gcloud logging sinks create vertex-prediction-logs \ bigquery.googleapis.com/projects/YOUR_PROJECT/datasets/logs_dataset \ --log-filter='resource.type="ai_endpoint" AND severity>=INFO' |
- エクスポートされたテーブルは SQL で集計でき、異常検知やコスト分析に活用できます。
7. CI/CD・バージョン管理・セキュリティのベストプラクティス
7.1 完全自動化パイプライン例(Cloud Build + Vertex AI Pipelines)
cloudbuild.yaml の抜粋
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
steps: # ① BQML モデルを Cloud Storage にエクスポート - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' entrypoint: 'bash' args: - '-c' - | bq extract --destination_format=ML_MODEL \ project.dataset.bqml_fraud_model gs://tmp/bqml_export/ # ② Model Registry に登録 - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' entrypoint: 'bash' args: - '-c' - | MODEL_ID=$(gcloud ai models upload \ --region=us-central1 \ --display-name=${_MODEL_NAME} \ --artifact-uri=gs://tmp/bqml_export/ \ --container-image-uri=us-docker.pkg.dev/vertex-ai/prediction/xgboost-cpu.1-5:latest \ --format='value(name)') # ③ エンドポイント作成・デプロイ - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk' entrypoint: 'bash' args: - '-c' - | ENDPOINT=$(gcloud ai endpoints create \ --region=us-central1 \ --display-name=${_ENDPOINT_NAME} \ --format='value(name)') gcloud ai models deploy $MODEL_ID \ --region=us-central1 \ --endpoint=$ENDPOINT \ --machine-type=n1-standard-4 \ --min-replica-count=1 \ --max-replica-count=5 |
- トリガー:GitHub の
mainブランチへプッシュされたときに自動実行。 - 利点:コード・モデルのバージョンが Git のコミットハッシュで紐付くため、ロールバックが容易。
7.2 IAM ロール設計(最小権限)
| ロール | 主な権限 | 推奨付与先 |
|---|---|---|
roles/aiplatform.modelViewer |
モデル閲覧・予測呼び出し | データサイエンティスト(読み取り専用) |
roles/aiplatform.modelAdmin |
モデル作成・削除・デプロイ | ML エンジニア、CI/CD 用サービス アカウント |
roles/bigquery.user |
クエリ実行・テーブル閲覧 | 全員(ただしテーブルレベルのアクセス制御は別途設定) |
roles/storage.objectAdmin |
バケットへの読み書き | エクスポート/インポートを行うジョブ |
- ベストプラクティス:サービス アカウントごとにロールを分離し、半年に一度 IAM ポリシーのレビューを実施。
7.3 デプロイ前テスト項目チェックリスト
| テスト種別 | 内容 | 推奨ツール |
|---|---|---|
| ユニットテスト | ML.EVALUATE による指標(AUC, RMSE 等)を基準値と比較 |
BigQuery の SQL スクリプト |
| 負荷テスト | 1 000 RPS 程度の予測リクエストをシミュレートし、スループット・レイテンシを計測 | gcloud ai endpoints predict + hey 等のベンチマーカー |
| コストシミュレーション | 予測リクエスト数と BQML クエリ量を GCP Pricing Calculator に入力し、月額概算を算出 | Google Cloud Pricing Calculator |
| 障害復旧フロー確認 | デプロイ失敗時に gcloud ai endpoints undeploy でロールバックし、前バージョンへトラフィック切替ができるか検証 |
手動スクリプト or Cloud Build step |
8. BQML の制限事項と回避策
| 制限 | 詳細 | 回避・対策 |
|---|---|---|
| モデルサイズ上限 | エクスポート可能なモデルは 10 GB(2024 年時点) | - 学習前に max_depth、num_trees を抑える- 必要なら Vertex AI Pipelines で外部トレーニング(TensorFlow 等)へ移行 |
| 未サポートアルゴリズム | Deep Learning 系(CNN, RNN, Transformer)や画像・音声処理は不可 | - 前処理を Dataflow/Dataproc で実施し、特徴量ベクトル化後に BQML に投入 |
| 複雑な前処理のコスト | 大規模ジョインやウィンドウ関数はクエリ料金が高くなる | - 必要最小限に留め、ETL は Cloud Composer / Dataflow で実施 |
| リアルタイム推論のレイテンシ | ML.PREDICT はバッチ向き。オンライン用途は Vertex AI エンドポイントへデプロイが必須 |
- 低遅延が必要ならエンドポイントに直接リクエストする構成を採用 |
9. まとめ ― 実装フローの全体像
-
SQL でモデル作成
CREATE MODEL→ ハイパーパラメータはOPTIONSに列挙。データ前処理は同じクエリ内で可能だが、複雑な処理は外部ツールへ委譲。 -
モデルの評価・チューニング
ML.EVALUATEで指標取得 → 必要に応じて Cloud Build 上でハイパーパラメータ探索を自動化。 -
エクスポート & Model Registry 登録
bq extract --destination_format=ML_MODEL→ Cloud Storage に保存 →gcloud ai models upload. -
デプロイ先の選択
- オンライン:Vertex AI エンドポイント(オートスケーリング設定必須)
- バッチ:BigQuery の
ML.PREDICTクエリ実行 -
ストリーミング:Dataflow → Vertex AI へ HTTP 呼び出し
-
運用最適化
コストモデルを選択し、Monitoring ダッシュボードとログエクスポートで SLA を監視。スケーリングポリシーは実測データに合わせて調整。 -
CI/CD とセキュリティ
Cloud Build + Vertex AI Pipelines により「コード → データ → モデル」の全工程を自動化。IAM は最小権限でロール分割し、定期的なポリシーレビューを実施。 -
制約への対策
大規模モデルはサイズ上限に注意し、未サポートの深層学習タスクは Vertex AI のトレーニングジョブへ委譲。
次のステップ:本ガイドをベースに、社内のデータパイプラインと統合テスト環境で「サンプルモデル(XGBoost)→エンドポイント」までのフローを構築し、運用チームと共通認識を持つことが重要です。
本稿は 2024 年 9 月時点の情報に基づいています。Google Cloud のサービスは頻繁に更新されるため、実装前に公式ドキュメント(BigQuery ML、Vertex AI)をご確認ください。