我有一个训练模型的任务,例如:
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'
这方面的任何指针都会有所帮助
答案 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 ...
我认识到这篇文章是过时的,但是将我发现的解决方案放到那里,为下一个可怜的灵魂尝试做同样的事情。