es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La salida PICKLE de LIGHTGBM no funciona con múltiples trabajadores de SANIC (>1), pero sí funciona con un solo trabajador.

Estoy intentando cargar la salida del modelo de aprendizaje automático con Sanic. He cargado la salida en el método principal (definido de forma global). Funciona bien cuando configuro el número de trabajadores de Sanic como 1, pero no funciona cuando hay múltiples trabajadores de Sanic definidos globalmente. Mi código espera un tiempo indefinido para que el modelo genere el resultado deseado.

Funciona cuando cargo la salida del modelo dentro de la función (por ejemplo, aquí en el método “modelrun”) incluso si hay más de 1 trabajador de Sanic.

Funciona cuando cargo la salida del modelo de forma global (fuera de la función), pero solo si hay 1 trabajador de Sanic.

No funciona cuando cargo la salida del modelo de forma global (fuera de la función) si hay más de 1 trabajador de Sanic.

import pickle
import sanic

if __name__ == '__main__':
    df = pd.DataFrame()

    p_file_path = "/Users/pratiksha/FModel_06Jan_Smote_Sel_Vars_48.dat"
    pickle_file = open(path, 'rb')
    lbg_model_smote_sel_vars = pickle.load(pickle_file)

    modelrun(df, lbg_model_smote_sel_vars)

    app.run(host=app_host, port=int(app_port), debug=True,
            auto_reload=True, workers=int(10))


def modelrun(df_f, lbg_model_smote_sel_vars):
    training_pred_smote = lbg_model_smote_sel_vars.predict_proba(df_f)
    return training_pred_smote

Versiones utilizadas

  1. sanic==20.12.1
  2. lightgbm==3.3.1
  3. numpy==1.20.1
  4. pandas==1.2.4
  5. scikitlearn==1.0.2
  6. scipy==1.6.2
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución para cargar la salida del modelo de aprendizaje automático con Sanic

    El problema que se enfrenta al cargar la salida del modelo de aprendizaje automático con Sanic se puede resolver cargando la salida dentro de la función en lugar de hacerlo globalmente. Cuando se carga la salida del modelo de forma global, se comparte entre todos los trabajadores de Sanic, lo que puede causar conflictos y retrasos en la generación de los resultados deseados del modelo. Sin embargo, cuando la salida se carga dentro de la función, cada trabajador tendrá su propia copia de los datos, evitando así cualquier conflicto.

    Aquí hay una versión modificada del código que carga la salida del modelo dentro de la función modelrun():

    import pickle
    import pandas as pd
    from sanic import Sanic
    
    app = Sanic(__name__)
    
    @app.route("/")
    async def test(request):
        results = modelrun(df, lbg_model_smote_sel_vars)
        return response.json({'results': results})
    
    def modelrun():
        df = pd.DataFrame()
        p_file_path = "/Users/pratiksha/FModel_06Jan_Smote_Sel_Vars_48.dat"
        with open(p_file_path, 'rb') as f:
            lbg_model_smote_sel_vars = pickle.load(f)
        training_pred_smote = lbg_model_smote_sel_vars.predict_proba(df)
        return training_pred_smote
    
    if __name__ == '__main__':
        app.run(host="0.0.0.0", port=8000, debug=True, workers=10)
    

    En este código, hemos definido la carga y ejecución del modelo dentro de la función modelrun(), la cual luego es llamada desde la ruta test(). Este enfoque asegura que cada trabajador tenga su propia copia de los datos y también evita cualquier retraso causado por conflictos.

    También es importante tener en cuenta que hemos usado la declaración with al cargar el archivo pickle. Esta es una forma más limpia de utilizar la función open, ya que proporciona un mejor manejo de excepciones en comparación con la apertura tradicional del archivo.

    Por último, el parámetro auto_reload en la función app.run() ha sido eliminado, ya que puede causar una recarga innecesaria de la aplicación y debe usarse con precaución.

Comments are closed.