作业创建和执行概览

本文档介绍了作业的执行过程和创建选项。 借助批量作业,您可以在Google Cloud上运行批处理工作负载。如需了解作业的组件以及使用 Batch 的前提条件,请参阅 Batch 使用入门。

作业创建和执行的工作原理

如需使用 Batch,您需要创建一个作业来指定工作负载及其要求,然后 Batch 会自动运行该作业。

以下部分介绍了作业创建和执行的工作原理:

作业生命周期

本部分介绍了作业及其任务从创建到删除的生命周期。

对于要在 Batch 上运行的每个工作负载,您需要完成以下基本流程:

  1. 创建作业:您可以通过指定作业的可运行对象、任务和任何其他要求来定义要运行的工作负载。本文档中的作业创建选项部分介绍了创建作业的详细信息。
  2. 监控作业并排查问题:完成作业创建后,系统会自动将作业加入队列、安排作业并对指定资源执行作业。您可以查看已创建作业或其任何任务的详细信息,以了解当前状态。如果需要,您可以取消作业以停止作业或阻止作业运行。作业运行或完成后,您还可以使用日志监控和分析作业。如果作业失败,您可以使用任何错误消息、状态事件或日志来排查问题,以便在重新创建作业之前诊断问题。
  3. 删除或导出作业:Batch 中的作业信息会一直保留,直到您或 Google Cloud 将其删除。Google Cloud 会在作业完成 60 天后自动删除作业。在此之前,您可以选择自行删除作业,或者,如果您需要保留信息,可以在作业删除之前在 Batch 中导出作业的信息。删除作业时,存储在其他 Google Cloud 服务中的作业相关信息不会受到影响,并且这些信息具有单独的保留政策。例如,系统会根据 Cloud Logging 保留政策自动保留和删除作业的日志。

创建作业后,作业会经历以下状态:

  1. 已加入队列 (QUEUED):作业请求已被接受,正在队列中等待。作业会一直留在项目的队列中,直到可以调度为止。当所需资源可用且排在前面的作业已评估完毕时,系统就会调度该作业。不过,为防止作业过时,如果作业超过队列中的等待时间上限,Batch 会自动使作业失败,而不是调度作业。
  2. Scheduled (SCHEDULED):作业已从队列中选出,准备开始运行,并且正在分配资源。
  3. 正在运行 (RUNNING):作业的资源已成功创建,其任务可以开始运行。

    作业运行时,其每个任务都会经历以下状态:

    1. 待处理 (PENDING):任务正在等待虚拟机运行。
    2. 已分配 (ASSIGNED):已为任务分配要运行的虚拟机。
    3. 正在运行 (RUNNING):任务正在虚拟机上运行。
    4. 任务会以以下状态之一结束:

      • 成功 (SUCCEEDED):任务成功,因为其每个可运行对象都满足以下条件之一:

        • 可运行对象成功(返回了值为零的退出代码)。
        • 可运行对象失败(返回了非零退出代码),但属于非关键可运行对象(您启用了可运行对象的 ignoreExitStatus 字段)。
        • Runnable 未完成,但它是后台 Runnable(您启用了 Runnable 的 background 字段)。
      • 失败 (FAILED):任务失败并停止运行,因为至少有一个可运行对象不满足上述条件。

    作业的资源在作业完成之前被删除。

  4. 作业会以以下状态之一结束:

    • 成功 (SUCCEEDED):作业成功,因为其所有任务都成功了。
    • 失败 (FAILED):作业失败并停止运行,因为其至少一个任务失败。
    • 已取消 (CANCELLED):用户在作业成功或失败之前取消了作业。

如需了解详情,请参阅参考文档中的作业状态和任务状态。

作业排队和调度

通常,如果作业较小且只需要一些常见资源,则更有可能更快运行和完成。对于 Batch 文档中的示例作业(通常非常小且使用最少的资源),您可能会看到它们在短短几分钟内完成运行。

