运行训练作业

AI Platform Training 将模型训练作为异步(批处理)服务提供。本页面介绍如何通过以下方式配置和提交训练作业:从命令行运行 gcloud ai-platform jobs submit training,或者调用 projects.jobs.create 向 API 发送请求。

准备工作

在提交训练作业之前,您必须打包应用并将应用和任何非常规依赖项一起上传到 Cloud Storage 存储桶。注意:如果您使用 Google Cloud CLI 提交作业,则可以在同一个步骤中打包应用并提交作业。

配置作业

您可以通过以下方式将参数传递给训练服务:设置 Job 资源的成员(其中包括 TrainingInput 资源中的项)。

如果您使用 Google Cloud CLI 提交训练作业,则可以:

  • 将最常见的训练参数指定为 gcloud ai-platform jobs submit training 命令的标志。
  • 按照惯例,在名为 config.yaml 的 YAML 配置文件中传递其余参数。该配置文件建立了 Job 资源的 JSON 表示法结构的镜像。您可以在 gcloud ai-platform jobs submit training 命令的 --config 标志中传递配置文件的路径。因此,如果配置文件的路径是 config.yaml,您必须设置 --config=config.yaml

收集作业配置数据

以下属性用于定义您的作业。

作业名称 (jobId)
作业名称(只能包含混合大小写字母、数字和下划线,并以字母开头)。
集群配置 (scaleTier)
一种规模层级,指定用于运行作业的处理集群类型。该规模层级可以为 CUSTOM,在这种情况下,您还要明确指定要使用的机器数量和类型。
磁盘配置 (diskConfig)
每个训练虚拟机的启动磁盘配置。此字段是可选的;默认情况下,每个虚拟机使用 100 GB pd-ssd 启动磁盘运行。指定此字段可能会产生额外的磁盘费用
训练应用软件包 (packageUris)
已打包的训练应用,暂存在 Cloud Storage 位置。如果您使用 Google Cloud CLI,则应用打包步骤基本上是自动执行的。如需了解详情,请参阅打包应用指南。
模块名称 (pythonModule)
软件包中主模块的名称。主模块是指您为启动应用而调用的 Python 文件。如果您使用 gcloud 命令提交作业,请在 --module-name 标志中指定主模块的名称。请参阅打包应用指南。
区域 (region)
您希望在其中运行作业的 Compute Engine 区域。您应该在存储训练数据的 Cloud Storage 存储桶所在的区域运行训练作业。请参阅 AI Platform Training 服务的可用区域
作业目录 (jobDir)
用于存储作业输出的 Cloud Storage 位置路径。大多数训练应用会在训练过程中保存检查点,并在作业结束时将经过训练的模型保存到文件中。您需要一个 Cloud Storage 位置来保存这些内容。您的 Google Cloud 项目必须具有此存储桶的写入访问权限。训练服务会自动将您给作业目录设置的路径作为命令行参数(名为 job_dir)传递至训练应用。您可以将该参数与应用的其他参数一起解析,并在代码中使用该参数。使用作业目录的优势在于,训练服务将在启动应用之前验证目录。
运行时版本 (runtimeVersion)
作业使用的 AI Platform Training 运行时版本
Python 版本 (pythonVersion)
作业使用的 Python 版本。运行时版本 1.13 至 1.14 支持 Python 3.5。运行时版本 1.15 及更高版本支持 Python 3.7。
最长等待时间 (scheduling.maxWaitTime)
带有后缀 s 的最长等待时长(例如 3600s),其单位为秒,决定了作业可以保持在 QUEUEDPREPARING 状态的时长。由于资源限制,AI Platform Training 不一定总会立即开始运行作业;如果您希望等待作业开始运行的时间不超过特定时长,请指定此字段。从您创建作业时起,限制时长的计时就会开始。如果在此时长已满时,作业仍未进入 RUNNING 状态,AI Platform Training 会取消该作业。这是可选字段,默认为无限制。如果您指定了此字段,则必须至少将其值设为 1800s(30 分钟)。
最长运行时间 (scheduling.maxRunningTime)
训练作业的最长时长,以秒为单位,带有后缀 s(例如,7200s)。从作业进入 RUNNING 状态时起,限制时长的计时就会开始。如果在此时长已满时,作业仍在运行,AI Platform Training 会取消该作业。此字段为可选字段,默认为 7 天 (604800s)。
服务账号 (serviceAccount)
AI Platform Training 在运行训练应用时要使用的服务账号的电子邮件地址。这可以为您的训练应用提供对 Google Cloud 资源的访问权限,而无需授予对项目的由 Google 代管的 AI Platform服务账号的直接访问权限。 此字段是可选字段。 详细了解自定义服务账号的要求

