无服务器训练作业(Agent Platform API 中的 CustomJob 资源)是在 Gemini Enterprise Agent Platform 中运行自定义机器学习 (ML) 训练代码的基本方法。
提交作业之前
在 Agent Platform 中创建 CustomJob 之前,您必须创建一个 Python 训练应用或自定义容器映像来定义要在 Agent Platform 上运行的训练代码和依赖项。
我们建议您使用 Google Cloud CLI 的自动封装功能(如本指南后面部分所述),在本地机器上通过代码创建 Docker 容器映像,将此容器映像推送到 Artifact Registry,并创建 CustomJob,所有这些操作都通过一个命令完成。
否则,您必须手动创建 Python 训练应用或自定义容器映像。
如果您不确定选择哪个选项,请参阅训练代码要求了解详情。
自定义作业包含的内容
创建自定义作业时,您需要指定 Agent Platform 运行训练代码所需的设置,包括:
- 用于单节点训练的一个工作器池 (
WorkerPoolSpec),或用于分布式训练的多个工作器池 - 用于配置作业调度的可选设置 (
Scheduling)、为训练代码设置特定的环境变量、使用自定义服务账号和使用 VPC 网络对等互连
在工作器池中,您可以指定以下设置:
- 机器类型和加速器
- 工作器池运行的训练代码的配置:Python 训练应用 (
PythonPackageSpec) 或自定义容器 (ContainerSpec)
您还可以将自定义作业配置为在永久性资源上运行,而不是在作业启动期间创建新的计算资源。如需详细了解永久性资源,请参阅永久性资源概览。
配置分布式训练
您可以通过指定多个工作器池,为分布式训练分布式训练配置 CustomJob。
此页面上的大多数示例均为使用一个工作器池的单副本训练作业。要修改它们以进行分布式训练,请执行以下操作:
- 使用第一个工作器池配置主副本,并将副本计数设置为 1。
- 添加更多工作器池来配置工作器副本、参数服务器副本或评估器副本(如果您的机器学习框架支持分布式训练的这些额外集群任务)。
详细了解如何使用分布式训练。
创建 CustomJob
要创建 CustomJob,请按照以下标签页之一中的说明操作,具体取决于您要使用的工具。如果您使用 gcloud CLI,则可以使用单条命令将本地机器上的训练代码自动打包到 Docker 容器映像中,并将该容器映像推送到 Artifact Registry,然后创建 CustomJob。其他选项假定您已创建 Python 训练应用或自定义容器映像。
gcloud
以下示例使用 gcloud ai custom-jobs create 命令。
如果您的训练代码在本地计算机上,我们建议您按照使用自动封装部分进行操作。或者,如果您已创建 Python 训练应用或自定义容器映像,请直接跳到无自动封装部分。
使用自动封装
如果您的本地计算机上有训练代码,则可以使用单个命令执行以下操作:
- 根据您的代码构建自定义 Docker 映像。
- 将该映像推送到 Artifact Registry。
- 根据映像启动
CustomJob。
结果类似于使用任何其他自定义容器创建 CustomJob:如果此命令对工作流来说很方便,您可以使用此版本的命令。
准备工作
由于此版本的命令会构建和推送 Docker 映像,因此您必须在本地计算机上执行以下配置:
如果您使用的是 Linux,请配置 Docker,以便可以在没有
sudo的情况下运行它。启用 Artifact Registry API。
启用 API 所需的角色
如需启用 API,您需要拥有
serviceusage.services.enable权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 获得了此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色。为 Docker 配置身份验证,以便将 Docker 映像推送到 Artifact Registry:
gcloud auth configure-docker
构建并推送 Docker 映像,然后创建 CustomJob
以下命令基于预构建的训练容器映像和本地 Python 代码构建 Docker 映像,将该映像推送到 Artifact Registry,然后创建 CustomJob。
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=EXECUTOR_IMAGE_URI,local-package-path=WORKING_DIRECTORY,script=SCRIPT_PATH
请替换以下内容:
LOCATION:将运行容器或 Python 软件包的区域。
JOB_NAME:必填。
CustomJob的显示名称。MACHINE_TYPE:机器类型。请参阅可用于训练的机器类型。
REPLICA_COUNT:要使用的工作器副本的数量。在大多数情况下,对于第一个工作器池,请设置为
1。EXECUTOR_IMAGE_URI:运行所提供代码的容器映像的 URI。请参阅可用于训练的预构建容器。
此映像充当您使用此命令构建的新 Docker 映像的基础映像。
WORKING_DIRECTORY:本地文件系统中的目录,包含运行训练代码的入口点脚本(请参阅以下列表项)。
您可以使用该脚本的父级目录或更高级别的目录。为了指定完全限定的 Python 模块名称,您可能需要使用更高级别的目录(请参阅下面的列表项)。如果更高级层的目录包含
requirements.txt或setup.py,您可能还需要使用更高级别目录。如需了解详情,请参阅安装依赖项。请注意即使您指定更高级别的目录,此命令也会将入口点脚本的父目录复制到 Docker 映像。
SCRIPT_PATH:相对于本地文件系统上的 WORKING_DIRECTORY 的路径,指向作为训练代码入口点的脚本。该脚本可以是 Python 脚本(以
.py结尾)或 Bash 脚本。例如,如果要运行
/hello-world/trainer/task.py且 WORKING_DIRECTORY 为/hello-world,请使用trainer/task.py作为此值。使用
python-module,而不要使用script您可以选择将
script=SCRIPT_PATH替换为python-module=PYTHON_MODULE,以指定 WORKING_DIRECTORY 中 Python 模块的名称,以作为训练的入口点运行。例如,您可以指定python-module=trainer.task,而不是script=trainer/task.py。在这种情况下,生成的 Docker 容器会将代码作为模块加载而不是加载脚本。如果您的入口点脚本在 WORKING_DIRECTORY 中导入其他 Python 模块,则建议您使用此选项。
安装依赖项
使用自动封装功能时,您可以按照与使用 gcloud CLI 的 local-run 命令相同的方式在容器中安装 Python 依赖项。如需了解安装 Python 依赖项的各种方法,请参阅 local-run 命令指南的安装依赖项部分。
使用自动封装时,指定依赖项的语法与使用 local-run 命令时略有不同。您必须在 --worker-pool-spec 标志的值中使用选项,而不是使用命令行标志来指定依赖项。此外,这些选项中的值必须用分号(而不是逗号)分隔。。具体而言,语法:
使用
--worker-pool-spec标志的值中的local-package-path选项,而不是local-run命令的--local-package-path标志。如果您使用此选项指定的工作目录包含requirements.txt或setup.py文件,则自动封装功能会根据此文件安装依赖项。上面的示例演示了此语法。
(可选)在
--worker-pool-spec标志的值中使用requirements选项,而不是--requirements标志。请勿使用逗号分隔 PyPI 依赖项,而是使用分号。(可选)在
--worker-pool-spec标志的值中使用extra-packages选项,而不是--extra-packages标志。请勿使用逗号分隔本地依赖项,而是使用分号。(可选)在
--worker-pool-spec标志的值中使用extra-dirs选项,而不是--extra-dirs标志。请勿使用逗号分隔目录路径,而是使用分号。
以下示例展示了如何使用所有可选技术安装依赖项。(您可以指定其中的任何子集。)为了演示分号语法,该示例为每个选项指定了两个值。要缩短示例的长度,请将其他 --worker-pool-spec 选项替换为 [...]。
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--worker-pool-spec=[...],requirements=PYPI_DEP_1;PYPI_DEP_2,extra-packages=LOCAL_DEP_1;LOCAL_DEP_2,extra-dirs=EXTRA_DIR_1;EXTRA_DIR_2
如需了解这些占位符的适当值,请参阅 local-run 命令指南中的“安装依赖项”。
不自动封装
如果您不使用自动封装,则可以使用类似于以下其中一项的命令创建 CustomJob。根据您是创建 Python 训练应用还是自定义容器映像,选择以下标签页之一:
Python 训练应用
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--python-package-uris=PYTHON_PACKAGE_URIS \
--worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=EXECUTOR_IMAGE_URI,python-module=PYTHON_MODULE
替换以下内容:
- LOCATION:将运行容器或 Python 软件包的区域。
-
JOB_NAME:必填。
CustomJob的显示名称。 - PYTHON_PACKAGE_URIS:以逗号分隔的 Cloud Storage URI 列表,指定作为训练程序的 Python 软件包文件及其从属软件包。软件包 URI 的数量上限为 100。
- MACHINE_TYPE:机器类型。请参阅可用于训练的机器类型。
-
REPLICA_COUNT:要使用的工作器副本的数量。在大多数情况下,对于第一个工作器池,请设置为
1。 - EXECUTOR_IMAGE_URI:运行所提供代码的容器映像的 URI。请参阅可用于训练的预构建容器。
- PYTHON_MODULE:安装软件包后要运行的 Python 模块名称。
自定义容器映像
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI
替换以下内容:
- LOCATION:将运行容器或 Python 软件包的区域。
-
JOB_NAME:必填。
CustomJob的显示名称。 - MACHINE_TYPE:机器类型。请参阅可用于训练的机器类型。
-
REPLICA_COUNT:要使用的工作器副本的数量。在大多数情况下,对于第一个工作器池,请设置为
1。 - CUSTOM_CONTAINER_IMAGE_URI:要在每个工作器副本上运行的容器映像的 Artifact Registry 或 Docker Hub URI。
分布式训练
如需执行分布式训练,您需要为作业配置多个副本。例如,在使用 Google Cloud CLI 时,您可以多次指定 --worker-pool-spec 标志。
如果您使用自动封装,则必须仅指定 local-package-path、script 以及与第一个工作器池中的自动封装相关的其他选项。在后续工作器池中省略与训练代码相关的字段,所有字段都将使用通过自动封装构建的相同训练容器。
例如,以下命令会调整前面的自动封装示例以使用第二个工作器池:
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=EXECUTOR_IMAGE_URI,local-package-path=WORKING_DIRECTORY,script=SCRIPT_PATH \
--worker-pool-spec=machine-type=SECOND_POOL_MACHINE_TYPE,replica-count=SECOND_POOL_REPLICA_COUNT
如果您不使用自动封装,请完全独立地指定每个工作器池;请勿省略任何字段。
以下命令调整了之前的示例以使用第二个工作器池:
Python 训练应用
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--python-package-uris=PYTHON_PACKAGE_URIS \
--worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=EXECUTOR_IMAGE_URI,python-module=PYTHON_MODULE \
--worker-pool-spec=machine-type=SECOND_POOL_MACHINE_TYPE,replica-count=SECOND_POOL_REPLICA_COUNT,executor-image-uri=SECOND_POOL_EXECUTOR_IMAGE_URI,python-module=SECOND_POOL_PYTHON_MODULE
自定义容器映像
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI \
--worker-pool-spec=machine-type=SECOND_POOL_MACHINE_TYPE,replica-count=SECOND_POOL_REPLICA_COUNT,container-image-uri=SECOND_POOL_CUSTOM_CONTAINER_IMAGE_URI
高级配置
如果您想指定前面示例中未提供的配置选项,则可以使用 --config 标志指定本地环境中的 config.yaml 文件的路径,该文件包含 CustomJobSpec 的字段。例如:
gcloud ai custom-jobs create \
--region=LOCATION \
--display-name=JOB_NAME \
--config=config.yaml
请参阅 config.yaml 文件示例。
控制台
在 Google Cloud 控制台中,您无法直接创建 CustomJob 资源。
但是,您可以创建一个用于创建 CustomJob 的 TrainingPipeline 资源。
以下说明介绍了如何创建 TrainingPipeline,用于创建 CustomJob 且不执行其他操作。如果您想要使用其他 TrainingPipeline 功能(例如使用代管式数据集进行训练或在训练结束时创建 Model 资源),请参阅创建训练流水线。
在 Google Cloud 控制台的 Agent Platform 部分中,前往训练流水线页面。
点击 创建以打开训练新模型窗格。
在训练方法步骤中,指定以下设置:
在数据集下拉列表中,选择无代管式数据集。
选择自定义训练(高级)。
点击继续。
在模型详情步骤中,选择训练新模型或训练新版本。如果您选择训练新模型,请为模型输入一个名称 MODEL_NAME。点击继续。
在训练容器步骤中,指定以下设置:
选择要使用预构建容器还是自定义容器进行训练。
根据您的选择,执行以下相应操作:
如果要使用预构建容器进行训练,请向 Agent Platform 提供使用您上传到 Cloud Storage 的训练软件包所需的信息:
使用模型框架和模型框架版本下拉列表指定要使用的预构建容器。
在软件包位置字段中,指定您创建并上传的 Python 训练应用的 Cloud Storage URI。此文件通常以
.tar.gz结尾。在 Python 模块字段中,输入训练应用的入口点的模块名称。
如果要使用自定义容器进行训练,请在容器映像字段中指定容器映像的 Artifact Registry 或 Docker Hub URI。
在 Model output directory 字段中,您可以指定您有权访问的存储桶中的目录的 Cloud Storage URI。目录不需要已经存在。
此值会在
baseOutputDirectoryAPI 字段中传递给 Agent Platform,该字段设置训练应用在其运行时可以访问的几个环境变量。可选:在参数字段中,您可以指定 Agent Platform 开始运行训练代码时使用的参数。所有参数的总长度上限为 10 万个字符。这些参数的行为因您使用的容器类型而异:
如果您使用的是预构建容器,Agent Platform 会将参数作为命令行标志传递给 Python 模块。
如果您使用的是自定义容器,则 Agent Platform 会使用参数替换容器的
CMD指令。
点击继续。
在超参数调节步骤中,确保未选中启用超参数调节复选框。点击继续。
在计算和价格步骤中,指定以下设置:
在区域下拉列表中,选择一个支持自定义训练的区域。
在工作器池 0 部分中,指定用于训练的计算资源。
如果指定加速器,请确保所选加速器类型在所选区域可用。
如果您要执行分布式训练,则点击 Add more worker pools,并为您需要的每个额外工作器池指定一组额外的计算资源。
点击继续。
在预测容器步骤中,选择 No prediction container。
点击开始训练以启动无服务器训练流水线。
REST
在使用任何请求数据之前,请先进行以下替换:
- LOCATION:将运行容器或 Python 软件包的区域。
- PROJECT_ID:您的 [项目 ID](/resource-manager/docs/creating-managing-projects#identifiers)。。
-
JOB_NAME:必填。
CustomJob的显示名称。 - 定义自定义训练作业:
- MACHINE_TYPE:机器类型。请参阅可用于训练的机器类型。
- ACCELERATOR_TYPE:(可选)附加到作业的加速器类型。
- ACCELERATOR_COUNT:(可选)附加到作业的加速器数量。
- DISK_TYPE:(可选)用于作业的启动磁盘类型:
pd-standard(默认)或pd-ssd。详细了解磁盘类型。 - DISK_SIZE:(可选)用于作业的启动磁盘大小(以 GB 为单位)。默认值为 100。
-
REPLICA_COUNT:要使用的工作器副本的数量。在大多数情况下,对于第一个工作器池,请设置为
1。 - 如果训练应用在自定义容器中运行,请指定以下内容:
- CUSTOM_CONTAINER_IMAGE_URI:要在每个工作器副本上运行的容器映像的 Artifact Registry 或 Docker Hub URI。 /li>
- CUSTOM_CONTAINER_COMMAND:(可选)启动容器时要调用的命令。此命令会替换容器的默认入口点。
- CUSTOM_CONTAINER_ARGS:(可选)启动容器时要传递的参数。
- 如果训练应用是在预构建容器中运行的 Python 软件包,请指定以下内容:
- EXECUTOR_IMAGE_URI:运行所提供代码的容器映像的 URI。请参阅可用于训练的预构建容器。
- PYTHON_PACKAGE_URIS:以逗号分隔的 Cloud Storage URI 列表,指定作为训练程序的 Python 软件包文件及其从属软件包。软件包 URI 的数量上限为 100。
- PYTHON_MODULE:安装软件包后要运行的 Python 模块名称。
- PYTHON_PACKAGE_ARGS:(可选)要传递给 Python 模块的命令行参数。
- 了解作业调度选项。
- TIMEOUT:(可选)作业的最长运行时间。
- 指定要应用于此自定义作业的任何标签的 LABEL_NAME 和 LABEL_VALUE。
HTTP 方法和网址:
POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs
请求 JSON 正文:
{
"displayName": "JOB_NAME",
"jobSpec": {
"workerPoolSpecs": [
{
"machineSpec": {
"machineType": MACHINE_TYPE,
"acceleratorType": ACCELERATOR_TYPE,
"acceleratorCount": ACCELERATOR_COUNT
},
"replicaCount": REPLICA_COUNT,
"diskSpec": {
"bootDiskType": DISK_TYPE,
"bootDiskSizeGb": DISK_SIZE
},
// Union field task can be only one of the following:
"containerSpec": {
"imageUri": CUSTOM_CONTAINER_IMAGE_URI,
"command": [
CUSTOM_CONTAINER_COMMAND
],
"args": [
CUSTOM_CONTAINER_ARGS
]
},
"pythonPackageSpec": {
"executorImageUri": EXECUTOR_IMAGE_URI,
"packageUris": [
PYTHON_PACKAGE_URIS
],
"pythonModule": PYTHON_MODULE,
"args": [
PYTHON_PACKAGE_ARGS
]
}
// End of list of possible types for union field task.
}
// Specify one workerPoolSpec for single replica training, or multiple workerPoolSpecs
// for distributed training.
],
"scheduling": {
"timeout": TIMEOUT
}
},
"labels": {
LABEL_NAME_1": LABEL_VALUE_1,
LABEL_NAME_2": LABEL_VALUE_2
}
}
如需发送请求,请选择以下方式之一:
curl
将请求正文保存在名为 request.json 的文件中,然后执行以下命令:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs"
PowerShell
将请求正文保存在名为 request.json 的文件中,然后执行以下命令:
$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs" | Select-Object -Expand Content
响应包含有关规范的信息以及 JOB_ID。
Java
试用此示例之前,请按照Agent Platform 快速入门:使用客户端库中的 Java 设置说明进行操作。如需了解详情,请参阅 Agent Platform Java API 参考文档。
如需向代理平台进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Node.js
试用此示例之前,请按照Agent Platform 快速入门:使用客户端库中的 Node.js 设置说明进行操作。如需了解详情,请参阅 Agent Platform Node.js API 参考文档。
如需向代理平台进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证。
Python
如需了解如何安装或更新 Vertex AI SDK for Python,请参阅安装 Vertex AI SDK for Python。 如需了解详情,请参阅 Python API 参考文档。
后续步骤
- 了解如何使用 Cloud Profiler 找出训练性能瓶颈,以更快、更低的费用训练模型。
- 请参阅创建训练流水线,了解如何创建训练流水线以在 Gemini Enterprise Agent Platform 上运行无服务器训练应用。
- 了解如何根据资源可用性安排无服务器训练作业。