如何在luigi中将模型pickle文件输出到s3?

时间:2018-11-21 14:51:07

标签: python luigi

我有一个训练模型的任务,例如:

class ModelTrain(luigi.Task):
    def output(self):
        client = S3Client(os.getenv("CONFIG_AWS_ACCESS_KEY"),
                          os.getenv("CONFIG_AWS_SECRET_KEY"))
        model_output = os.path.join(
            "s3://", _BUCKET, exp.version + '_model.joblib')
        return S3Target(model_output, client) 

    def run(self):
        joblib.dump(model, '/tmp/model.joblib')
    with open(self.output().path, 'wb') as out_file:
        out_file.write(joblib.load('/tmp/model.joblib'))        

FileNotFoundError:[错误2]没有这样的文件或目录:'s3://bucket/version_model.joblib'

这方面的任何指针都会有所帮助

2 个答案:

答案 0 :(得分:0)

您能否尝试在打开的语句中删除.path。

  def run(self):
    joblib.dump(model, '/tmp/model.joblib')
    with open(self.output(), 'wb') as out_file:
        out_file.write(joblib.load('/tmp/model.joblib'))

答案 1 :(得分:0)

一些建议-

首先,请确保您使用的是实际的self.output().open()方法,而不是包装open(self.output().path)。这失去了luigi目标的“原子性”,而且这些目标应该是可交换的,因此,如果您改回LocalTarget,则代码应以相同的方式工作。您让特定的目标类处理打开文件的含义。您收到的错误似乎是python正在尝试查找本地路径,这显然不起作用。

第二,我遇到了同样的问题,所以这是我的解决方案插入到此代码中的原因:

from luigi import format

class ModelTrain(luigi.Task):
    def output(self):
        client = S3Client(os.getenv("CONFIG_AWS_ACCESS_KEY"),
                          os.getenv("CONFIG_AWS_SECRET_KEY"))
        model_output = os.path.join(
            "s3://", _BUCKET, exp.version + '_model.joblib')
        # Use luigi.format.Nop for binary files
        return S3Target(model_output, client, format=format.Nop) 

    def run(self):
        # where does `model` come from?
        with self.output().open('w') as s3_f:
            joblib.dump(model, s3_f)

我的任务是使用pickle,因此我必须遵循类似于this post的操作来重新导入。

class MyNextTask(Task):
    ...

    def run(self):
        with my_pickled_task.output().open() as f:
            # The S3Target implements a read method and then I can use
            # the `.loads()` method to import from a binary string
            results = pickle.loads(f.read())

        ... do more stuff with results ...

我认识到这篇文章是过时的,但是将我发现的解决方案放到那里,为下一个可怜的灵魂尝试做同样的事情。