格式化配置参数

如何指定配置详情取决于您启动训练作业的方式。

gcloud

gcloud ai-platform jobs submit training 命令提供作业配置详细信息。可以通过以下两种方法实现此目的:

  • 使用命令行标志。
  • 使用表示 Job 资源的 YAML 文件。您可以随意命名该文件。按照惯例,名称为 config.yaml

即使您使用 YAML 文件,也必须以命令行标志的形式提供某些详情。例如,您必须提供 --module-name 标志以及 --package-path--packages 中至少一个。如果使用 --package-path,则还必须添加 --job-dir--staging-bucket。此外,您必须提供 --region 标志或gcloud 客户端设置默认区域。这些选项以及您以命令行标志形式提供的任何其他选项将替换配置文件中这些选项的值。

示例 1:在本示例中,您选择预配置的机器集群,并在提交作业时以命令行标志的形式提供所有必需的详情。无需配置文件。请参阅下一部分的提交作业指南。

示例 2:以下示例展示了使用自定义处理集群的作业的配置文件内容。配置文件包含部分(而非全部)配置详细信息,并假定您在提交作业时,以命令行标志的形式提供其他必需的详细信息。

trainingInput:
  scaleTier: CUSTOM
  masterType: complex_model_m
  workerType: complex_model_m
  parameterServerType: large_model
  workerCount: 9
  parameterServerCount: 3
  runtimeVersion: '2.11'
  pythonVersion: '3.7'
  scheduling:
    maxWaitTime: 3600s
    maxRunningTime: 7200s

上面的示例指定了 Python 3.7 版。Python 3.7 适用于 AI Platform Training 运行时版本 1.15 或更高版本。该示例还配置了工作器和参数服务器虚拟机;只有在您使用 TensorFlow 或自定义容器执行分布式训练时,才应配置这些机器。请详细了解机器类型

Python

如果您使用 Python 版 Google API 客户端库提交训练作业,请在结构与 Job 资源相同的字典中设置您的配置。这个字典应包含两个键:jobIdtrainingInput,而这两个键的数据分别是作业名称和另一个字典(其中包含 TrainingInput 资源中的对象对应的键)。

以下示例展示了如何为使用自定义处理集群的作业构建作业表示法。

training_inputs = {
    'scaleTier': 'CUSTOM',
    'masterType': 'complex_model_m',
    'workerType': 'complex_model_m',
    'parameterServerType': 'large_model',
    'workerCount': 9,
    'parameterServerCount': 3,
    'packageUris': ['gs://my/trainer/path/package-0.0.0.tar.gz'],
    'pythonModule': 'trainer.task',
    'args': ['--arg1', 'value1', '--arg2', 'value2'],
    'region': 'us-central1',
    'jobDir': 'gs://my/training/job/directory',
    'runtimeVersion': '2.11',
    'pythonVersion': '3.7',
    'scheduling': {'maxWaitTime': '3600s', 'maxRunningTime': '7200s'},
}

job_spec = {'jobId': 'my_job_name', 'trainingInput': training_inputs}

请注意,training_inputsjob_spec 是任意标识符:您可以随意指定这些字典的名称。但是,字典键必须严格按照所示名称命名,才能与 JobTrainingInput 资源中的名称匹配。

上面的示例指定了 Python 3.7 版。Python 3.7 适用于 AI Platform Training 运行时版本 1.15 或更高版本。该示例还配置了工作器和参数服务器虚拟机;只有在您使用 TensorFlow 或自定义容器执行分布式训练时,才应配置这些机器。请详细了解机器类型

