Pathways on Cloud の概要

Pathways は、大規模でマルチタスクのスパース活性化 ML システムを構築できるように設計されたシステムです。数千から数万のアクセラレータを使用でき、処理要件に基づいてさまざまなタスクにさまざまな量のコンピューティングを動的に割り当てることができます。

Pathways は、単一の JAX クライアントで複数の大規模な TPU スライスにまたがるワークロードをオーケストレートすることで、大規模な ML 計算を簡素化します。このワークロードは、数千個の TPU チップにまたがる可能性があります。

Pathways は、Gemini などの大規模モデルのトレーニング用に Google 社内で使用されています。Pathways on Cloud は、 Google Cloud のお客様にも同様のメリットをもたらします。

始める前に

インストールに必要なもの:

このドキュメントでは、Google Kubernetes Engine(GKE)で Pathways マネージド TPU を使用してバッチ、リアルタイム、インタラクティブ ワークロードを実行する方法の概要について説明します。GKE での TPU の使用(Google Kubernetes Engine でのシングルスライス TPU とマルチスライス TPU の両方を含む)に精通していることと、マルチスライス TPU の使用経験があることを前提としています。

単一コントローラとマルチコントローラ

複数のデバイスにわたって計算を管理およびオーケストレートする方法は、主に次の 2 つがあります。

機能

シングル コントローラ(Pathways)

マルチ コントローラ(JAX のデフォルト)

管理

単一の制御ポイント: 単一のクライアント プログラムが中央コントローラとして機能します。

分散制御: 複数のプロセスが参加し、それぞれに独自の Python インタープリタ インスタンスがあります。

表示

統合ビュー: クライアントはすべてのデバイスを単一の統合システムとして認識します。

ローカライズされたビュー: 各 Python プロセスには、接続されているデバイスのみが表示されます。

プログラミング

プログラミングの簡素化: ユーザーは単一のクライアントを操作するため、システムは多くのローカル アクセラレータを備えた単一の大型マシンとして表示されます。

SPMD: 主に SPMD パラダイムを使用します。すべてのデバイスで同じプログラムを実行する必要があります。

柔軟性

非対称パイプライン並列処理や計算のスパース性など、SPMD を超えるより複雑な計算パターンをサポートします。

リソース管理の柔軟性が低下する可能性があります。特に、異なる TPU スライス間では柔軟性が低下します。

Pathways コンポーネント

次のセクションでは、Pathways アーキテクチャの主なコンポーネントの概要について説明します。

Pathways リソース マネージャー

これは、Pathways システムの中央コントロール プレーンです。すべてのアクセラレータ リソースを管理し、ユーザージョブのアクセラレータの割り当てを調整します。ワーカーの健全性をモニタリングし、ジョブのスケジューリング、一時停止、再開を処理します。エラーとシステム ステータスの単一の連絡窓口として機能します。このコンポーネントに必要なのは CPU リソースのみです。

Pathways クライアント

これは、Pathways システムへのエントリ ポイントとして機能する Interim Framework Runtime(IFRT)の実装です。プログラムから High-Level Operations(HLO)を受け取ります。Pathways クライアントは、Pathways リソース マネージャーと連携して、ユーザーコードに基づいてコンパイルされたプログラムを実行する場所を決定します。特定の JAX クライアントにシステムの統合ビューを提供します。このコンポーネントに必要なのは CPU リソースのみです。

Pathways ワーカー

これらは、アクセラレータ マシン(TPU VM)で実行されるプロセスです。IFRT プロキシ サーバーからプログラムのコンパイル済み実行可能ファイルを受け取り、TPU で計算を実行します。Pathways ワーカーは、IFRT プロキシ サーバーを介してプログラムにデータを送り返します。このコンポーネントにはアクセラレータ リソースが必要です。

IFRT プロキシ クライアント

これは、ユーザーコードを基盤となるランタイムから切り離し、コードの移植性と透明性を高める Interim Framework Runtime(IFRT)API の OSS 実装です。JAX は、デフォルトのマルチコントローラ ランタイムの代替としてこの実装を使用します。IFRT プロキシ クライアントは、プログラムと Pathways コンポーネント間の通信ブリッジとして機能します。IFRT プロキシ サーバーにリクエストを送信し、結果を受け取ります。これは IFRT API の OSS 実装です。このコンポーネントに必要なのは CPU リソースのみです。

IFRT プロキシ サーバー

この gRPC サーバーは、IFRT プロキシ クライアントからリクエストを受け取り、Pathways クライアントに転送します。Pathways クライアントは、実際の作業の分散を処理します。このコンポーネントに必要なのは CPU リソースのみです。

サイドカー サーバー

この gRPC サーバーは、アクセラレータ VM 上の Pathways ワーカーと同じ場所に配置され、アクセラレータ VM 上でユーザー指定の Python コードを直接実行して、コントローラからアクセラレータへのデータ転送レイテンシを短縮します。サイドカー サーバーは、gRPC トランスポート上のカスタム バージョン付きプロトコルを介して Pathways ワーカーとやり取りします。

Pathways コンポーネントの関係を示します。
Pathways コンポーネント

PathwaysJob API

PathwaysJob API は、ML トレーニングとバッチ推論ワークロードのデプロイに使用する OSS Kubernetes ネイティブ API です。PathwaysJob のコントローラは、JobSet API を活用して、すべての Pathways コンポーネントのライフサイクルと調整を管理します。このカスタム リソース定義(CRD)は、Pathways ワークロードを定義するためのハイレベル インターフェースを提供します。これにより、一般的なシナリオで個々の Pod 仕様を直接管理する必要がなくなります。すべてのパラメータとその意味の一覧については、GitHub の PathwaysJob API ドキュメントをご覧ください。

apiVersion: pathways-job.pathways.domain/v1
kind: PathwaysJob
metadata:
  name: pathways-USER
spec:
  maxRestarts: MAX_RESTARTS
  pathwaysVersion: jax-JAX_VERSION
  workers:
  - type: $(TPU_MACHINE_TYPE)
    topology: $(TOPOLOGY)
    numSlices: $(WORKLOAD_NODEPOOL_COUNT)
    maxSliceRestarts:  # Optional
  customComponents: # This section is completely optional
  - componentType: proxy_server
    image: CUSTOM_PROXY_SERVER
    customFlags:
    - --flag_name_1=value_1
    customEnv:
    - name: key_1
      value: value_1
  - componentType: pathways_server
    image: CUSTOM_PATHWAYS_SERVER
    customFlags:
    - --flag_name_1=value_1
    customEnv:
    - name: key_1
      value: value_1
  - componentType: worker
    image: CUSTOM_WORKER
    customFlags:
    - --flag_name_1=value_1
    customEnv:
    - name: key_1
      value: value_1
  - componentType: colocated_python_sidecar
    image: CUSTOM_SIDECAR_IMAGE
    customFlags:
    - --flag_name_1=value_1
    customEnv:
    - name: key_1
      value: value_1
  pathwaysDir: "gs://BUCKET_NAME" # Pre-create this bucket.
  controller:
    deploymentMode: default # Default mode deploys pathways cpu resources (resource
# manager and proxy server) on a dedicated CPU node, recommended for training
    elasticSlices: ELASTIC_SLICES
    template:
      spec:
        containers:
        - name: main
          image: python:3.11
        command:
          - bash
          - -c
          - |
            pip install pathwaysutils
            python3 -c 'import pathwaysutils; import jax; pathwaysutils.initialize(); print(jax.devices())'

次の表に、PathwaysJob API の設定を示します。