具体而言,作业完成排队和调度所需的时间因作业和时间而异,具体取决于以下因素:

  • 用户指定的作业前提条件:您要求在调度作业之前满足的所有前提条件。

    默认情况下,作业没有任何前提条件。(可选)您可以指定在现有作业成功或失败之前,无法安排作业。如需了解详情,请参阅安排依赖作业(预览版)。

  • 作业优先级:作业相对于项目中其他作业的优先级。

    您可以选择通过添加 --priority 标志(对于 gcloud CLI)或 priority JSON 字段来指定作业的优先级。您可以将作业的优先级定义为 0(最低优先级)到 99(最高优先级)之间的数字。设置较高的优先级有助于作业比项目中优先级较低的作业更早运行。

    如果您未配置作业的优先级,则默认使用最低优先级 0。如果两个已加入队列的作业具有相同的优先级,则先创建的作业具有更高的优先级。

  • 作业资源可用性:作业所需资源在允许的位置中的可用性。

    首先,如果您碰巧指定了该位置未提供的任何资源,则作业无法运行。发生这种情况时,作业会失败并显示可用区可用性错误。

    其次,如果作业所需的任何资源因资源可用性错误而相对于当前需求容量不足,则作业更有可能延迟或失败。因此,如果您需要的资源较少、较常见,并且不限制作业在区域中的任何可用区中运行,则作业可能会更快运行。

    如需详细了解作业的资源,请参阅本文档中的作业执行。如需详细了解您可以为批量作业及其资源指定的位置,请参阅位置页面。

  • 配额和限制:您的项目对 Google Cloud 资源和请求设置的阈值。

    如果作业超出任何所需资源或请求的限制或项目的配额,则无法运行。发生这种情况时,Batch 可能会延迟作业并在稍后重试,或者使作业失败并显示相关错误。

    您可以通过创建符合所有相关限制的作业并确保项目具有足够的相关配额,来帮助防止作业出现延迟和错误。如需了解详情,请参阅批量配额和限制。

作业执行

作业执行所需的时间可能会因任务调度和作业资源而异。

任务调度

作业运行时,其任务会根据调度政策 (schedulingPolicy) 字段进行调度,该字段可让您指定以下选项之一:

  • 尽快 (AS_SOON_AS_POSSIBLE)(默认):任务会在资源可用时立即运行,并且可以并行运行。一次运行的任务数量取决于作业资源和其他配置选项允许的每个虚拟机并行任务数,如本文档中的作业资源中所述。
  • 按顺序 (IN_ORDER):任务按索引递增顺序一次运行一个。

作业资源

每个批量作业都在区域级代管式实例组 (MIG) 上运行,该实例组由一个或多个匹配的 Compute Engine 虚拟机 (VM) 实例组成,每个实例都位于其中一个包含的可用区中。每个虚拟机都有专用的 CPU 核心(具体而言是虚拟 CPU [vCPU])和内存硬件,这些硬件会影响作业的性能;此外,每个虚拟机还有一个启动磁盘,用于存储操作系统 (OS) 映像和运行作业的指令。

在作业运行期间,Batch 会自动创建和删除符合您规范的资源。创建作业时,您可以通过指定以下内容来配置其资源:

  • 每个任务的计算资源:除非默认值足够,否则您必须指定每个任务运行所需的计算资源(vCPU、内存和 [如果需要] 额外的启动磁盘存储空间)。如需了解详情,请参阅每个任务的计算资源 (computeResource) 字段。

  • 虚拟机资源:(可选)您还可以指定作业的虚拟机(例如机器类型和操作系统)以及其他资源(例如 GPU、TPU 和存储卷),主要通过使用虚拟机资源政策 (instances[].policy) 字段或替代 instances[].instanceTemplate 字段。(或者,如果您希望允许一个作业使用多种机器类型,也可以使用 instanceFlexibilityPolicy 字段。)

    如果您未定义这些字段(使用Google Cloud 控制台创建作业时无法执行此操作),Batch 会自动尝试选择兼容的虚拟机,并且不会添加任何其他资源。

对于不同的作业,虚拟机数量和每个虚拟机上可同时运行的任务数量会有所不同,具体取决于任务调度和您指定的硬件要求。如果您指定作业的任务IN_ORDER运行,则该作业有一个虚拟机,并且一次只能运行一个任务。否则,如果作业的任务运行 AS_SOON_AS_POSSIBLE,则可以使用以下公式估算虚拟机数量和同时运行的任务数量:

\[{vmsPerJob}=\frac{taskCount}{parallelTasksPerVm}\]

