XPK を使用して GKE に Managed Lustre をプロビジョニングする

このドキュメントでは、Managed Lustre を GKE と統合して、AI、ML、ハイ パフォーマンス コンピューティング(HPC)などの要求の厳しいデータ集約型ワークロード向けに最適化された環境を作成する方法について説明します。

このドキュメントでは、XPK を使用して GKE クラスタをプロビジョニングし、Managed Lustre インスタンスを作成してクラスタにアタッチします。この構成をテストするには、フレックススタート プロビジョニングを行うノードでワークロードを実行します。

このドキュメントは、マネージド Lustre インスタンスに支えられた Kubernetes コンテナ オーケストレーション機能を使用することに関心のある ML エンジニアやデータと AI のスペシャリストを対象としています。 Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE ユーザーのロールとタスクをご覧ください。

背景

このセクションでは、このドキュメントで使用されている重要なテクノロジーについて説明します。

XPK

XPK は、GKE クラスタとワークロードのプロビジョニングと管理を簡素化するツールです。特に AI/ML タスクに適しています。XPK は、事前構成されたトレーニング用に最適化されたインフラストラクチャの生成に役立ちます。そのため、コンセプト実証やテスト環境に適しています。

TPU を使用するクラスタは、Google Cloud CLI または Accelerated Processing Kit(XPK)を使用して作成できます。

  • gcloud CLI を使用して、GKE クラスタ インスタンスを手動で作成し、既存の GKE 本番環境を正確にカスタマイズまたは拡張します。
  • XPK を使用すると、GKE クラスタをすばやく作成し、概念実証とテスト用のワークロードを実行できます。詳細については、XPK README をご覧ください。

このドキュメントでは、リソースのプロビジョニングと管理に XPK のみを使用します。

詳細については、Accelerated Processing Kit(XPK)のドキュメントをご覧ください。

Flex Start

Flex Start を使用すると、必要なリソースに対してのみ料金を支払うことで、TPU プロビジョニングを最適化できます。Flex Start は、リソースを必要に応じて動的にプロビジョニングする必要があり、最長 7 日間の利用が想定され、コスト効率よく使いたいワークロードにおすすめです。

このドキュメントでは、消費オプションの例として Flex Start を使用していますが、予約や Spot などの他のオプションも使用できます。詳細については、GKE での AI/ML ワークロードのアクセラレータ使用オプションについてをご覧ください。

Managed Lustre

Managed Lustre は、要求の厳しいワークロード向けに設計された高パフォーマンスの並列ファイル システム サービスです。Managed Lustre CSI ドライバを使用すると、標準の Kubernetes 永続ボリュームの要求(PVC)と永続ボリューム(PV)を使用して、Managed Lustre インスタンスを GKE と統合できます。このドライバは、永続的でスケーラブルな高スループット ストレージを必要とする AI、ML、HPC のワークロードに特に有益です。

詳細については、Managed Lustre CSI ドライバについてをご覧ください。

始める前に

作業を始める前に、次のタスクが完了していることを確認してください。

  • Google Cloud Managed Lustre API と Google Kubernetes Engine API を有効にします。
  • API を有効にする
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。gcloud CLI をインストール済みの場合は、gcloud components update コマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。

環境を準備する