属性 説明
apiVersion PathwaysJob カスタム リソース定義(CRD)の API バージョン(pathways-job.pathways.domain/v1)を指定します。
kind Kubernetes オブジェクトを PathwaysJob として識別します。
metadata.name Kubernetes の PathwaysJob オブジェクトの名前。通常は pathways-. というパターンに従います。
spec PathwaysJob の望ましい状態と構成を定義します。
spec.maxRestarts 障害が発生した場合にシステムが PathwaysJob を自動的に再起動できる最大回数。
spec.pathwaysVersion (省略可)このジョブの Pathways 環境で使用する JAX フレームワークの目的のバージョンを指定します(例: jax-0.5.3)。
spec.workers PathwaysJob のワーカープールの構成を定義する配列。通常は TPU リソースを使用します。
spec.workers[].type ワーカーノードに使用する TPU マシンのタイプ(たとえば、$TPU_MACHINE_TYPE は ct6e-standard-4t になります)。
spec.workers[].topology ワーカーに割り当てられた TPU スライスのトポロジ(たとえば、$TOPOLOGY は 2x2、4x4、2x2x2 など)。
spec.workers[].numSlices ワーカープールにプロビジョニングする TPU スライスの数(たとえば、$WORKLOAD_NODEPOOL_COUNT は 2 になります)。
spec.workers[].maxSliceRestarts (省略可)スライス内の個々のワーカーが失敗した場合に再起動できる最大回数。
spec.customComponents (省略可)メインジョブとともにカスタム コンポーネント(プロキシ サーバー、Pathways サーバー、追加のワーカーなど)を定義してデプロイできる配列。
spec.customComponents[].componentType 定義するカスタム コンポーネントのタイプ(proxy_server、pathways_server、worker、colocated_python_sidecar など)を指定します。
spec.customComponents[].image このカスタム コンポーネントのコンテナに使用する Docker イメージ。
spec.customComponents[].customFlags コンテナの起動時に渡されるカスタム コマンドライン フラグの配列。
spec.customComponents[].customEnv コンテナ内で設定するカスタム環境変数の配列。各要素には名前と値があります。
spec.pathwaysDir PathwaysJob がコンパイル アーティファクトやその他の一時データの保存に使用する Cloud Storage バケット。このバケットは、ワークロードを実行する前に作成する必要があります。
spec.controller ジョブの実行全体を管理する Pathways コントローラ構成設定。
spec.controller.deploymentMode Pathways コントローラの CPU リソース(Pathways リソース マネージャーとプロキシ サーバー)のデプロイ方法を指定します。デフォルト モードでは、専用の CPU ノードにデプロイされます。colocate_head_with_workers では、TPU ワーカーとともにデプロイされます。
spec.controller.elasticSlices (省略可)ジョブの実行中に使用できなくなる TPU スライスの最大数。この数を超えると、異常と見なされます。
spec.controller.template (省略可)ユーザー ジョブの Pod テンプレートを定義します。これはバッチ ワークロードには必要ですが、インタラクティブ ワークロードには必要ありません。
spec.controller.template.spec ユーザー ジョブの Pod の仕様。
spec.controller.template.spec.containers ユーザー ジョブ内で実行されるコンテナを定義する配列
spec.controller.template.spec.containers[].name ユーザー ジョブ内のコンテナの名前(このサンプルでは main)。
spec.controller.template.spec.containers[].image メイン コンテナのコンテナに使用する Docker イメージ(このサンプルでは python:3.11)。
spec.controller.template.spec.containers[].command メインコンテナの起動時に実行されるコマンド。このサンプルでは、`pathwaysutils` をインストールし、Pathways を初期化して、JAX デバイスを出力します。

GKE の Pathways コンポーネント

このセクションでは、Pathways コンポーネントをコンテナや Pod などの Google Kubernetes Engine コンポーネントにマッピングします。

Pathways コンテナ イメージは次の場所にあります。

コンテナタイプ

ロケーション

IFRT プロキシ サーバー

us-docker.pkg.dev/cloud-tpu-v2-images/pathways/proxy_server:jax-<jax-version>

Pathways リソース マネージャー/ワーカー

us-docker.pkg.dev/cloud-tpu-v2-images/pathways/server:jax-<jax-version>

Pathways リソース マネージャー

