Google cloud dataflow 在DoFn中下载文件

Google cloud dataflow 在DoFn中下载文件,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,目前尚不清楚在DoFn中下载文件是否安全 我的DoFn将下载一个~20MB的文件和一个ML模型,以应用于我管道中的元素。根据Beam文档,包括可序列化性和线程兼容性 例如,与我的DoFn非常相似。它演示了在我使用DataflowRunner时从GCP存储桶下载,但我不确定这种方法是否安全 是否应该将对象下载到,而不是下载到磁盘,或者对于这个用例是否还有其他最佳实践?我还没有找到这种模式的最佳实践方法。如果它是一个scikit学习模型,那么您可以考虑在Cloud ML Engine中托管它,并将其

目前尚不清楚在DoFn中下载文件是否安全

我的DoFn将下载一个~20MB的文件和一个ML模型,以应用于我管道中的元素。根据Beam文档,包括可序列化性和线程兼容性

例如,与我的DoFn非常相似。它演示了在我使用DataflowRunner时从GCP存储桶下载,但我不确定这种方法是否安全


是否应该将对象下载到,而不是下载到磁盘,或者对于这个用例是否还有其他最佳实践?我还没有找到这种模式的最佳实践方法。

如果它是一个scikit学习模型,那么您可以考虑在Cloud ML Engine中托管它,并将其作为REST端点公开。然后,您可以使用BagState之类的工具来优化网络上的模型调用。更多详细信息可在此链接中找到

如果它是一个scikit学习模型,那么您可以查看在Cloud ML Engine中托管它并将其作为REST端点公开。然后,您可以使用BagState之类的工具来优化网络上的模型调用。更多详细信息可在此链接中找到

添加答案

如果您的模型数据是静态的,则可以使用下面的代码示例将您的模型作为侧输入传递

#DoFn to open the model from GCS location
class get_model(beam.DoFn):
    def process(self, element):
        from apache_beam.io.gcp import gcsio
        logging.info('reading model from GCS')
        gcs = gcsio.GcsIO()
        yield gcs.open(element)


#Pipeline to load pickle file from GCS bucket
model_step = (p
              | 'start' >> beam.Create(['gs://somebucket/model'])
              | 'load_model' >> beam.ParDo(get_model())
              | 'unpickle_model' >> beam.Map(lambda bin: dill.load(bin)))

#DoFn to predict the results.
class predict(beam.DoFn):
    def process(self, element, model):
        (features, clients) = element
        result = model.predict_proba(features)[:, 1]
        return [(clients, result)]

#main pipeline to get input and predict results.
_ = (p
     | 'get_input' >> #get input based on source and preprocess it.
     | 'predict_sk_model' >> beam.ParDo(predict(), beam.pvalue.AsSingleton(model_step))
     | 'write' >> #write output based on target.
在流式管道的情况下,如果您想在预定义时间后再次加载模型,您可以检查缓慢更改的查找缓存模式。

添加到答案中

如果您的模型数据是静态的,则可以使用下面的代码示例将您的模型作为侧输入传递

#DoFn to open the model from GCS location
class get_model(beam.DoFn):
    def process(self, element):
        from apache_beam.io.gcp import gcsio
        logging.info('reading model from GCS')
        gcs = gcsio.GcsIO()
        yield gcs.open(element)


#Pipeline to load pickle file from GCS bucket
model_step = (p
              | 'start' >> beam.Create(['gs://somebucket/model'])
              | 'load_model' >> beam.ParDo(get_model())
              | 'unpickle_model' >> beam.Map(lambda bin: dill.load(bin)))

#DoFn to predict the results.
class predict(beam.DoFn):
    def process(self, element, model):
        (features, clients) = element
        result = model.predict_proba(features)[:, 1]
        return [(clients, result)]

#main pipeline to get input and predict results.
_ = (p
     | 'get_input' >> #get input based on source and preprocess it.
     | 'predict_sk_model' >> beam.ParDo(predict(), beam.pvalue.AsSingleton(model_step))
     | 'write' >> #write output based on target.

在流式管道的情况下,如果您想在预定义时间后再次加载模型,可以检查缓慢变化的查找缓存模式。

在这种特殊情况下,它不是sklearn模型,而是Keras,但符合sklearn Transformer接口的Cloud ML引擎可用于托管使用不同ML框架开发的各种模型。它可以承载使用Keras+TensorFlow开发的模型,感谢您的建议。我不确定它对Cloud ML引擎的标准化程度是否足够:它是一个定制的sklearn transformer,在初始化时从GCP bucket加载一个预先训练过的Keras模型在这种特殊情况下,它不是一个sklearn模型,而是Keras,但符合sklearn Transformer接口的Cloud ML引擎可用于托管使用不同ML框架开发的各种模型。它可以承载使用Keras+TensorFlow开发的模型,感谢您的建议。我不确定它对于Cloud ML引擎是否足够标准化:它是一个定制的sklearn transformer,它从其init中的GCP bucket加载一个预先训练过的Keras模型。在DoFn中下载一个文件会使DoFn成为DoFn,并产生副作用。我不知道你具体问题的最佳实践。但对于具有副作用的DoFn有一个通用的指导:记住数据流期望DoFn是幂等的。这是因为数据流尝试精确一次,以便可以在DoFn上重试。当您使用带有副作用的DoFn时,请记住这一点。from search:DoFn中的代码需要编写,以便这些重复的顺序或并发执行不会导致问题。如果DoFn的输出是其输入的纯函数,则满足此要求。但是,如果DoFn的执行具有外部副作用,例如对外部HTTP服务执行更新,则DoFn的代码需要注意确保这些更新是幂等的,并且并发更新是可接受的。此属性可能很难实现,因此建议尽可能将dofn保持为纯函数。不确定此问题是针对批处理还是流,但如果您的模型是静态的,则可以将其作为辅助输入传递给dofn。类似答案@Sach static batch model。我怀疑有一个侧面输入,但还没有遇到从一个侧面加载模型的示例。。。这是我的第一个Beam管道,所以如果你有这样的例子,请分享下载DoFn中的文件会使DoFn成为DoFn并产生副作用。我不知道你具体问题的最佳实践。但对于具有副作用的DoFn有一个通用的指导:记住数据流期望DoFn是幂等的。这是因为数据流尝试精确一次,以便可以在DoFn上重试。当您使用带有副作用的DoFn时,请记住这一点。from search:DoFn中的代码需要编写,以便这些重复的顺序或并发执行不会导致问题。如果DoFn的输出是其输入的纯函数,则满足此要求。但是,如果DoFn的执行具有外部副作用,例如对外部HTTP服务执行更新,则DoFn的代码需要注意确保这些更新是幂等的,并且并发更新是可接受的。此属性可能很难实现,因此建议尽可能将dofn保持为纯函数不确定此问题是针对批处理还是流,但如果您的模型是静态的,则可以将其作为辅助输入传递给dofn.sim
ilar answer@Sach静态批处理模型。我怀疑有一个侧面输入,但还没有遇到从一个侧面加载模型的示例。。。这是我的第一个梁管道,因此如果您有这样的示例,请务必与我们分享缓慢更改的查找缓存在梁模式下也可用:缓慢更改的查找缓存在梁模式下也可用: