PMLE 学習ハブ
🎯 公式ドキュメント準拠 / 深掘り

Deep Dive: 訓練・サービング・Feature Store

§3+§4 を、Google Cloud の公式ドキュメントの文面に沿って深掘りします。 表面的な比較表ではなく、本番で踏むリスクと公式仕様の落とし穴に焦点 を当てています。

🏋 Custom Training の核心

Vertex AI Custom Training は、コンテナイメージと workerPoolSpecs を渡せば、クラスタ管理なしで分散訓練ジョブを起動できます。鍵となるのは「worker pool の位置順序」と「環境変数で渡されるクラスタトポロジ」です。

公式の重要注意 worker pool は 固定位置順序workerPoolSpecs[2] に Reduction Server を置きたい場合、workerPoolSpecs[1] が空でも省略できず、必ず空の spec を入れる必要があります(連続性の制約)。

🧱 Worker Pool アーキテクチャ

位置役割必須 / 任意レプリカ数典型用途
workerPoolSpecs[0]Primary Replica(プライマリ)必須・常に 1 つ必ず 1他レプリカの調整・ジョブステータス報告
workerPoolSpecs[1]Workers任意1 以上データ並列で実訓練を行う
workerPoolSpecs[2]Parameter Server / Reduction Server任意1 以上パラメータ保管 or All-reduce 高速化
workerPoolSpecs[3]Evaluators任意1 以上評価。TF では原則 1 つ以下 が公式推奨
gcloud ai custom-jobs create \
  --region=us-central1 \
  --worker-pool-spec=machine-type=n1-highmem-96,replica-count=1,\
accelerator-type=NVIDIA_TESLA_V100,accelerator-count=8,\
container-image-uri=us-docker.pkg.dev/vertex-ai/training/pytorch-gpu.2-2.py310:latest \
  --worker-pool-spec=machine-type=n1-highmem-96,replica-count=4,\
accelerator-type=NVIDIA_TESLA_V100,accelerator-count=8,\
container-image-uri=us-docker.pkg.dev/vertex-ai/training/pytorch-gpu.2-2.py310:latest \
  --worker-pool-spec=machine-type=n1-highcpu-16,replica-count=16,\
container-image-uri=us-docker.pkg.dev/vertex-ai-restricted/training/reductionserver:latest

この例では Primary 1 + Workers 4 + Reduction Server 16 で構成。「合計 5 ノード × n1-highmem-96 × V100×8 = 約 500 Gbps の egress 帯域」を、「Reduction Server 16 × n1-highcpu-16 × 32 Gbps = 512 Gbps」でマッチさせています。帯域マッチングは公式の必須要件です。

🗺 CLUSTER_SPEC / TF_CONFIG

各レプリカコンテナには CLUSTER_SPEC(汎用)と TF_CONFIG(TF 専用)の JSON 環境変数が自動注入されます。公式は「環境変数を直接パースせず、フレームワーク標準の Distribution Strategy 経由で読む」ことを推奨。

{
  "cluster": {
    "workerpool0": ["primary-host:port"],
    "workerpool1": ["worker-host-0:port", "worker-host-1:port"],
    "workerpool2": ["ps-host-0:port"]
  },
  "environment": "cloud",
  "task": {
    "type": "workerpool1",
    "index": 1,
    "trial": "TRIAL_ID"  // HPT 時のみ
  },
  "job": { /* CustomJobSpec 全体 */ }
}
{
  "cluster": {
    "chief": ["primary-host:port"],
    "worker": ["worker-host-0:port", "worker-host-1:port"],
    "ps": ["ps-host-0:port"]
  },
  "task": {
    "type": "worker",
    "index": 1,
    "trial": "TRIAL_ID",
    "cloud": "..."
  }
}
TF_CONFIG の落とし穴 "evaluator" は cluster キーに現れません(評価は訓練クラスタ外扱い)。Primary は "chief" または "master"。古いコードは "master" を期待することがあるので互換性に注意。

