Переопределить атрибут класса для файла модели pkl, обработанного в сельдерее - PullRequest
0 голосов
/ 15 января 2020

У меня есть модель, которая используется для предсказания topi c в тексте, который работает с внешним классом. Учитывая, что процесс реализован на платформе Django, он проходит через завернутую в сельдерей задачу. Таким образом, существует проблема с импортом этого класса. Это задача сельдерея, часть кода удалена из-за неразглашения и не является обязательной для решения

from <Full path> import TopicModel



def process_prediction(data, field, model):

   predict_data = []
   for doc in data:
       predict_data.append(doc.get(field, doc['content']))

   prediction = model.predict(predict_data)

   for pred, doc in zip(prediction, data):
       logger.info("This was predicted {}".format(pred))
       if "tags" not in doc:
           doc["tags"] = []
       doc["tags"].append({"name": pred, "type": "topic"})

   return zip(prediction, data)

импорт, и эта функция позже вызывается через задачу и некоторые другие функции:

@app.task(name='<path>', bind=True, base=DatabaseTask)
def top_mod(self, inputf, outputf, extra=None):

    self.update_state(state="PROGRESS", meta={'progress': 0})
    try:
        if extra and extra.get('search_query', ''):
            inputf['query'] = extra['search_query']

        self.file_asset = FileAssets.get_asset()
        self.file_asset.get_file(extra.get('model_filename'))

        with open(<PATH.), extra.get('model_filename')), 'rb') as model_filename:
            model = pickle.load(model_filename)

        loop = asyncio.get_event_loop()
        task = loop.create_task(process(inputf, outputf, extra.get('field', 'content'), model, extra.get('threads', 2), extra.get('job_id', '')))
        loop.run_until_complete(task)
        return True
    except Exception as e:
        logger.error("Exception occured in run topic. Message: {}".format(str(e)))
        job_status = JobStatus(extra.get('job_id'), top_mod.session)
        current_state = job_status.read_state()
        current_state['status'] = 'error'
        current_state['message'] = "Error occured in creating task"
        job_status.write_state(current_state)
        return False
* Модель 1006 * pkl использует этот класс TopicModel для загрузки файла с pickle. Когда процесс запускается из внешнего интерфейса, возникает ошибка: AttributeError: Can't get attribute 'TopicModel' on <module 'celery.bin.celery' from...

Возможное решение: я импортировал класс напрямую в корзину сельдерея в среде и работает как чудо, но мне интересно, есть ли другой способ переопределить его через django код, чтобы я не связывался с файлами env.

...