提交作业

提交训练作业时,请指定两组标志:

  • 作业配置参数。AI Platform Training 需要用这些值才能在云端设置资源,并在处理集群中的每个节点上部署应用。
  • 用户参数或应用参数。AI Platform Training 会将这些标志的值传递至您的应用。

创建作业:

gcloud

使用 gcloud ai-platform jobs submit training 命令提交训练作业。

首先,您可以定义一些包含配置详细信息的环境变量,这种做法非常有用。为了创建作业名称,以下代码会将日期和时间附加到模型名称:

PACKAGE_PATH="/path/to/your/application/sources"
now=$(date +"%Y%m%d_%H%M%S")
JOB_NAME="your_name_$now"
MODULE_NAME="trainer.task"
JOB_DIR="gs://your/chosen/job/output/path"
REGION="us-east1"
RUNTIME_VERSION="2.11"

以下作业提交内容对应于上面的配置示例 1。在该示例中,您选择了预配置的规模层级 (basic),并决定通过命令行标志提供所有配置详细信息。无需 config.yaml 文件:

gcloud ai-platform jobs submit training $JOB_NAME \
        --scale-tier basic \
        --package-path $PACKAGE_PATH \
        --module-name $MODULE_NAME \
        --job-dir $JOB_DIR \
        --region $REGION \
        -- \
        --user_first_arg=first_arg_value \
        --user_second_arg=second_arg_value

以下作业提交内容对应于上面的配置示例 2。在该示例中,文件只包含配置信息的一部分,而您通过命令行标志提供其他详细信息:

gcloud ai-platform jobs submit training $JOB_NAME \
        --package-path $PACKAGE_PATH \
        --module-name $MODULE_NAME \
        --job-dir $JOB_DIR \
        --region $REGION \
        --config config.yaml \
        -- \
        --user_first_arg=first_arg_value \
        --user_second_arg=second_arg_value

备注:

  • 如果您在配置文件 (config.yaml) 中指定了一个选项,同时又将该选项指定为命令行标志,则命令行中的值将覆盖配置文件中的值。
  • -- 标志标记了 gcloud 特有标志的结束以及您要传递至应用的 USER_ARGS 的开始。
  • AI Platform Training 特有的标志(例如 --module-name--runtime-version--job-dir)必须位于空 -- 标志之前。AI Platform Training 服务可解读这些标志。
  • 如果指定 --job-dir 标志,则该标志必须位于空 -- 标志之前,原因是 AI Platform Training 会使用 --job-dir 来验证路径。
  • 如果指定 --job-dir 标志,您的应用也必须对该标志进行处理。虽然 --job-dir 位于空 -- 之前,该标志也会作为命令行标志传递至您的应用。
  • 您可以根据需要定义任意数量的 USER_ARGS。AI Platform Training 会将 --user_first_arg--user_second_arg 等传递至您的应用。

Python

您可以使用 Python 版 Google API 客户端库来调用 AI Platform Training 和 Prediction API,而无需手动构建 HTTP 请求。运行以下代码示例之前,您必须设置身份验证。

  1. 以 API 所需的格式保存项目 ID(“projects/_projectname”):

    project_name = 'my_project_name'
    project_id = 'projects/{}'.format(project_name)
    
  2. 获取 AI Platform Training 服务的 Python 表示法:

    cloudml = discovery.build('ml', 'v1')
    
  3. 创建并发送您的请求。请注意,job_spec 是在上一步中创建的,您在其中设置了配置参数的格式

    request = cloudml.projects().jobs().create(body=job_spec,
                  parent=project_id)
    response = request.execute()
    
  4. 捕获任意 HTTP 错误。最简单的方法是将前一个命令放在 try 块中:

    try:
        response = request.execute()
        # You can put your code for handling success (if any) here.
    
    except errors.HttpError, err:
        # Do whatever error response is appropriate for your application.
        # For this example, just send some text to the logs.
        # You need to import logging for this to work.
        logging.error('There was an error creating the training job.'
                      ' Check the details:')
        logging.error(err._get_reason())
    

后续步骤