您可以将 AI Platform Training 配置为在运行训练应用时使用您选择的服务账号。通过使用自定义服务账号,您可以自定义训练代码可以访问的 Google Cloud 资源,从而无需向 AI Platform Training 默认使用的服务账号授予范围太广的权限。此外,您可以使用自定义服务账号向代码授予对其他 Google Cloud 服务(例如 Secret Manager)的访问权限。
本指南重点介绍 AI Platform Training 资源对其他 Google Cloud 资源的访问权限。如需了解访问 AI Platform Training 资源本身所需的权限,请参阅访问权限控制。
了解服务代理
默认情况下,AI Platform Training 使用服务代理运行训练作业。此服务代理由具有以下格式的电子邮件地址标识:
service-PROJECT_NUMBER@cloud-ml.google.com.iam.gserviceaccount.com
PROJECT_NUMBER 被替换为您的 Google Cloud 项目的项目编号。
通过 Google Cloud 控制台或使用 Google Cloud CLI 查找项目的相应服务账号:
Google Cloud 控制台
前往 Google Cloud 控制台中的 IAM 页面,选择包括 Google 提供的角色授权,然后找到与本部分前面所述的电子邮件地址格式匹配的主账号。该服务账号的名称也将为 Google Cloud ML Engine Service Agent
。
gcloud
在已初始化 gcloud CLI 的 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 Cloud 项目中的 Cloud Storage 存储分区进行读写。
如果运行训练应用需要额外的权限,您可以向此服务账号分配其他 Identity and Access Management (IAM) 角色。例如,您可以向它授予访问其他 Google Cloud 项目中的 Cloud Storage 存储分区的权限。
使用自定义服务账号
如果您想要授予或限制特定训练作业的 Google Cloud 权限,请使用自定义服务账号来代替服务代理。
为此,请先设置自定义服务账号。然后,在创建训练作业时指定该自定义服务账号。
设置自定义服务账号
如需设置自定义服务账号,请执行以下操作:
向您的新服务账号授予 IAM 角色,以便为训练应用提供其运行所需的任何权限。
如果用户管理的服务账号与训练作业属于不同的项目,请配置用户管理的服务账号,以便将其与训练作业关联。
为训练作业指定自定义服务账号
要将 AI Platform Training 配置为在运行训练应用时使用自定义服务账号,请在创建训练作业时指定 trainingInput.serviceAccount
字段。
如果您使用 gcloud CLI 创建训练作业,则必须使用 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 进行硬编码,则可以引用 CLOUD_ML_PROJECT_ID
环境变量。AI Platform Training 会在每个训练容器中设置此环境变量,以包含您在其中启动自定义训练的项目的项目编号。许多能够接受项目 ID 的 Google Cloud 工具也都可以接受项目编号。
例如,考虑在 ID 为 PROJECT_ID 的 Google Cloud 项目中运行训练作业。如果您要使用适用于 Google BigQuery 的 Python 客户端访问同一项目中的 BigQuery 表,请勿尝试在训练代码中推断项目:
隐式选择项目
from google.cloud import bigquery
client = bigquery.Client()
请改为使用明确选择项目的代码:
明确项目选择
from google.cloud import bigquery
project_number = os.environ["CLOUD_ML_PROJECT_ID"]
client = bigquery.Client(project=project_number)