tensorflow如何忽略未定义的标志

时间:2018-02-02 23:26:17

标签: python tensorflow flask gunicorn

我将一个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.xpython 3.6.0,我用于枪械的命令是:

gunicorn -b 0.0.0.0:5000 -t 30 wsgi:app

2 个答案:

答案 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文档中未提及此默认配置名称,因此不确定此配置文件名称在将来的版本中是否保持不变。