⚙ 分散戦略の選定

戦略フレームワーク必要な worker pool 構成使い所
MultiWorkerMirroredStrategyTF / KerasPrimary + Workers(PS 不要)同期データ並列。モデルが 1 GPU に収まるケースのデフォルト
ParameterServerStrategyTFPrimary + Workers + PS(pool[2])巨大埋め込みテーブルの非同期学習
FSDP (Fully Sharded Data Parallel)PyTorchPrimary + Workersモデルが 1 GPU に収まらない大規模 LLM
DeepSpeed ZeRO 1/2/3PyTorchPrimary + WorkersZeRO-3 は ZeRO-1 より通信頻度高だがメモリ最小
公式 SDK での実装例(TF)
strategy = tf.distribute.MultiWorkerMirroredStrategy()
with strategy.scope():
    model = build_model()
    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
model.fit(dataset)  # フレームワークが TF_CONFIG を自動解釈

🚀 Reduction Server:勾配通信の専用高速化

大規模 GPU 訓練で All-reduce の通信レイテンシがボトルネック になる場合の Google 製ソリューション。専用ノード群が勾配集約を引き受けます。

前提条件(必須)

リージョン別イメージ

us-docker.pkg.dev/vertex-ai-restricted/training/reductionserver:latest
europe-docker.pkg.dev/vertex-ai-restricted/training/reductionserver:latest
asia-docker.pkg.dev/vertex-ai-restricted/training/reductionserver:latest

性能を引き出す Tuning

Horovod の場合

HOROVOD_FUSION_THRESHOLD134217728 (128 MB) 以上。Tensor Fusion で大きなメッセージにまとめると効果大。

PyTorch DDP の場合

bucket_cap_mb=64 を推奨。デフォルト 25 MB では Reduction Server の利点を引き出しきれない。

マシン選定

n1-highcpu-16 が「relatively high bandwidth for its resources」と公式推奨。32 Gbps egress / ノード。

NCCL は変更不要

NCCL のドロップインで動く。ユーザーコードはほぼ変更不要、起動引数で --reduction-server-address を渡すだけ。

よくある失敗 Reduction Server を追加しても 帯域不足 なら逆に遅くなる。理論帯域だけでなく、実測の nvidia-smi nvlink/topology で確認する習慣を。

🧠 TPU 深掘り:systolic array と Multislice

TPU の本質

systolic array architecture」が GPU との根本差。「multiply-accumulator が物理的に直接接続された大きな行列」を構成し、行列乗算中に メモリアクセスが発生しない。これが von Neumann ボトルネック回避の核心です。

[Host] → [Infeed Queue] → [TPU loads to HBM] ↓ [Systolic Array で行列演算] 各演算結果は直接次の MAC へパス メモリアクセスなしで完結 ↓ [HBM] → [Outfeed Queue] → [Host]

世代別の重要差

世代MXU サイズSparseCore / chip主用途
v2, v3, v4, v5e, v5p128×128v5p のみ 4 個従来 LLM・大規模訓練(v5p)/ コスト効率推論(v5e)
v6e (Trillium)256×2562 個世代間でコード変更不要だが性能特性は変わる
TPU7x (Ironwood)256×2564 個最新世代
MXU が大きいほうが速い? 必ずしも YES ではない。MXU が 256×256 になると小バッチで埋まり切らず、idle になりやすい。バッチサイズが小さいワークロードはむしろ v5p (128×128) の方が稼働率が高いケースがある。

SparseCore

「sparse operations を加速する dataflow processor」。レコメンデーション系(埋め込みテーブル)で特に有効。v5p と TPU7x は 4 個/chip、v6e は 2 個/chip。埋め込みヘビーなモデルでは SparseCore 数が性能に直結します。

Slice / Cube / Pod / Multislice の階層

