Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[inception-recommender] Neustart des Docker Containers bei Fehlerfall. #32

Open
hunnguye opened this issue Nov 6, 2024 · 9 comments · Fixed by #41
Open

[inception-recommender] Neustart des Docker Containers bei Fehlerfall. #32

hunnguye opened this issue Nov 6, 2024 · 9 comments · Fixed by #41
Labels
bug Something isn't working enhancement New feature or request

Comments

@hunnguye
Copy link
Contributor

hunnguye commented Nov 6, 2024

Situationsbeschreibung

Wir nutzen den Recommender in Verbindung mit Inception und der AHD. Wie in der Dokumentation beschrieben, wird empfohlen, den Recommender erst nach dem Start der AHD zu starten.

Aktuell haben wir das Problem, dass der Recommender Fehler ausgibt und keine Annotationsempfehlungen mehr liefert, sobald die AHD neu gestartet werden muss (z.B. wegen Wartung oder Updates). Wenn der Recommender jedoch ebenfalls neu gestartet wird, treten keine weiteren Fehler mehr auf, und die Annotationsempfehlungen funktionieren wieder.

Fehlermeldung im recommender Container:

[2024-11-06 13:14:31 +0000] [11] [INFO] Got prediction request for [deid_recommender]
INFO:ariadne.server:Got prediction request for [deid_recommender]
[2024-11-06 13:14:31 +0000] [11] [ERROR] Exception on /deid_recommender/predict [POST]
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2529, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1825, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1823, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
  File "/inception_ahd_recommender/ariadne/server.py", line 70, in _predict
    req.user_id,
  File "/inception_ahd_recommender/ariadne/contrib/external_uima_classifier.py", line 352, in predict
    _server_response = self.process_text(cas.sofa_string, cas.document_language)
  File "/inception_ahd_recommender/ariadne/contrib/external_uima_classifier.py", line 330, in process_text
    self.get_pipeline().analyse_text_to_cas(source=text, language=language)
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 100, in new_function
    return original_function(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 457, in analyse_text_to_cas
    timeout=timeout,
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 100, in new_function
    return original_function(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 2569, in _analyse_text_xmi
    timeout=timeout,
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 1802, in __request_with_bytes_response
    self.__handle_error(raw_response)
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 2974, in __handle_error
    raise RequestException(error_msg)
requests.exceptions.RequestException: 404 Server Error: 'Not Found' for url: 'https://averbis-dev.test.med.tu-dresden.de/health-discovery/rest/experimental/textanalysis/projects/GeMTeX/pipelines/deid/analyzeTextToCas?language=x-unspecified'.
ERROR:ariadne.server:Exception on /deid_recommender/predict [POST]
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2529, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1825, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1823, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
  File "/inception_ahd_recommender/ariadne/server.py", line 70, in _predict
    req.user_id,
  File "/inception_ahd_recommender/ariadne/contrib/external_uima_classifier.py", line 352, in predict
    _server_response = self.process_text(cas.sofa_string, cas.document_language)
  File "/inception_ahd_recommender/ariadne/contrib/external_uima_classifier.py", line 330, in process_text
    self.get_pipeline().analyse_text_to_cas(source=text, language=language)
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 100, in new_function
    return original_function(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 457, in analyse_text_to_cas
    timeout=timeout,
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 100, in new_function
    return original_function(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 2569, in _analyse_text_xmi
    timeout=timeout,
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 1802, in __request_with_bytes_response
    self.__handle_error(raw_response)
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 2974, in __handle_error
    raise RequestException(error_msg)
requests.exceptions.RequestException: 404 Server Error: 'Not Found' for url: 'https://averbis-dev.test.med.tu-dresden.de/health-discovery/rest/experimental/textanalysis/projects/GeMTeX/pipelines/deid/analyzeTextToCas?language=x-unspecified'.

Reproduzierbarkeit

  1. AHD starten
  2. Recommender starten
  3. Test der Recommendation Generierung in Inception funktioniert fehlerfrei
  4. AHD neustarten
  5. Test der Recommendation Generierung in Inception wirft Fehlermeldung auf

Recommender Version : ghcr.io/medizininformatik-initiative/gemtex/inception-ahd-recommender:1.1.2

Vorschlag

Wäre es möglich, den Recommender-Container bei einem Fehler abstürzen zu lassen, sodass er durch eine Restart-Policy automatisch neu gestartet werden kann?

@reckart
Copy link
Collaborator

reckart commented Nov 6, 2024

Wird in Schritt 4 ggf. ein neues Login Token erzeugt und das Token welches vom Recommender Proxy verwendet wird geht dann nicht mehr?

@hunnguye
Copy link
Contributor Author

hunnguye commented Nov 6, 2024

Das ist auszuschließen.
In einem Schritt 6 wird der recommender einfach nur heruntergefahren und wieder hochgefahren (docker compose down / up). Dadurch "fängt" sich der Recommender wieder, und Annotationsempfehlungen werden ausgespielt. Die Einstellungen bezüglich Token o.ä bleiben gleich.

@reckart
Copy link
Collaborator

reckart commented Nov 6, 2024

Der Proxy Container müsste ja stateless sein (sprich er hält keine Verbindung zur AHD permanent offen). Was könnte da schief gehen, dass er plötzlich von 404 von der URL bekommt? Die URL von der AHD sollte sich ja nicht ändern nur weil deren Container neu gestartet wird, oder?

@fmatthies
Copy link
Collaborator

fmatthies commented Nov 19, 2024

Ich weiß nicht, ob das hilft, aber die Idee wäre, wenn der implementierte AHDClassifier unerfolgreich auf die AHD zugreift, die RequestException abzufangen und dann das pyhton-Programm zu terminieren (1d61de4). Dann sollte doch der docker-Container automatisch neugestartet werden können?

@fmatthies fmatthies added enhancement New feature or request bug Something isn't working labels Nov 19, 2024
@hunnguye
Copy link
Contributor Author

@reckart
Tja ... die Beobachtung ist, dass, er sich dann aber auch überhaupt nicht mehr verbinden kann, selbst nach längerer Wartezeit nicht.

@fmatthies
Ich würde das mal ausprobieren und dann Rückmeldung geben, ob das auch für den oben beschriebenen Anwendungsfall funktioniert.
Nächste Woche wäre ich im Urlaub und es liegen noch einige andere Sachen auf dem Tisch, ich versuche es vor Weihnachten. Vielen Dank für den tollen und schnellen Support.

@fmatthies fmatthies linked a pull request Dec 11, 2024 that will close this issue
@fmatthies
Copy link
Collaborator

@hunnguye, bitte einmal probieren, ob das mit der Version 1.2.2 besser funktioniert; ansonsten müssen wir den Issue nochmal öffnen:
ghcr.io/medizininformatik-initiative/gemtex/inception-ahd-recommender:1.2.2

@hunnguye
Copy link
Contributor Author

hunnguye commented Dec 12, 2024

Hey @fmatthies,
Der Docker Container lässt sich aktuell nicht starten.
Die Version 1.2.2 wirft folgenden Fehler in den logs:

with project: GeMTeX and
pipeline: deid and
with ResponseConsumer:
 'ariadne.contrib.external_server_consumer.MappingConsumer::/mapping_files/deid_mapping_singlelayer.json'
INFO:root:Authentication with Token: d1cd96...
[2024-12-12 12:03:27 +0000] [18] [ERROR] Exception in worker process
Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/gunicorn/arbiter.py", line 608, in spawn_worker
    worker.init_process()
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py", line 135, in init_process
    self.load_wsgi()
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/base.py", line 147, in load_wsgi
    self.wsgi = self.app.wsgi()
  File "/usr/local/lib/python3.7/site-packages/gunicorn/app/base.py", line 66, in wsgi
    self.callable = self.load()
  File "/usr/local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 57, in load
    return self.load_wsgiapp()
  File "/usr/local/lib/python3.7/site-packages/gunicorn/app/wsgiapp.py", line 47, in load_wsgiapp
    return util.import_app(self.app_uri)
  File "/usr/local/lib/python3.7/site-packages/gunicorn/util.py", line 370, in import_app
    mod = importlib.import_module(module)
  File "/usr/local/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 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/inception_ahd_recommender/main.py", line 82, in <module>
    _server_handle, _classifier(config=_config, model_directory=_model_folder)
  File "/inception_ahd_recommender/ariadne/contrib/external_uima_classifier.py", line 273, in __init__
    super(AriadneClassifier, self).__init__(config, self.__class__.__name__)
  File "/inception_ahd_recommender/ariadne/contrib/external_uima_classifier.py", line 101, in __init__
    self._initialize_configuration(config)
  File "/inception_ahd_recommender/ariadne/contrib/external_uima_classifier.py", line 124, in _initialize_configuration
    self._config = _as_named_tuple(config)
  File "/inception_ahd_recommender/ariadne/contrib/external_uima_classifier.py", line 90, in _as_named_tuple
    processor=lower_dict.get("processor"),
TypeError: __new__() missing 1 required positional argument: 'docker_mode'

Ein PR wurde erstellt, um das zu fixen (#42)

Allerdings behebt der fix in Version 1.2.2 noch nicht das eigentliche Problem.
Ich erhalte komischerweise folgende Fehlermeldung:

[2024-12-12 13:59:11 +0000] [9] [INFO] Got prediction request for [deid_recommender]
INFO:ariadne.server:Got prediction request for [deid_recommender]
INFO:root:Docker mode True shutdown
[2024-12-12 13:59:11 +0000] [9] [ERROR] Error handling request /deid_recommender/predict
Traceback (most recent call last):
  File "/inception_ahd_recommender/ariadne/contrib/external_uima_classifier.py", line 335, in process_text
    self.get_pipeline().analyse_text_to_cas(source=text, language=language)
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 100, in new_function
    return original_function(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 457, in analyse_text_to_cas
    timeout=timeout,
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 100, in new_function
    return original_function(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 2569, in _analyse_text_xmi
    timeout=timeout,
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 1802, in __request_with_bytes_response
    self.__handle_error(raw_response)
  File "/usr/local/lib/python3.7/site-packages/averbis/core/_rest_client.py", line 2974, in __handle_error
    raise RequestException(error_msg)
requests.exceptions.RequestException: 404 Server Error: 'Not Found' for url: 'https://averbis-dev.test.med.tu-dresden.de/health-discovery/rest/experimental/textanalysis/projects/GeMTeX/pipelines/deid/analyzeTextToCas?language=x-unspecified'.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/sync.py", line 134, in handle
    self.handle_request(listener, req, client, addr)
  File "/usr/local/lib/python3.7/site-packages/gunicorn/workers/sync.py", line 177, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2552, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 2529, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1823, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/local/lib/python3.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
  File "/inception_ahd_recommender/ariadne/server.py", line 70, in _predict
    req.user_id,
  File "/inception_ahd_recommender/ariadne/contrib/external_uima_classifier.py", line 365, in predict
    _server_response = self.process_text(cas.sofa_string, cas.document_language)
  File "/inception_ahd_recommender/ariadne/contrib/external_uima_classifier.py", line 341, in process_text
    sys.exit(log_str)
SystemExit: AHD not accessible: '404 Server Error: 'Not Found' for url: 'https://averbis-dev.test.med.tu-dresden.de/health-discovery/rest/experimental/textanalysis/projects/GeMTeX/pipelines/deid/analyzeTextToCas?language=x-unspecified'.'

Und der Container bricht nicht(!) ab.
Ich habe ein logging mit eingebastelt, um zu schauen, ob auch der docker_mode richtig gesetzt ist (

if self.get_configuration().docker_mode:
) und das ist er.

Bei genauerer Überlegung ist der Neustart des Containers an dieser Stelle auch nicht ganz optimal, weil der Neustart erst getriggert wird, wenn eine reocmmendation versucht wird zu erzeugen, daher vom ersten Annotator, welcher nach einem Neustart der AHD Instanz wieder arbeiten möchte.

Evtl. liegt hier auch die Bewältigung dieser Herausforderung beim AHD Client?

@fmatthies fmatthies reopened this Dec 13, 2024
@fmatthies
Copy link
Collaborator

Ja, mein Gedankengang war auch etwas lückenhaft: man muss Docker dann natürlich noch sagen, den Container neu zu starten. Ich würde das aber nun vielleicht doch anders handhaben und es aus dem python-Programm rausnehmen und in einen docker healthcheck auslagern:

services:
  ahd-deid-recommender:
    [...]
    healthcheck:
      test: SOME TEST THAT PERIODICALLY PINGS THE AHD (curl?)
      interval: 10s
      retries: 1
      start_period: 5s
      timeout: 10s 

Werde mir das mal die nächste Woche anschauen.

@hunnguye
Copy link
Contributor Author

hunnguye commented Dec 16, 2024

Hey @fmatthies

Vielen Dank dir für deine Zeit!
Ich habe eine gute und eine schlechte Nachricht - das Problem hat sich von alleine erledigt.

TLDR:
Nach dem Neustart der AHD muss noch kurz (30s) gewartet werden, bevor die API wieder erreichbar ist.

Long Version:
Ich fand die Situation auch ziemlich merkwürdig und habe versucht, den Code genauer nachzuverfolgen. Dabei habe ich mir auch den AHD-Client genauer angesehen (https://github.com/averbis/averbis-python-api/blob/main/averbis/core/_rest_client.py), da ich vermutete, dass möglicherweise eine Session aufgebaut wird, die nicht durch den Neustart des Servers beendet wird. Dies war jedoch nicht der Fall.

Anschließend habe ich versucht, den Fehler erneut zu reproduzieren – allerdings ohne Erfolg.
Interessant ist, dass das Problem ursprünglich von einem Annotator gemeldet wurde, der berichtete, dass der Recommender nicht funktioniert und ich diesen extra neu starten musste. Ich bin mir auch sicher, dass ich bei meinen ersten Reproduktionsversuchen nach dem Neustart des AHD-Services eine längere Wartezeit eingehalten habe und der Fehler trotzdem weiterhin auftrat.

Es scheint, dass entweder in der Zwischenzeit etwas geändert wurde oder der Annotator den Fehler genau in der kurzen Zeitspanne bemerkte, in der der AHD-Service neu gestartet wurde. Ich habe dann das Problem live untersucht und offenbar genau in dem Zeitraum getestet, in dem der AHD-Service noch nicht vollständig verfügbar war. Durch den anschließenden Neustart des Recommenders schien das Problem vermeintlich behoben zu sein, da zu diesem Zeitpunkt bereits genügend Zeit verstrichen war und wurde fälschlicherweise als Workaround interpretiert.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working enhancement New feature or request
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants