У меня есть сервер Flask, который загружает Tensorflow
модели при запуске во внешнем сервисном модуле.
Проблема в том, что если включен режим отладки, поэтому FLASK_DEBUG = 1
, приложение вылетает, потому что оно не удалось загрузить определенный модуль из Tensorflow. tensorflow_core.keras
, если быть точным.
Однако запуск приложения без отладки работает.
Структура проекта выглядит следующим образом:
controllers/
__init__.py # Exposes controllers_blueprint
controller.py
services/
service.py
__init__.py # Exposes app, socketio
model_util.py # Used to load models, imports Tensorflow
server.py
Итак, в services/service.py
при загрузке модуля я вызываю функцию, которая выполняет эту работу:
import model_util
def _load_models():
# Loading models here using model_util.load(..)
return models
_models = _load_models()
Этот модуль импортируется из controllers/controller.py
from services import service
from flask import current_app, request
from application import socketio
NAMESPACE = '/test'
@socketio.on('connect', namespace=NAMESPACE)
def handle_connect():
service.create_session(request.sid)
, где controllers/__init__.py
предоставляет controller_blueprint
:
from flask import Blueprint
from controllers import controller
controllers_blueprint = Blueprint('controllers', __name__)
Который затем регистрируется в моем server.py
from flask import current_app
from controllers import controllers_blueprint
from application import app, socketio
def main():
app.register_blueprint(controllers_blueprint)
socketio.run(app)
if __name__ == '__main__':
main()
Для полноты, это __init__.py
from flask import Flask
from flask_caching import Cache
from flask_socketio import SocketIO
HTTP_SERVER_PORT = 5000
app = Flask(__name__, static_folder='../static', static_url_path='')
cache = Cache(config={'CACHE_TYPE': 'simple'})
cache.init_app(app)
socketio = SocketIO(app)
socketio.init_app(app)
Также model_util.py
где импортируются модули Tensorflow:
import tensorflow as tf
from tensor2tensor.data_generators.text_encoder import SubwordTextEncoder
# ...
def load(...):
# ..
pass
Я получаю ошибку
Traceback (most recent call last):
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/flask/__main__.py", line 15, in <module>
main(as_module=True)
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/flask/cli.py", line 967, in main
cli.main(args=sys.argv[1:], prog_name="python -m flask" if as_module else None)
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/flask/cli.py", line 586, in main
return super(FlaskGroup, self).main(*args, **kwargs)
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/click/core.py", line 782, in main
rv = self.invoke(ctx)
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/click/core.py", line 1259, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/click/core.py", line 1066, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/click/decorators.py", line 73, in new_func
return ctx.invoke(f, obj, *args, **kwargs)
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/click/core.py", line 610, in invoke
return callback(*args, **kwargs)
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/flask/cli.py", line 860, in run_command
extra_files=extra_files,
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/werkzeug/serving.py", line 1050, in run_simple
run_with_reloader(inner, extra_files, reloader_interval, reloader_type)
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/werkzeug/_reloader.py", line 337, in run_with_reloader
reloader.run()
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/werkzeug/_reloader.py", line 202, in run
for filename in chain(_iter_module_files(), self.extra_files):
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/werkzeug/_reloader.py", line 24, in _iter_module_files
filename = getattr(module, "__file__", None)
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/tensorflow/__init__.py", line 50, in __getattr__
module = self._load()
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/site-packages/tensorflow/__init__.py", line 44, in _load
module = _importlib.import_module(self.__name__)
File "/Users/sfalk/miniconda3/envs/web-service/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 965, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'tensorflow_core.keras'
В чем причина этого и как я могу решить эту проблему?
Дополнительная информация
Я запускаю приложение с PyCharm. Это вывод при запуске:
FLASK_APP = application/server.py
FLASK_ENV = development
FLASK_DEBUG = 1
In folder /Users/sfalk/workspaces/git/web-service
/Users/sfalk/miniconda3/envs/web-service/bin/python -m flask run
* Serving Flask app "application/server.py" (lazy loading)
* Environment: development
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 298-908-268