Как вывести файл модели pickle на s3 в luigi? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть задача, которая обучает модель, например:

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: [Errno 2] Нет такого файла или каталога: 's3: //bucket/version_model.joblib'

Любые указатели в этом отношении были бы полезны

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Несколько предложений-

Во-первых, убедитесь, что вы используете фактический метод self.output().open() вместо переноса open(self.output().path).Это теряет «атомарность» целей luigi, плюс предполагается, что эти цели можно заменять, поэтому, если вы вернетесь обратно к aa 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, поэтому мне пришлось следовать чему-то похожему на этот пост для повторного импорта.

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 ...

Я признаю, что этот пост устарел, но я нашел решение, которое нашел там для следующей бедной души, пытающейся сделать то же самое.

0 голосов
/ 26 ноября 2018

Не могли бы вы попытаться удалить .path в своем операторе open.

  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'))
...