[Chip] = 個別の TPU 計算ユニット ↓ [Slice] = 同一 Pod 内、ICI で接続された chip 群 ↓ [Cube] = 4x4x4 トポロジ (v4+) ↓ [Pod] = ICI で接続された slice 群(同一専用ネットワーク) ↓ [Multislice] = 複数 slice を DCN 経由で接続 単一ジョブが Pod 境界を越えてスケール可能
ICI Resiliency の罠 v5p+ は ICI 障害時に OCS(光回路スイッチ)周りで自動再ルーティングする「ICI resiliency」を持つが、「temporary degradation in ICI performance」 と引き換え。スケジュール可用性は向上するが性能は瞬間的に落ちる、と公式が明記。

世代間コード可搬性

同じ TensorCore 数なら同じコードが動く」(v3-128 ↔ v4-128 など)。ただし TensorCore 数が違うと 「significant tuning and optimization」 が必要、と公式が明記。「TPU 世代を上げれば自動で速くなる」ことはない。

フレームワーク

PyTorch / JAX を公式が明記。JAX は TPU 最適化が最も進む(XLA との密結合)。PyTorch は PyTorch/XLA 経由。Gemini や PaLM など Google 自社 LLM の訓練は基本 JAX + TPU + Pathways。

📡 Online Inference 深掘り

Vertex AI の Inference は Endpoint リソースに DeployedModel をデプロイする構造。リクエスト経路は API 種別とエンドポイント種別の組合せで決まります。

🔌 エンドポイントの 4 種類

種別到達性プロトコル推奨度追加要件
共有 Publicインターネット可HTTPレガシーなし
Dedicated Publicインターネット可HTTP + gRPC本番第一候補(公式推奨)gRPC は x-vertex-ai-endpoint-id ヘッダ必須
Private Service ConnectVPC 内のみHTTP(推奨)機密データ向け推奨PSC エンドポイント作成必要
Private Services AccessVPC ピアリング経由HTTPレガシー private 構成VPC ピアリング設定
Dedicated Public Endpoint を選ぶ理由 公式は本番向けに dedicated 推奨。理由:(1) 専用ドメイン で他テナントの影響を受けない、(2) gRPC 対応 でレイテンシ最良、(3) Chat Completion / Invoke API(Model Garden 用)が dedicated 限定。
# Python SDK で dedicated を有効化
prediction = endpoint.predict(
    instances=instances,
    use_dedicated_endpoint=True,  # ←これが鍵
)
# dedicatedEndpointDns はリソース取得時に返る

🎛 predict / rawPredict / StreamRawPredict / Invoke

API入力フォーマットシリアライズ用途
predictJSON instances(厳格な形式)Vertex が変換標準ケース
rawPredict任意の HTTP ペイロードスキップ低レイテンシ・カスタム形式
StreamRawPredict任意スキップストリーミング応答(LLM)
Invoke(preview)任意の path forwardingスキップHF Inference API などカスタムルート
explainpredict と同じVertex が変換Explainable AI 付き予測

predict の厳格フォーマット

# 画像(base64 binary)を TF サーバへ
{
  "instances": [
    { "image_bytes": { "b64": "/9j/4AAQSkZJRg..." } }
  ]
}

# PyTorch の場合
{
  "instances": [
    { "data": [0.1, 0.2, 0.3, 0.4] }
  ]
}
エラー応答の形1 インスタンスでも失敗すると、predictions 配列の代わりに {"error": "..."} が返る」。部分成功はない。バッチ送信時に 1 件のフォーマット不正で全体失敗するため、クライアント側で per-instance validation を必ず実装

🗂 Feature Store (Latest) — レガシーとは別物

新 Feature Store は「BigQuery がそのまま offline store」というアーキテクチャ。レガシーは Vertex AI 内に独立した offline storage を持っていたが、新版はメタデータ層に徹し、データ複製を排除。

