使用自定义服务帐号进行训练

您可以将 AI Platform Training 配置为在运行训练应用时使用您选择的服务帐号。通过使用自定义服务帐号,您可以自定义训练代码可以访问的 Google Cloud 资源,从而无需向 AI Platform Training 默认使用的服务帐号授予范围太广的权限。此外,您可以使用自定义服务帐号向代码授予对其他 Google Cloud 服务(例如 Secret Manager)的访问权限。

本指南重点介绍 AI Platform Training 资源对其他 Google Cloud 资源的访问权限。如需了解访问 AI Platform Training 资源本身所需的权限,请参阅访问权限控制

了解 Google 管理的服务帐号

默认情况下,AI Platform Training 使用 Google 管理的服务帐号运行训练作业。此服务帐号由具有以下格式的电子邮件地址标识:

service-PROJECT_NUMBER@cloud-ml.google.com.iam.gserviceaccount.com

PROJECT_NUMBER 被替换为您的 Google Cloud 项目的项目编号

通过 Google Cloud Console 或使用 gcloud 命令行工具查找项目的相应服务帐号:

Cloud Console

转到 Cloud Console 中的 IAM 页面,找到与本部分前面所述的电子邮件地址格式匹配的成员。该服务帐号的名称也将为 Google Cloud ML Engine Service Agent

转到 IAM 页面

gcloud

在已初始化 gcloud 工具的 Shell 环境中运行以下命令:

gcloud projects get-iam-policy PROJECT_ID \
  --flatten="bindings[].members" \
  --format="table(bindings.members)" \
  --filter="bindings.role:roles/ml.serviceAgent" \
  | grep serviceAccount:

PROJECT_ID 替换为您的 Google Cloud 项目的 ID。

此命令输出以下内容:

serviceAccount:GOOGLE_MANAGED_SERVICE_ACCOUNT

GOOGLE_MANAGED_SERVICE_ACCOUNT 是您项目的 AI Platform Google 管理的服务帐号的电子邮件地址。

此 Google 管理的服务帐号具有适合运行大多数训练作业的权限。例如,它可以对同一 Google Cloud 项目中的 Cloud Storage 存储分区进行读写。

如果运行训练应用需要额外的权限,您可以向此服务帐号分配其他 Identity and Access Management (IAM) 角色。例如,您可以向它授予访问其他 Google Cloud 项目中的 Cloud Storage 存储分区的权限

使用自定义服务帐号

如果您想要授予或限制特定训练作业的 Google Cloud 权限,请使用自定义服务帐号来代替 Google 管理的服务帐号。

为此,请先设置自定义服务帐号。然后,在创建训练作业时指定该自定义服务帐号。

设置自定义服务帐号

如需设置自定义服务帐号,请执行以下操作:

  1. 创建用户管理的服务帐号。

  2. 向您的新服务帐号授予 IAM 角色,以便为训练应用提供其运行所需的任何权限。

  1. 为您项目的 AI Platform Google 管理的服务帐号授予您的新自定义服务帐号的 Service Account Admin 角色 (roles/iam.serviceAccountAdmin)。为此,请使用 gcloud 工具运行以下命令:

    gcloud iam service-accounts add-iam-policy-binding \
      --role=roles/iam.serviceAccountAdmin \
      --member=serviceAccount:GOOGLE_MANAGED_SERVICE_ACCOUNT \
      CUSTOM_SERVICE_ACCOUNT
    

    在此命令中,替换以下占位符:

    • GOOGLE_MANAGED_SERVICE_ACCOUNT:您项目的 Google Cloud ML Engine Service Agent 的电子邮件地址。如需了解如何查找此电子邮件地址,请参阅本指南的上一部分

    • CUSTOM_SERVICE_ACCOUNT:您在本部分的上一步中新创建的用户管理的服务帐号的电子邮件地址。

为训练作业指定自定义服务帐号

要将 AI Platform Training 配置为在运行训练应用时使用自定义服务帐号,请在创建训练作业时指定 trainingInput.serviceAccount 字段

如果您使用 gcloud 工具创建训练作业,则必须使用 config.yaml 文件指定此字段。例如:

trainingInput:
  serviceAccount: CUSTOM_SERVICE_ACCOUNT

CUSTOM_SERVICE_ACCOUNT 替换为您在本指南的上一部分中设置的用户管理的服务帐号的电子邮件地址。

通过训练代码访问 Google Cloud 服务

在您的训练代码中,如果要通过训练作业访问其他 Google Cloud 服务,请使用应用默认凭据 (ADC)。默认情况下,许多 Google Cloud 客户端库会通过 ADC 进行身份验证。您无需配置任何环境变量; AI Platform Training 会自动配置 ADC 以针对您在上一步中指定的自定义服务帐号进行身份验证。

但在训练代码中使用 Google Cloud 客户端库时,默认情况下它可能无法连接到正确的 Google Cloud 项目。如果您的训练日志报告权限错误,则这可能是发生此问题的原因。创建训练作业时,AI Platform Training 不会直接在您的 Google Cloud 项目中运行训练代码;而是在由 Google 管理的独立项目中运行代码。AI Platform Training 只会将此项目用于执行与您的项目相关的操作。因此,请勿尝试从训练代码中的环境推断项目 ID;而是要明确指定项目 ID。

例如,考虑在 ID 为 PROJECT_ID 的 Google Cloud 项目中运行训练作业。如果您要使用适用于 Google BigQuery 的 Python 客户端访问同一项目中的 BigQuery 表,请勿尝试在训练代码中推断项目:

隐式选择项目

from google.cloud import bigquery

client = bigquery.Client()

请改为使用明确选择项目的代码:

明确选择项目

from google.cloud import bigquery

client = bigquery.Client(project=PROJECT_ID)

后续步骤