适配

适配功能使用 Apache Beam 资源提示来自定义流水线的工作器资源。为特定的流水线步骤指定多个不同资源可提高流水线的灵活性和能力,并可能节省费用。您可以将成本较高的资源应用于需要这些资源的流水线步骤,并将成本较低的资源应用于其他流水线步骤。使用适配功能可指定整个流水线或特定流水线步骤的资源要求。

支持和限制

启用适配

如需启用适配,请在流水线中使用一个或多个可用的资源提示。在流水线中使用资源提示时,系统会自动启用适配功能。如需了解详情,请参阅本文档的使用资源提示部分。

可用的资源提示

以下资源提示适用。

资源提示 说明
min_ram

分配给工作器的最小 RAM(以 GB 为单位)。 在为新工作器(横向扩缩)或现有工作器(纵向扩缩)分配内存时,Dataflow 使用此值作为下限。

例如:

min_ram=NUMBERGB
  • NUMBER 替换为流水线或流水线步骤所需的工作器内存的最小值
  • min_ram 是每工作器的总量规格,而不是每 vCPU 的规格。例如,如果您设置 min_ram=15GB,Dataflow 会将工作器中所有 vCPU 的可用总内存至少设置为 15 GB。
accelerator

由用户提供的 GPU 分配,可让您控制流水线及其步骤中 GPU 的使用和费用。以标志的参数形式指定要挂接到 Dataflow 工作器的 GPU 类型和数量。

例如:

accelerator="type:GPU_TYPE;count:GPU_COUNT;machine_type:MACHINE_TYPE;CONFIGURATION_OPTIONS"
  • GPU_TYPE 替换为要使用的 GPU 类型。如需查看 Dataflow 支持的 GPU 类型列表,请参阅 Dataflow 对 GPU 的支持
  • GPU_COUNT 替换为要使用的 GPU 数量。
  • 可选:将 MACHINE_TYPE 替换为要与 GPU 搭配使用的机器类型。
    • 机器类型必须与所选的 GPU 类型兼容。如需详细了解 GPU 类型及其兼容的机器类型,请参阅 GPU 平台
    • 如果您在 accelerator 资源提示和工作器机器类型流水线选项中指定机器类型,则在适配期间系统会忽略流水线选项。
  • 如需将 NVIDIA GPU 与 Dataflow 搭配使用,请设置 install-nvidia-driver 配置选项

如需详细了解如何使用 GPU,请参阅将 GPU 与 Dataflow 搭配使用

资源提示嵌套

资源提示在流水线转换层次结构中的应用方式如下:

  • min_ram:转换的取值为在转换本身以及转换在层次结构中的所有父级转换上设置的值中最大的 min_ram 提示值。
    • 示例:如果内层转换提示将 min_ram 设置为 16 GB,并且层次结构中的外层转换提示将 min_ram 设置为 32 GB,则整个转换中的所有步骤都使用 32 GB 的提示。
    • 示例:如果内层转换提示将 min_ram 设置为 16 GB,并且层次结构中的外层转换提示将 min_ram 设置为 8 GB,则所有不在内层转换中的外层转换步骤使用 8 GB 的提示,而内层转换中的所有步骤使用 16 GB 的提示。
  • accelerator:转换层次结构中的最内层值优先。
    • 示例:如果在一个层次结构中,内层转换 accelerator 提示与外层转换 accelerator 提示不同,则内层转换使用内层转换 accelerator 提示。

为整个流水线设置的提示被视为在单独的最外层转换上设置的提示。

使用资源提示

您可以设置整个流水线或流水线步骤的资源提示。

流水线资源提示

通过命令行运行流水线时,您可以设置整个流水线的资源提示。

如需设置 Python 环境,请参阅 Python 教程

示例

    python my_pipeline.py \
        --runner=DataflowRunner \
        --resource_hints=min_ram=numberGB \
        --resource_hints=accelerator="type:type;count:number;install-nvidia-driver" \
        ...

流水线步骤资源提示

您可以通过编程方式设置流水线步骤(转换)的资源提示。

Java

如需安装 Java 版 Apache Beam SDK,请参阅安装 Apache Beam SDK

您可以使用 ResourceHints以编程方式设置流水线转换的资源提示。

以下示例演示了如何以编程方式设置流水线转换的资源提示。

pcoll.apply(MyCompositeTransform.of(...)
    .setResourceHints(
        ResourceHints.create()
            .withMinRam("15GB")
            .withAccelerator(
    "type:nvidia-l4;count:1;install-nvidia-driver")))

pcoll.apply(ParDo.of(new BigMemFn())
    .setResourceHints(
        ResourceHints.create().withMinRam("30GB")))

如需以编程方式设置整个流水线的资源提示,请使用 ResourceHintsOptions 接口

Python

