Как передать данные из конечной точки обслуживания модели Databricks?

Я разрабатываю приложение, использующее Custom PyFunc из MLflow. Приложение включает в себя несколько компонентов, таких как перефразирование запроса, обнаружение намерений, извлечение фрагментов и генерация ответов. Весь процесс занимает около 7–8 секунд, причем первые 3–4 секунды используются для извлечения фрагмента, а оставшиеся 3–4 секунды – для генерации ответа.

Чтобы улучшить взаимодействие с пользователем, я хочу начать потоковую передачу окончательного ответа от OpenAI с 4-й секунды, чтобы пользователю не приходилось ждать полные 7-8 секунд. Однако я столкнулся с проблемой, из-за которой я не могу вернуть генератор из обычного метода прогнозирования в MLflow, получая следующую ошибку:

mlflow.exceptions.MlflowException: Encountered an unexpected error while converting model response to JSON. Error: 'Object of type generator is not JSON serializable.'

Я обнаружил, что Predict_stream в документации MLflow может возвращать генератор. Это хорошо работает с load_model в записной книжке, но когда я обновляю модель в конечной точке обслуживания модели, я получаю ответ None.

Вот собственный пример, который я нашел в документации MLflow:

import mlflow

# Define a custom model that supports streaming
class StreamableModel(mlflow.pyfunc.PythonModel):
    def predict_stream(self, context, model_input, params=None):
        # Yielding elements one at a time
        for element in ["a", "b", "c", "d", "e"]:
            yield element

Вот код для регистрации модели:

with mlflow.start_run():
    # Log the custom Python model
    mlflow.pyfunc.log_model("stream_model", python_model=StreamableModel(),registered_model_name = "stream_model",streamable=True)

Есть ли способ вернуть генератор из конечной точки обслуживания модели?

добавьте код того, как вы регистрируете модель.

JayashankarGS 27.06.2024 11:35

@JayashankarGS обновил код журнала модели.

silenthunter25 27.06.2024 13:33

@JayashankarGS Я видел этот пример, где они возвращают ссылку на генератор . Но похоже, что на данный момент на сервере подсчета очков отсутствует функция потоковой передачи. Спасибо за помощь !!

silenthunter25 27.06.2024 15:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно этой документации тип возвращаемого значения должен быть Iterator[Union[Dict[str, Any], str]] со словарем или строкой.

Итак, тип объекта-генератора не работает.

Даже если вы добавите функцию, как показано ниже.

def predict_stream(self, context, model_input, params=None):
        return iter([1,3,2,3])

Сервер подсчета очков пытается вызвать саму функцию predict, а не predict_stream.

На изображении ниже вы можете видеть, что результат равен нулю.

Вы можете обратиться к этому по вышеуказанному вопросу.

Сообщество пытается добавить эту поддержку до тех пор, пока вы не воспользуетесь функцией predict.

Другие вопросы по теме