プロジェクト間サービス アカウントを使用する
このドキュメントでは、TPU VM の作成時にプロジェクト間のサービス アカウントを使用する方法について概説します。プロジェクト間サービス アカウントは、TPU VM とは異なるプロジェクトにあるサービス アカウントです。
次の手順では、共有 VPC または VPC Service Controls は考慮されていません。使用をサポートするには、追加の構成や権限が必要になる場合があります。詳細については、共有 VPC ネットワークの作成と変更と VPC Service Controls の概要をご覧ください。
始める前に
- 2 つの Google Cloud プロジェクトを作成します。1 つは TPU VM 用(
tpu_project
)、もう 1 つはサービス アカウント用(service_project
)です。詳細については、プロジェクトの作成と管理をご覧ください。 service_project
にサービス アカウントを作成します。詳細については、サービス アカウントの作成と管理をご覧ください。- ネットワークを作成し、限定公開の Google アクセスを有効にします。詳細については、ネットワークの作成と管理と内部 IP アドレスの限定公開の Google アクセスを構成するをご覧ください。
- 次の組織のポリシーを無効にします。詳細については、組織のポリシーの制約をご覧ください。
- 両方のプロジェクトの
constraints/iam.disableCrossProjectServiceAccountUsage
constraints/compute.vmExternalIpAccess
(SSH で VM にアクセスする場合、省略可)
- 両方のプロジェクトの
環境変数を定義する
export TPU_PROJECT_ID=tpu-project-id export SERVICE_PROJECT_ID=service-project-id export SERVICE_ACCOUNT_EMAIL=your_service_account@$(SERVICE_PROJECT_ID).iam.gserviceaccount.com export ZONE=your-zone export TPU_NAME=your-tpu-name export NETWORK=your-network export SUBNET=your-subnet
IAM 権限を設定する
サービス アカウントが
tpu_project
で TPU サービス エージェントのロールを使用できるようにします。gcloud projects add-iam-policy-binding ${TPU_PROJECT_ID} \ --member=serviceAccount:${SERVICE_ACCOUNT_EMAIL} \ --role=roles/cloudtpu.serviceAgent
TPU サービス エージェントに serviceAccountUser ロールを追加します。
gcloud projects add-iam-policy-binding $SERVICE_PROJECT_ID \ --member=serviceAccount:service-$TPU_PROJECT_ID@gcp-sa-tpu.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountUser
ワークロードが Docker コンテナで実行されている場合は、Compute Engine Service エージェントがメタデータ サーバーにアクセスできるようにします。
gcloud iam service-accounts add-iam-policy-binding \ --project $SERVICE_PROJECT_ID $SERVICE_ACCOUNT_EMAIL \ --role roles/iam.serviceAccountTokenCreator \ --member serviceAccount:service-$TPU_PROJECT_ID@compute-system.iam.gserviceaccount.com
tpu_project
に TPU VM を作成する
service_project
のサービス アカウントを使用して、tpu_project
に TPU VM を作成します。
gcloud alpha compute tpus tpu-vm create $TPU_NAME \ --description=$TPU_NAME \ --accelerator-type=v5litepod-8 \ --version=tpu-vm-tf-2.17.0-pod \ --network=projects/$PROJECT_A/global/networks/$NETWORK \ --subnetwork=$SUBNET \ --internal-ips \ --service-account=$SERVICE_ACCOUNT_EMAIL \ --project=$TPU_PROJECT_ID \ --zone=$ZONE