GKE クラスタを作成したら、次の containerSpec を使用してパスウェイ リソース マネージャーをデプロイできます。

  - name: pathways-rm
    image: us-docker.pkg.dev/cloud-tpu-v2-images/pathways/server:latest
    imagePullPolicy: Always
    env:
    - name: HOST_ADDRESS
      valueFrom:
        fieldRef:
          fieldPath: "metadata.labels['jobset.sigs.k8s.io/coordinator']"
    - name: TPU_SKIP_MDS_QUERY
      value: "true"
    args:
    - --server_port=29001
    - --node_type=resource_manager
    - --instance_count=WORKLOAD_NODEPOOL_COUNT
    - --instance_type=SLICE_TOPOLOGY
    - --gcs_scratch_location=gs://BUCKET_NAME

引数の説明:

  • --server_port: Pathways リソース マネージャーは、このポートを使用して他の Pathways コンポーネントと通信します。
  • --node_type: ノードタイプ。これは、Pathways リソース マネージャーの場合は「resource_manager」に設定する必要があります。他のコンテナでは必要ありません。
  • --instance_count: TPU スライスの数。
  • --instance_type: スライスの TPU タイプとトポロジ。tpu{TPU type}:{TPU topology} の形式(例: tpuv5e:4x4)。
  • --gcs_scratch_location: 一時ファイルに使用される Cloud Storage バケット。

IFRT プロキシ サーバー

次の containerSpec を使用して、IFRT プロキシ サーバーをデプロイできます。

 - name: pathways-proxy
    image: us-docker.pkg.dev/cloud-tpu-v2-images/pathways/proxy_server:latest
    imagePullPolicy: Always
    env:
    - name: PATHWAYS_HEAD
      valueFrom:
        fieldRef:
          fieldPath: "metadata.labels['jobset.sigs.k8s.io/coordinator']"
    args:
    - --resource_manager_address=$(PATHWAYS_HEAD):29001
    - --server_port=29000
    - --gcs_scratch_location=gs://BUCKET_NAME
    ports:
    - containerPort: 29000

引数の説明:

  • --resource_manager_address: プロキシ サーバーが Pathways リソース マネージャーとの通信に使用するホスト名とポート。ポートは、Pathways リソース マネージャー コンテナに使用される --server_port 値と同じである必要があります。
  • --server_port: IFRT プロキシ サーバーは、このポートを使用して IFRT プロキシ クライアントと通信します。
  • --gcs_scratch_location: 一時ファイルに使用される GCS バケット。

Pathways ワーカー

次の containerSpec を使用して、Pathways ワーカーをデプロイできます。

- name: worker
  image: us-docker.pkg.dev/cloud-tpu-v2-images/pathways/server:latest
  imagePullPolicy: Always
  env:
  - name: PATHWAYS_HEAD
    valueFrom:
      fieldRef:
        fieldPath: "metadata.labels['jobset.sigs.k8s.io/coordinator']"
  - name: MEGASCALE_NUM_SLICES
    valueFrom:
      fieldRef:
        fieldPath: "metadata.labels['jobset.sigs.k8s.io/replicatedjob-replicas']"
  - name: MEGASCALE_SLICE_ID
    valueFrom:
      fieldRef:
        fieldPath: "metadata.labels['jobset.sigs.k8s.io/job-index']"
  - name: MEGASCALE_COORDINATOR_ADDRESS
    value: "$(PATHWAYS_HEAD)"
  args:
  - --server_port=29001
  - --resource_manager_address=$(PATHWAYS_HEAD):29001
  - --gcs_scratch_location=gs://BUCKET_NAME
  ports:
  - containerPort: 29001
  resources:
    limits:
      google.com/tpu: "4"

引数の説明:

  • --resource_manager_address: TPU ワーカーが Pathways リソース マネージャーとの通信に使用するホスト名とポート。ポートは、Pathways リソース マネージャー コンテナに使用される --server_port 値と同じにする必要があります。
  • --server_port: ワーカーは、このポートを使用してプロキシ サーバーと Pathways リソース マネージャーと通信します。
  • --gcs_scratch_location: 一時ファイルに使用される Cloud Storage バケット。

Pathways リソース マネージャー、IFRT プロキシ サーバー、Pathways ワーカーはそれぞれ異なるポートを持つことができますが、この例では、Pathways リソース マネージャーと Pathways ワーカーが同じポートを共有しています。

次のステップ