Apache Beam广播了一个spacy模型作为Dataflow中的边输入

问题描述

我正在使用python sdk并尝试广播spacy模型(〜50MB)。作业将在Dataflow上运行。 我是新来的,并且根据我的理解:由于作业大小受到限制,我们无法在map函数中加载大型对象,并且在提交作业之前也无法加载大型对象。以下是在工作程序上“延迟加载”大型对象的解决方法

        ner_model = (
            pipeline
            | "ner_model" >> beam.Create([None])
            | beam.Map(lambda x: spacy.load("en_core_web_md"))
        )

        (
            pipeline
            | bq_input_op
            | beam.Map(use_model_to_extract_person,beam.pvalue.AsSingleton(ner_model))
            | bq_output_op
        )

但是我明白了 Workflow Failed. Causes: The Dataflow job appears to be stuck because no worker activity has been seen in the last 1h. Please check the worker logs in Stackdriver Logging. 但是,根本没有生成Stackdriver日志。我在正确的轨道上吗?

编辑: 我正在使用apache-beam 2.23.0

解决方法

问题可能是您的工作人员没有足够的内存。可能您可以使用更多的内存来解决此问题。当前,默认工作程序为n1-standard-1,仅具有3.75 GB的RAM。

相关的PipelineOption是:

workerMachineType字符串

Dataflow启动时使用的Compute Engine计算机类型 工作虚拟机。您可以使用任何可用的Compute Engine计算机 类型系列以及自定义计算机类型。

有关更多信息,请参见here

,

如果要加载大型静态模型,可以尝试使用DoFn并将其加载到DoFn.setUp中,而不是将其作为侧面输入传递。