我正在使用Elastic beanstalk作为托管在Elastic beanstalk上的端点api。我需要先运行一些设置代码,然后才能调用api端点,以便它们更快返回。但是出于某种原因,无论我把它放在哪里,代码都永远不会运行。
下面的代码并不完全是我所拥有的,因为我无法全部显示,但是它可以模拟我所遇到的问题。似乎从未调用过函数setup_flask(),因为没有一个打印语句在弹性beantalk输出中运行。端点应答器被调用时,我的程序出错,因为sess从未初始化。
import tensorflow as tf
from flask import Flask, jsonify
import pandas as pd
import tensorflow_hub as hub
import os
sess = None
def setup_flask():
print('Starting setting up flask')
global sess
global embedding_fun
global sentences_ph
global df
embed = hub.Module("https://tfhub.dev/google/universal-sentence-encoder-large/3")
sentences_ph = tf.placeholder(dtype=tf.string, shape=[None])
embedding_fun = embed(sentences_ph)
sess = tf.Session()
sess.run([tf.global_variables_initializer(), tf.tables_initializer()])
class MyFlaskApp(Flask):
def run(self, host=None, port=None, debug=None, load_dotenv=True, **options):
print("flask.run() is running")
setup_flask()
print('Setup complete')
super(MyFlaskApp, self).run(host=host, port=port, debug=debug, load_dotenv=load_dotenv, **options)
print('Starting application')
application = MyFlaskApp(__name__)
if __name__ == "__main__":
print("starting main")
application.run()
@application.route('/answerer/<question>',methods=['GET'])
def get_response(question):
global sess
global embedding_fun
global sentences_ph
global df
sentence_vector = sess.run(embedding_fun, feed_dict={sentences_ph: [question]})
return sentence_vector
我唯一的想法可能是setup_flask()实际上是在其他上下文中运行的。但是,我尝试过将其移动,但没有任何效果。如果有更好的方法可以在flask部署上进行这种初始化,请告诉我。我知道代码有点混乱,只是为了使它正常工作,我真的搞砸了。