このセクションでは、クラスタ環境を準備する方法について説明します。

  1. 新しいターミナル ウィンドウで、仮想環境を作成します。

    VENV_DIR=~/venvp4;python3 -m venv $VENV_DIR;source $VENV_DIR/bin/activate
    
  2. XPK インストール ファイルの手順に沿って XPK をインストールします。ソースからクローンを作成する代わりに pip install を使用します。

  3. デフォルトの環境変数を設定します。

    gcloud config set project PROJECT_ID
    gcloud config set billing/quota_project PROJECT_ID
    export PROJECT_ID=$(gcloud config get project)
    export LOCATION=LOCATION
    export CLUSTER_NAME=CLUSTER_NAME
    export GKE_VERSION=VERSION
    export NETWORK_NAME=NETWORK_NAME
    export IP_RANGE_NAME=IP_RANGE_NAME
    export FIREWALL_RULE_NAME=FIREWALL_RULE_NAME
    export ACCELERATOR_TYPE=v6e-16
    export NUM_SLICES=1
    

    次の値を置き換えます。

    上記のコマンドは、v6e-16 アクセラレータ タイプを構成します。この構成には、次の変数が含まれます。

    • ACCELERATOR_TYPE=v6e-16: 4x4 トポロジの TPU Trillium に対応します。この TPU バージョンは、マルチホスト スライス ノードプールをプロビジョニングするように GKE に指示します。v6e-16 は、GKE の ct6e-standard-4t マシンタイプにマッピングされます。
    • NUM_SLICES=1: 選択した ACCELERATOR_TYPE に対して XPK が作成する TPU スライス ノードプールの数。

    ACCELERATOR_TYPE 変数と NUM_SLICES 変数をカスタマイズする場合は、次のドキュメントで利用可能な組み合わせを確認してください。

    • 使用する TPU バージョン、GKE のマシンタイプ、トポロジ、使用可能なゾーンを確認するには、GKE で TPU を計画するをご覧ください。
    • GKE マシンタイプを Cloud TPU API のアクセラレータ タイプにマッピングするには、TPU Trillium(v6e)のドキュメントをご覧ください。

VPC ネットワークを準備する

Managed Lustre インスタンスと GKE クラスタ用に Virtual Private Cloud ネットワークを準備します。

  1. Service Networking API を有効にします。

    gcloud services enable servicenetworking.googleapis.com \
            --project=${PROJECT_ID}
    
  2. VPC ネットワークを作成します。

    gcloud compute networks create ${NETWORK_NAME} \
            --subnet-mode=auto --project=${PROJECT_ID} \
            --mtu=8896
    
  3. VPC ピアリングの IP アドレス範囲を作成します。

    gcloud compute addresses create ${IP_RANGE_NAME} \
            --global \
            --purpose=VPC_PEERING \
            --prefix-length=20 \
            --description="Managed Lustre VPC Peering" \
            --network=${NETWORK_NAME} \
            --project=${PROJECT_ID}
    
  4. IP アドレス範囲の CIDR 範囲を取得します。

    CIDR_RANGE=$(
        gcloud compute addresses describe ${IP_RANGE_NAME} \
                --global  \
                --format="value[separator=/](address, prefixLength)" \
                --project=${PROJECT_ID}
    )
    
  5. IP アドレス範囲からの TCP トラフィックを許可するファイアウォール ルールを作成します。

    gcloud compute firewall-rules create ${FIREWALL_RULE_NAME} \
            --allow=tcp:988,tcp:6988 \
            --network=${NETWORK_NAME} \
            --source-ranges=${CIDR_RANGE} \
            --project=${PROJECT_ID}
    
  6. VPC ピアリングを接続します。

    gcloud services vpc-peerings connect \
            --network=${NETWORK_NAME} \
            --project=${PROJECT_ID} \
            --ranges=${IP_RANGE_NAME} \
            --service=servicenetworking.googleapis.com
    

Managed Lustre ストレージ インスタンスを作成する

Managed Lustre ストレージ インスタンスを作成します。

  1. ストレージ インスタンス変数を設定します。

    export STORAGE_NAME=STORAGE_NAME
    export STORAGE_THROUGHPUT=STORAGE_THROUGHPUT
    export STORAGE_CAPACITY=STORAGE_CAPACITY_GIB
    export STORAGE_FS=lfs
    

    次の値を置き換えます。

    • STORAGE_NAME: Managed Lustre インスタンスの名前。
    • STORAGE_THROUGHPUT: Managed Lustre インスタンスのスループット(TiB あたりの MiB/秒)。有効なスループット値については、新しい容量を計算するをご覧ください。
    • STORAGE_CAPACITY_GIB: Managed Lustre インスタンスの容量(GiB 単位)。有効な容量値については、許容される容量とスループットの値をご覧ください。
  2. Managed Lustre インスタンスを作成します。

    gcloud lustre instances create ${STORAGE_NAME} \
            --per-unit-storage-throughput=${STORAGE_THROUGHPUT} \
            --capacity-gib=${STORAGE_CAPACITY} \
            --filesystem=${STORAGE_FS} \
            --location=${LOCATION} \
            --network=projects/${PROJECT_ID}/global/networks/${NETWORK_NAME} \
            --project=${PROJECT_ID} \
            --async # Creates the instance asynchronously
    

    --async フラグは、インスタンスを非同期で作成し、ステータスを追跡するためのオペレーション ID を提供します。

  3. オペレーションのステータスを確認します。

    gcloud lustre operations describe OPERATION_ID  \
            --location=${LOCATION} \
            --project=${PROJECT_ID}
    

    OPERATION_ID は、前の非同期コマンドの出力の ID に置き換えます。ID がない場合は、すべてのオペレーションを一覧表示できます。

    gcloud lustre operations list \
            --location=${LOCATION} \
            --project=${PROJECT_ID}
    

    コマンド出力に done: true と表示されたら、インスタンスの準備は完了です。

