learning-loop-node 0.13.4__tar.gz → 0.13.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of learning-loop-node might be problematic. Click here for more details.

Files changed (102) hide show
  1. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/PKG-INFO +1 -1
  2. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/detector/detector_logic.py +11 -6
  3. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/detector/detector_node.py +13 -5
  4. learning_loop_node-0.13.5/learning_loop_node/detector/exceptions.py +7 -0
  5. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/pyproject.toml +1 -1
  6. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/README.md +0 -0
  7. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/__init__.py +0 -0
  8. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/annotation/__init__.py +0 -0
  9. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/annotation/annotator_logic.py +0 -0
  10. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/annotation/annotator_node.py +0 -0
  11. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/data_classes/__init__.py +0 -0
  12. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/data_classes/annotations.py +0 -0
  13. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/data_classes/detections.py +0 -0
  14. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/data_classes/general.py +0 -0
  15. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/data_classes/image_metadata.py +0 -0
  16. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/data_classes/socket_response.py +0 -0
  17. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/data_classes/training.py +0 -0
  18. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/data_exchanger.py +0 -0
  19. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/detector/__init__.py +0 -0
  20. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/detector/inbox_filter/__init__.py +0 -0
  21. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/detector/inbox_filter/cam_observation_history.py +0 -0
  22. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/detector/inbox_filter/relevance_filter.py +0 -0
  23. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/detector/outbox.py +0 -0
  24. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/detector/rest/__init__.py +0 -0
  25. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/detector/rest/about.py +0 -0
  26. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/detector/rest/backdoor_controls.py +0 -0
  27. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/detector/rest/detect.py +0 -0
  28. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/detector/rest/model_version_control.py +0 -0
  29. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/detector/rest/operation_mode.py +0 -0
  30. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/detector/rest/outbox_mode.py +0 -0
  31. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/detector/rest/upload.py +0 -0
  32. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/enums/__init__.py +0 -0
  33. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/enums/annotator.py +0 -0
  34. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/enums/detector.py +0 -0
  35. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/enums/general.py +0 -0
  36. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/enums/trainer.py +0 -0
  37. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/examples/novelty_score_updater.py +0 -0
  38. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/globals.py +0 -0
  39. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/helpers/__init__.py +0 -0
  40. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/helpers/environment_reader.py +0 -0
  41. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/helpers/gdrive_downloader.py +0 -0
  42. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/helpers/log_conf.py +0 -0
  43. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/helpers/misc.py +0 -0
  44. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/loop_communication.py +0 -0
  45. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/node.py +0 -0
  46. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/py.typed +0 -0
  47. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/rest.py +0 -0
  48. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/__init__.py +0 -0
  49. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/annotator/__init__.py +0 -0
  50. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/annotator/conftest.py +0 -0
  51. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/annotator/pytest.ini +0 -0
  52. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/annotator/test_annotator_node.py +0 -0
  53. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/detector/__init__.py +0 -0
  54. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/detector/conftest.py +0 -0
  55. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/detector/inbox_filter/__init__.py +0 -0
  56. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/detector/inbox_filter/test_observation.py +0 -0
  57. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/detector/inbox_filter/test_relevance_group.py +0 -0
  58. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/detector/inbox_filter/test_unexpected_observations_count.py +0 -0
  59. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/detector/pytest.ini +0 -0
  60. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/detector/test.jpg +0 -0
  61. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/detector/test_client_communication.py +0 -0
  62. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/detector/test_detector_node.py +0 -0
  63. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/detector/test_outbox.py +0 -0
  64. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/detector/test_relevance_filter.py +0 -0
  65. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/detector/testing_detector.py +0 -0
  66. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/general/__init__.py +0 -0
  67. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/general/conftest.py +0 -0
  68. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/general/pytest.ini +0 -0
  69. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/general/test_data/file_1.txt +0 -0
  70. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/general/test_data/file_2.txt +0 -0
  71. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/general/test_data/model.json +0 -0
  72. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/general/test_data_classes.py +0 -0
  73. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/general/test_downloader.py +0 -0
  74. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/general/test_learning_loop_node.py +0 -0
  75. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/test_helper.py +0 -0
  76. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/trainer/__init__.py +0 -0
  77. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/trainer/conftest.py +0 -0
  78. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/trainer/pytest.ini +0 -0
  79. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/trainer/state_helper.py +0 -0
  80. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/trainer/states/__init__.py +0 -0
  81. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/trainer/states/test_state_cleanup.py +0 -0
  82. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/trainer/states/test_state_detecting.py +0 -0
  83. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/trainer/states/test_state_download_train_model.py +0 -0
  84. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/trainer/states/test_state_prepare.py +0 -0
  85. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/trainer/states/test_state_sync_confusion_matrix.py +0 -0
  86. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/trainer/states/test_state_train.py +0 -0
  87. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/trainer/states/test_state_upload_detections.py +0 -0
  88. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/trainer/states/test_state_upload_model.py +0 -0
  89. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/trainer/test_errors.py +0 -0
  90. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/trainer/test_trainer_states.py +0 -0
  91. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/tests/trainer/testing_trainer_logic.py +0 -0
  92. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/trainer/__init__.py +0 -0
  93. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/trainer/downloader.py +0 -0
  94. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/trainer/exceptions.py +0 -0
  95. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/trainer/executor.py +0 -0
  96. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/trainer/io_helpers.py +0 -0
  97. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/trainer/rest/__init__.py +0 -0
  98. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/trainer/rest/backdoor_controls.py +0 -0
  99. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/trainer/test_executor.py +0 -0
  100. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/trainer/trainer_logic.py +0 -0
  101. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/trainer/trainer_logic_generic.py +0 -0
  102. {learning_loop_node-0.13.4 → learning_loop_node-0.13.5}/learning_loop_node/trainer/trainer_node.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: learning-loop-node
