我将一个tensorflow模型包装在一个简单的flask
服务器中,并且我为gunicorn
服务器添加了flask
wsgi。当我运行gunicorn并尝试发送一个请求来调用我已经导入到烧录服务器的火车功能时,我从命令行参数解析中得到一个错误:
absl.flags._exceptions.UnrecognizedFlagError:未知的命令行 旗帜' b'
我知道当gunicorn绑定地址参数时会传递这些标志,因为我没有标记为' b'对于张量流。所以我的问题是tensorflow如何忽略tf.app.run()
函数不会抱怨的这些未定义的标志?
仅供参考,这是我的服务器结构:
wsgi.py:
from simple_server import app
if __name__ == "__main__":
app.run()
simple_server.py:
from my_tf_model import my_train
@app.route('/call_train', methods=['POST'])
def call_train():
if request.method == 'POST':
training_data = request.json
my_train(training_data, param2)
return('Trained!')
my_tf_model.py:
tf.app.flags.DEFINE_integer('model_version',1, 'version number of the model.')
tf.app.flags.DEFINE_string('work_dir', '', 'Working directory.')
FLAGS = tf.app.flags.FLAGS
def my_train(param1, param2):
# Train Algorithm
export_path_base = FlAGS.work_dir
# Exporting model code
def main(argv):
my_train(param1, param2)
if __name__ == "__main__":
tf.app.run()
更新
我使用tensorflow 1.5.x
和python 3.6.0
,我用于枪械的命令是:
gunicorn -b 0.0.0.0:5000 -t 30 wsgi:app
答案 0 :(得分:2)
我通过在张量流模型中定义这些标志来解决我的问题:my_tf_model.py
。
tf.app.flags.DEFINE_string('bind', '', 'Server address')
tf.app.flags.DEFINE_integer('timeout', 30, 'Server timeout')
然后将我的gunicorn命令行改为使用双破折号样式命令行:
gunicorn --bind 0.0.0.0:5000 --timeout 30 wsgi:app
但我认为应该采用其他方式而不是这种方法来解决全局使用的标志。
答案 1 :(得分:0)
我通过使用gunicorn默认配置文件gunicorn.conf.py
您可以创建一个名为gunicorn.conf.py
的配置文件:
bind = 0.0.0.0:5000
timeout = 30
仅供参考:Settings - Gunicorn documentation
gunicorn_conf.py
是功能gunicorn.config.get_default_config_file
中定义的默认配置文件名,因此现在您可以通过命令gunicorn wsgi:app
启动服务。
现在tensorflow对gunicorn配置一无所知。
注意:gunicorn文档中未提及此默认配置名称,因此不确定此配置文件名称在将来的版本中是否保持不变。