XPK を使用して GKE クラスタを作成する

XPK を使用して、ノードプールを含む GKE クラスタを作成します。

GKE クラスタを作成します。

xpk cluster create --cluster ${CLUSTER_NAME} \
        --num-slices=${NUM_SLICES} \
        --tpu-type=${ACCELERATOR_TYPE} \
        --zone=${LOCATION} \
        --project=${PROJECT_ID} \
        --gke-version=${GKE_VERSION} \
        --custom-cluster-arguments="--network=${NETWORK_NAME}" \
        --enable-lustre-csi-driver \
        --flex

このコマンドは、XPK を使用して GKE クラスタを作成します。クラスタは、ノード プロビジョニングに Flex Start を使用するように構成されており、Managed Lustre CSI ドライバが有効になっています。

ストレージ インスタンスをクラスタにアタッチする

PersistentVolume(PV)と PersistentVolumeClaim(PVC)を構成するために、このセクションではマニフェスト ファイルで XPK ストレージ アタッチ コマンド(xpk storage attach)を使用します。このセクションでは、XPK ソースコードのマニフェストの例を使用します。

次の手順に沿って、Managed Lustre ストレージ インスタンスを GKE クラスタに関連付けます。

  1. サンプル マニフェスト ファイルを現在の作業ディレクトリにダウンロードし、lustre-manifest-attach.yaml として保存します。

  2. Managed Lustre インスタンスの情報でマニフェスト ファイルを更新します。

    1. PersistentVolume セクションで、次の値を置き換えます。

      • STORAGE_SIZE: Managed Lustre インスタンスのサイズ(GiB 単位)。
      • PROJECT_ID/ZONE/INSTANCE_NAME: Managed Lustre インスタンスの完全なリソースパス。
      • IP_ADDRESS: Managed Lustre インスタンスの IP アドレス。
      • FILE_SYSTEM: ファイル システムのタイプ(lfs)。
    2. PersistentVolumeClaim セクションで、次の値を置き換えます。

      • STORAGE_SIZE: PersistentVolumeClaim のサイズ(GiB)。
  3. ストレージ インスタンスをクラスタにアタッチします。

    xpk storage attach ${STORAGE_NAME} \
            --cluster=${CLUSTER_NAME} --project=${PROJECT_ID} --zone=${LOCATION} \
            --type=lustre \
            --mount-point='/lustre-data' \
            --readonly=false \
            --auto-mount=true \
            --manifest='./lustre-manifest-attach.yaml'
    
  4. クラスタのストレージが接続されていることを確認します。

    xpk storage list \
            --cluster=${CLUSTER_NAME} --project=${PROJECT_ID} --zone=${LOCATION}
    

ワークロードを実行する

アタッチされた Managed Lustre インスタンスでワークロードを実行します。次のコマンドの例では、使用可能なディスクを一覧表示し、Managed Lustre インスタンスのディレクトリに「hello」ファイルを作成します。

ワークロードを作成して実行します。

xpk workload create --workload test-lustre \
--cluster=${CLUSTER_NAME} --project=${PROJECT_ID} --zone=${LOCATION} \
--command="df -h && echo 'hello' > /lustre-data/hello.txt && cat /lustre-data/hello.txt" \
--tpu-type=${ACCELERATOR_TYPE} \
--num-slices=1 \
--flex

クリーンアップ

このドキュメントの手順を完了したら、アカウントで不要な請求が発生しないように、クラスタを削除します。

  xpk cluster delete --cluster ${CLUSTER_NAME} \
        --zone ${LOCATION} \
        --project ${PROJECT_ID}

次のステップ