3
- Version: 0.13.4
3
+ Version: 0.13.5
4
4
  Summary: Python Library for Nodes which connect to the Zauberzeug Learning Loop
5
5
  Home-page: https://github.com/zauberzeug/learning_loop_node
6
6
  License: MIT
@@ -6,6 +6,7 @@ import numpy as np
6
6
 
7
7
  from ..data_classes import ImageMetadata, ModelInformation
8
8
  from ..globals import GLOBALS
9
+ from .exceptions import NodeNeedsRestartError
9
10
 
10
11
 
11
12
  class DetectorLogic():
@@ -14,6 +15,8 @@ class DetectorLogic():
14
15
  self.model_format: str = model_format
15
16
  self._model_info: Optional[ModelInformation] = None
16
17
 
18
+ self._remaining_init_attempts: int = 2
19
+
17
20
  async def soft_reload(self):
18
21
  self._model_info = None
19
22
 
@@ -27,20 +30,22 @@ class DetectorLogic():
27
30
  def is_initialized(self) -> bool:
28
31
  return self._model_info is not None
29
32
 
30
- def load_model(self):
33
+ def load_model_info_and_init_model(self):
31
34
  logging.info('Loading model from %s', GLOBALS.data_folder)
32
- model_info = ModelInformation.load_from_disk(f'{GLOBALS.data_folder}/model')
33
- if model_info is None:
35
+ self._model_info = ModelInformation.load_from_disk(f'{GLOBALS.data_folder}/model')
36
+ if self._model_info is None:
34
37
  logging.error('No model found')
35
38
  self._model_info = None
36
- raise Exception('No model found')
37
39
  try:
38
- self._model_info = model_info
39
40
  self.init()
40
41
  logging.info('Successfully loaded model %s', self._model_info)
42
+ self._remaining_init_attempts = 2
41
43
  except Exception:
44
+ self._remaining_init_attempts -= 1
42
45
  self._model_info = None
43
- logging.error('Could not init model %s', model_info)
46
+ logging.error('Could not init model %s. Retries left: %s', self._model_info, self._remaining_init_attempts)
47
+ if self._remaining_init_attempts == 0:
48
+ raise NodeNeedsRestartError('Could not init model') from None
44
49
  raise
45
50
 
46
51
  @abstractmethod
@@ -3,6 +3,7 @@ import contextlib
3
3
  import os
4
4
  import shutil
5
5
  import subprocess
6
+ import sys
6
7
  from dataclasses import asdict
7
8
  from datetime import datetime
8
9
  from threading import Thread
@@ -23,6 +24,7 @@ from ..globals import GLOBALS
23
24
  from ..helpers import environment_reader
24
25
  from ..node import Node
25
26
  from .detector_logic import DetectorLogic
27
+ from .exceptions import NodeNeedsRestartError
26
28
  from .inbox_filter.relevance_filter import RelevanceFilter
27
29
  from .outbox import Outbox
28
30
  from .rest import about as rest_about
@@ -170,13 +172,13 @@ class DetectorNode(Node):
170
172
 
171
173
  # simulate startup
172
174
  await self.detector_logic.soft_reload()
173
- self.detector_logic.load_model()
175
+ self.detector_logic.load_model_info_and_init_model()
174
176
  self.operation_mode = OperationMode.Idle
175
177
 
176
178
  async def on_startup(self) -> None:
177
179
  try:
178
180
  self.outbox.ensure_continuous_upload()
179
- self.detector_logic.load_model()
181
+ self.detector_logic.load_model_info_and_init_model()
180
182
  except Exception:
181
183
  self.log.exception("error during 'startup'")
182
184
  self.operation_mode = OperationMode.Idle
@@ -321,9 +323,12 @@ class DetectorNode(Node):
321
323
  self.log.debug('not checking for updates; no target model selected')
322
324
  return
323
325
 
324
- current_version = self.detector_logic._model_info.version if self.detector_logic._model_info is not None else None # pylint: disable=protected-access
326
+ if self.detector_logic.is_initialized:
327
+ current_version = self.detector_logic.model_info.version
328
+ else:
329
+ current_version = None
325
330
 
326
- if not self.detector_logic.is_initialized or self.target_model.version != current_version:
331
+ if current_version != self.target_model.version:
327
332
  self.log.info('Current model "%s" needs to be updated to %s',
328
333
  current_version or "-", self.target_model.version)
329
334
 
@@ -349,7 +354,10 @@ class DetectorNode(Node):
349
354
  self.log.info('Updated symlink for model to %s', os.readlink(model_symlink))
350
355
 
351
356
  try:
352
- self.detector_logic.load_model()
357
+ self.detector_logic.load_model_info_and_init_model()
358
+ except NodeNeedsRestartError:
359
+ self.log.error('Node needs restart')
360
+ sys.exit(0)
353
361
  except Exception:
354
362
  self.log.exception('Could not load model, will retry download on next check')
355
363
  shutil.rmtree(target_model_folder, ignore_errors=True)
@@ -0,0 +1,7 @@
1
+
2
+
3
+ class NodeNeedsRestartError(Exception):
4
+ '''
5
+ NodeNeedsRestartError is raised when the node needs to be restarted.
6
+ This is e.g. the case when the GPU is not available anymore.
7
+ '''
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "learning_loop_node"
3
- version = "v0.13.4"
3
+ version = "v0.13.5"
4
4
  description = "Python Library for Nodes which connect to the Zauberzeug Learning Loop"
5
5
  authors = ["Zauberzeug GmbH <info@zauberzeug.com>"]
6
6
  license = "MIT"