此公式包含以下值:

  • \({vmsPerJob}\):作业的虚拟机数量上限。为作业创建的实际虚拟机数量可能小于此值,例如,如果 Batch 预计在较少资源上运行作业比等待更多资源更快。此值还受每个作业的并发虚拟机数量限制的约束。
  • \({taskCount}\):作业的任务总数,您可以使用任务计数 (taskCount) 字段进行定义。
  • \({parallelTasksPerVM}\):可在虚拟机上同时运行的任务数上限。

    此值由以下所有条件决定:

作业创建选项

创建和运行基本作业介绍了基础知识,包括如何使用脚本或容器映像定义可运行对象,以及如何配置预定义和自定义环境变量。

了解作业创建的基础知识后,请考虑创建一个使用以下一个或多个其他配置选项的作业:

  • 控制对作业的访问权限:

  • 为作业配置其他选项:

    • 使用 MPI 库配置任务通信介绍了如何使用消息传递接口 (MPI) 库配置具有相互依赖的任务的作业,这些任务在不同的虚拟机之间相互通信。MPI 的一个常见应用场景是紧密耦合的高性能计算 (HPC) 工作负载。

    • 自定义运行作业的资源:

      • 使用虚拟机实例模板定义作业资源介绍了如何在创建作业时指定 Compute Engine 虚拟机模板来定义作业的资源。这是一种替代方法,可用于直接使用 instances[].policy 字段指定作业的资源。

      • 为作业使用 GPU 介绍了如何定义使用一个或多个图形处理器 (GPU) 的作业。使用 GPU 的作业的常见应用场景包括密集型数据处理、人工智能 (AI) 或机器学习 (ML) 工作负载。

      • 为作业使用 TPU 介绍了如何定义使用一个或多个张量处理单元 (TPU) 的作业。使用 TPU 的作业的常见应用场景包括人工智能 (AI) 和机器学习 (ML) 推理、评估、微调和训练工作负载。

      • 为作业使用存储卷介绍了如何定义可访问一个或多个外部存储卷的作业。存储选项包括新的或现有的永久性磁盘、新的本地 SSD、现有的 Cloud Storage 存储桶以及现有的网络文件系统 (NFS),例如 Filestore 文件共享。

      • 虚拟机操作系统环境概览简要介绍了何时以及如何为作业自定义虚拟机操作系统 (OS) 环境,包括作业的虚拟机操作系统映像和启动磁盘。

    • 优化作业的各个方面:

      • 改进监控和分析:

      • 安排依赖作业(预览版)介绍了如何指定一个作业,该作业在现有依赖作业成功或失败之前不会运行。如果您的工作负载具有不同的资源要求,您可以通过将用于低需求操作(如数据准备)和计算密集型操作(如数据处理)的虚拟机类型分开,来降低费用和配额用量。

      • 自动重试任务介绍了如何在发生所有或指定失败后自动重试作业的任务。自动重试有助于减少问题排查阻碍,并缩短遇到临时错误的作业所需的总运行时间。例如,对于在 Spot 虚拟机上运行的作业,请使用自动重试。Spot 虚拟机可提供大幅折扣,但可能并非始终可用,并且随时可能被抢占。

      • 使用超时限制运行时间介绍了如何限制任务或可运行对象的运行时间。通过防止运行时间过长,您可以减少意外费用和延迟。

      • 提高资源可获取性:

        • 提高资源获取能力介绍了什么是资源获取能力,并提供了有关如何在创建和运行作业时提高获取能力的建议。

        • 使用虚拟机预留确保资源可用性介绍了如何配置可在预留虚拟机上运行的作业。使用预留虚拟机有助于最大限度地缩短作业的调度时间、防止资源可用性错误并优化费用。

        • 通过使用实例灵活性提高可获取性介绍了如何允许作业在您指定并可排名的多种机器类型上运行。使用实例灵活性可能有助于提高并行性、延迟 Spot 虚拟机的抢占,并防止资源可用性错误。

      • 缩短延迟时间:

        • 并置虚拟机以缩短延迟时间介绍了如何通过要求虚拟机的物理位置彼此靠近来缩短作业虚拟机之间的网络延迟时间。对于在虚拟机之间频繁进行网络通信的作业(例如使用 MPI 库进行通信的任务),这种性能优势尤其有用。

        • 使用映像流式传输介绍了如何通过从 Artifact Registry 流式传输容器映像来缩短作业启动时间。

  • 使用附加服务创建和运行作业:

后续步骤