[BigQuery Source Table (entity_id, feature_1, feature_2, ..., feature_time)] │ │ (登録 = optional) ▼ [Feature Registry] ├─ FeatureGroup ←─ 1 つの BQ table/view にマップ │ ├─ Feature ←─ 1 つのカラムにマップ │ └─ Feature ←─ ... └─ FeatureView ←─ FeatureGroup 群を集約、Online Store にマテリアライズ │ │ (sync 操作で BQ → Online Store) ▼ [FeatureOnlineStore] ├─ Bigtable Online Serving ←─ TB 級・頻繁更新(推奨) └─ Optimized Online Serving ←─ 🚨 サンセット予定

FeatureView の強み

1 つの FeatureView は「2 つの異なる FeatureGroup(別の BQ テーブル由来)の features を集約」できる。"user" と "product" を結合した特徴量空間を、1 回の online lookup で取得可能。

登録は optional

「Feature Group を登録しなくても features を online で serve できる」と公式が明記。ただし 登録しないと

🟦 Bigtable Online Serving が標準

⚠️ Optimized Online Serving のサンセット

サンセットタイムライン(公式)
  • 2026 年 5 月 17 日:新機能追加終了、Critical patch のみ
  • 2027 年 2 月 17 日:完全サンセット
新規プロジェクトは Bigtable serving 一択。Embeddings が必要なら Vector Search へ。

Sync 操作(pull 型)

新 Feature Store は pull 型。BQ で値が更新されても、FeatureViewSync を起動するまで online store には反映されません。スケジュール sync か、ETL 完了後に明示的に sync 起動が必要。

# 疑似コード
operation = feature_view.sync()
# 非同期。完了待ちは別途 wait or polling
operation.result()

Feature Monitor

登録済み feature にしか付けられない。更新頻度が違う features は 別々の FeatureMonitor に分けるのが公式の例:「f1, f2 が hourly、f3, f4 が daily なら FeatureMonitor を 2 つ作る」。

💰 コスト最適化の真実

Spot VM with Training/Inference

60〜80% 安だが 事前通知 30 秒で終了。チェックポイント周期 ≤ 5 分が現実的。長期 LLM 訓練では Dynamic Workload Scheduler (DWS) で容量確保。

Flex-start VMs

「flexible commitment options」と公式が明記。バッチ推論で時間幅にゆとりがあるジョブ向け。Reservation 統合で committed use discount。

Reduction Server の費用

Reduction Server ノードも課金対象。worker 16 ノードに対し RS 16 ノード追加なら 2 倍のコスト。性能向上 30% なら計算が合わない。事前にプロファイリング

Online Endpoint の min_replicas

min=0 にすれば idle 中無料だが コールドスタートが 5〜30 秒。SLA 厳格な場合は min=1+。それ以外は Cloud Run(GPU 対応版)でスケールゼロが選択肢。

⚠️ よくあるリスクと注意点

本番でよく踏むリスク 10 選
  1. Worker pool の位置順序:途中を空にして後ろを定義しようとすると失敗。必ず空 spec で連続性を保つ
  2. Reduction Server の帯域不足:合計帯域が worker pool に満たないと逆に遅くなる
  3. TPU 世代変更:TensorCore 数が変わる移行は再チューニング必須。「v4→v5p で勝手に速くなる」は嘘
  4. predict のエラー応答:1 件失敗で全体失敗。バッチ送信前に必ずバリデーション
  5. predict の input フォーマット:TF は _bytes 終わり alias、PyTorch は data ラッパー。フレームワークで規約が違う
  6. Feature Store の region 不一致:BQ table と Feature Store が別 region だと作成不能
  7. Optimized Online Serving 採用:2027/2/17 完全サンセット。新規は Bigtable + Vector Search
  8. Sync 忘れ:BQ で更新しても自動で online store に反映されない。Schedule か明示的 trigger 必須
  9. Dedicated Endpoint の gRPC ヘッダx-vertex-ai-endpoint-id 忘れると 404
  10. Spot VM のチェックポイント:30 秒の通知期間にチェックポイント保存が完了しないと最後の数分が失われる

📚 参考リンク(一次情報)