Estoy usando fastapi para hacer predicciones en un modelo ml. Debido a que una sola predicción tarda más de 2 minutos, he hecho que la predicción se ejecute como una tarea en segundo plano usando las tareas en segundo plano de fastapi. Ahora, cuando implementé en Digital Ocean, no pude ejecutar el trabajador en segundo plano. Recibo 504: Gateway Timeout Error de enlace.
comando de inicio
gunicorn --worker-tmp-dir /dev/shm --config gunicorn.config.py main:app gunicorn.config.py
bind = "0.0.0.0:8080" workers = 4 worker_class = "uvicorn.workers.UvicornWorker" main.py
response = {} async def predictions(solute, solvent): mol = Chem.MolFromSmiles(solute) solute_graph = get_graph_from_smile(solute) mol = Chem.MolFromSmiles(solvent) solvent_graph = get_graph_from_smile(solvent) delta_g, interaction_map = model([solute_graph.to(device), solvent_graph.to(device)]) interaction_map_one = torch.trunc(interaction_map) response["interaction_map"] = (interaction_map_one.detach().numpy()).tolist() response["predictions"] = delta_g.item() @app.post('/predict_solubility') async def post(): return {'result': response} @app.post('/predict') async def predict(background_tasks: BackgroundTasks,solute,solvent): background_tasks.add_task(predictions,solute,solvent) return {'success'} response_two = {} async def predictions_two(solute): for i in data: delta_g, interaction_map = model([get_graph_from_smile(Chem.MolToSmiles(Chem.AddHs(Chem.MolFromSmiles(solute)))).to(device), get_graph_from_smile(Chem.MolToSmiles(Chem.AddHs(Chem.MolFromSmiles(i)))).to(device)]) response_two[i] = delta_g.item() @app.post('/predict_solubility_json') async def post(): return {'result': response_two} @app.get('/predict_two') async def predict_two(background_tasks: BackgroundTasks,solute): background_tasks.add_task(predictions_two,solute) return {'success'} if __name__ == "__main__": uvicorn.run(app,host="0.0.0.0", port=8000, reload=True) He agregado un worker en el océano digital de los componentes a pesar de que todavía tengo un tiempo de espera del servidor. No estoy seguro de si no he implementado tareas en segundo plano usando fastapi porque hay algún problema con mi comando de inicio