如需安装 Python 版 Apache Beam SDK,请参阅安装 Apache Beam SDK

您可以使用 PTransforms.with_resource_hints以编程方式设置流水线转换的资源提示。 如需了解详情,请参阅 ResourceHint

以下示例演示了如何以编程方式设置流水线转换的资源提示。

pcoll | MyPTransform().with_resource_hints(
    min_ram="4GB",
    accelerator="type:nvidia-tesla-l4;count:1;install-nvidia-driver")

pcoll | beam.ParDo(BigMemFn()).with_resource_hints(
    min_ram="30GB")

如需设置整个流水线的资源提示,请在运行流水线时使用 --resource_hints 流水线选项。如需查看示例,请参阅流水线资源提示

Go

Go 不支持资源提示。

支持多加速器

在流水线中,不同的转换可以具有不同的加速器配置。其中包括需要不同机器类型的配置。这些转换级加速器配置优先于流水线级配置(如果提供)。

适配和融合

在某些情况下,可以在融合优化过程中,对同一工作器池中的工作器执行使用不同资源提示设置的转换。融合转换后,Dataflow 将在满足转换上设置的资源提示并集的环境中执行转换。 在某些情况下,这包括整个流水线。

当资源提示无法合并时,不会进行融合。例如,不同 GPU 的资源提示无法合并,因此这些转换不会融合。

如需阻止融合,您还可以向流水线添加一项操作来强制 Dataflow 具体化中间 PCollection。当您尝试将 GPU 或高内存机器等昂贵资源与不需要这些特殊资源的缓慢或计算成本高的步骤隔离开时,这尤其有用。在这些情况下,强制在受限于 CPU 的缓慢步骤与需要昂贵的 GPU 或高内存机器的步骤之间中断融合,并支付与中断融合相关的物化费用,可能会有所帮助。如需了解详情,请参阅阻止融合

流处理适配

对于流处理作业,您可以通过设置 --experiments=enable_streaming_rightfitting 流水线选项来启用适配。

如果流水线涉及具有不同资源要求的各个阶段,则适配可能会提高流水线的性能。

示例:具有 CPU 密集型阶段和需要 GPU 的阶段的流水线

一个可能受益于适配的流水线示例是:先执行 CPU 密集型阶段,再执行需要 GPU 的阶段的流水线。如果不进行适配,则需要配置单个 GPU 工作器池来执行所有流水线阶段,包括 CPU 密集型阶段。当工作器池执行 CPU 密集型阶段时,这可能会导致 GPU 资源利用率不足。

如果启用了适配,并且向需要 GPU 的步骤应用资源提示,流水线将创建两个单独的池,以便 CPU 密集型阶段由 CPU 工作器池执行,而需要 GPU 的阶段由 GPU 工作器池执行。

对于此流水线示例,自动扩缩表显示执行 CPU 密集型阶段的工作器池 Pool 0 最初扩容到 99 个工作器,随后又缩容到 87 个工作器。执行需要 GPU 的阶段的工作器池 Pool 1 扩容到 13 个工作器:

显示两个池自动扩缩的表。

CPU 利用率图表显示,两个工作器池中的工作器都表现出较高的整体 CPU 利用率:

显示来自两个不同池的工作器的 CPU 利用率的图表。

排查适配问题

本部分介绍如何排查与适配相关的常见问题。

配置无效

尝试使用适配功能时,会发生以下错误:

Workflow failed. Causes: One or more operations had an error: 'operation-OPERATION_ID':
[UNSUPPORTED_OPERATION] 'NUMBER vCpus with NUMBER MiB memory is
an invalid configuration for NUMBER count of 'GPU_TYPE' in family 'MACHINE_TYPE'.'.

当所选 GPU 类型与所选机器类型不兼容时,就会发生此错误。如需解决此错误,请选择兼容的 GPU 类型和机器类型。如需了解兼容性详情,请参阅 GPU 平台

验证适配

您可以通过查看自动扩缩指标并验证 Worker pool 列是否可见且列出了不同的池,来验证是否启用了适配:

显示启用适配后,具有多个池的流水线的工作器历史记录的表。

流处理适配性能

启用了适配的流处理流水线的性能可能并不总是优于未启用适配的流水线。例如:

  1. 流水线使用更多工作器
  2. 系统延迟时间较长或吞吐量较低
  3. 工作器池大小变化更加频繁,或者不稳定

如果您发现流水线存在此情况,可以通过移除 --experiments=enable_streaming_rightfitting 流水线选项来停用适配。此外,如果启用了适配的流处理流水线使用加速器资源提示,则可能会使用比预期更多的加速器。如果您发现流水线存在此情况,可以通过设置 --experiments=max_num_accelerators=NUM 流水线选项,来配置流水线使用的加速器数量上限。