适配功能使用 Apache Beam 资源提示来自定义流水线的工作器资源。为特定的流水线步骤指定多个不同资源可提高流水线的灵活性和能力,并可能节省费用。您可以将成本较高的资源应用于需要这些资源的流水线步骤,并将成本较低的资源应用于其他流水线步骤。使用适配功能可指定整个流水线或特定流水线步骤的资源要求。
支持和限制
- Apache Beam Java 和 Python SDK 2.31.0 版及更高版本支持资源提示。
- 批处理流水线支持适配功能。
启用了横向自动扩缩的流处理流水线支持适配功能。
- 您可以通过设置
--experiments=enable_streaming_rightfitting
流水线选项来启用它。
- 您可以通过设置
适配功能支持 Dataflow Prime。
适配功能不支持 FlexRS。
使用适配功能时,请勿使用
worker_accelerator
服务选项。
启用适配
如需启用适配,请在流水线中使用一个或多个可用的资源提示。在流水线中使用资源提示时,系统会自动启用适配功能。如需了解详情,请参阅本文档的使用资源提示部分。
可用的资源提示
以下资源提示适用。
资源提示 | 说明 |
---|---|
min_ram |
分配给工作器的最小 RAM(以 GB 为单位)。 在为新工作器(横向扩缩)或现有工作器(纵向扩缩)分配内存时,Dataflow 使用此值作为下限。 例如: min_ram=NUMBERGB
|
accelerator |
由用户提供的 GPU 分配,可让您控制流水线及其步骤中 GPU 的使用和费用。以标志的参数形式指定要挂接到 Dataflow 工作器的 GPU 类型和数量。 例如: accelerator="type:GPU_TYPE;count:GPU_COUNT;machine_type:MACHINE_TYPE;CONFIGURATION_OPTIONS"
如需详细了解如何使用 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 利用率:
排查适配问题
本部分介绍如何排查与适配相关的常见问题。
配置无效
尝试使用适配功能时,会发生以下错误:
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
列是否可见且列出了不同的池,来验证是否启用了适配:
流处理适配性能
启用了适配的流处理流水线的性能可能并不总是优于未启用适配的流水线。例如:
- 流水线使用更多工作器
- 系统延迟时间较长或吞吐量较低
- 工作器池大小变化更加频繁,或者不稳定
如果您发现流水线存在此情况,可以通过移除 --experiments=enable_streaming_rightfitting
流水线选项来停用适配。此外,如果启用了适配的流处理流水线使用加速器资源提示,则可能会使用比预期更多的加速器。如果您发现流水线存在此情况,可以通过设置 --experiments=max_num_accelerators=NUM
流水线选项,来配置流水线使用的加速器数量上限。