learning-loop-node 0.10.14__tar.gz → 0.10.15__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 (96) hide show
  1. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/PKG-INFO +1 -1
  2. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/loop_communication.py +7 -4
  3. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/node.py +11 -3
  4. learning_loop_node-0.10.15/learning_loop_node/trainer/exceptions.py +12 -0
  5. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/trainer/trainer_logic_generic.py +4 -1
  6. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/pyproject.toml +1 -1
  7. learning_loop_node-0.10.14/learning_loop_node/trainer/exceptions.py +0 -2
  8. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/README.md +0 -0
  9. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/__init__.py +0 -0
  10. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/annotation/__init__.py +0 -0
  11. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/annotation/annotator_logic.py +0 -0
  12. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/annotation/annotator_node.py +0 -0
  13. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/data_classes/__init__.py +0 -0
  14. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/data_classes/annotations.py +0 -0
  15. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/data_classes/detections.py +0 -0
  16. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/data_classes/general.py +0 -0
  17. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/data_classes/socket_response.py +0 -0
  18. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/data_classes/training.py +0 -0
  19. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/data_exchanger.py +0 -0
  20. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/detector/__init__.py +0 -0
  21. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/detector/detector_logic.py +0 -0
  22. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/detector/detector_node.py +0 -0
  23. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/detector/inbox_filter/__init__.py +0 -0
  24. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/detector/inbox_filter/cam_observation_history.py +0 -0
  25. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/detector/inbox_filter/relevance_filter.py +0 -0
  26. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/detector/outbox.py +0 -0
  27. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/detector/rest/__init__.py +0 -0
  28. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/detector/rest/about.py +0 -0
  29. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/detector/rest/backdoor_controls.py +0 -0
  30. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/detector/rest/detect.py +0 -0
  31. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/detector/rest/model_version_control.py +0 -0
  32. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/detector/rest/operation_mode.py +0 -0
  33. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/detector/rest/outbox_mode.py +0 -0
  34. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/detector/rest/upload.py +0 -0
  35. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/examples/novelty_score_updater.py +0 -0
  36. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/globals.py +0 -0
  37. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/helpers/__init__.py +0 -0
  38. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/helpers/environment_reader.py +0 -0
  39. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/helpers/gdrive_downloader.py +0 -0
  40. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/helpers/log_conf.py +0 -0
  41. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/helpers/misc.py +0 -0
  42. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/py.typed +0 -0
  43. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/rest.py +0 -0
  44. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/__init__.py +0 -0
  45. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/annotator/__init__.py +0 -0
  46. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/annotator/conftest.py +0 -0
  47. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/annotator/pytest.ini +0 -0
  48. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/annotator/test_annotator_node.py +0 -0
  49. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/detector/__init__.py +0 -0
  50. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/detector/conftest.py +0 -0
  51. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/detector/inbox_filter/__init__.py +0 -0
  52. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/detector/inbox_filter/test_observation.py +0 -0
  53. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/detector/inbox_filter/test_relevance_group.py +0 -0
  54. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/detector/inbox_filter/test_unexpected_observations_count.py +0 -0
  55. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/detector/pytest.ini +0 -0
  56. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/detector/test.jpg +0 -0
  57. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/detector/test_client_communication.py +0 -0
  58. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/detector/test_detector_node.py +0 -0
  59. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/detector/test_outbox.py +0 -0
  60. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/detector/test_relevance_filter.py +0 -0
  61. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/detector/testing_detector.py +0 -0
  62. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/general/__init__.py +0 -0
  63. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/general/conftest.py +0 -0
  64. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/general/pytest.ini +0 -0
  65. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/general/test_data/file_1.txt +0 -0
  66. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/general/test_data/file_2.txt +0 -0
  67. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/general/test_data/model.json +0 -0
  68. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/general/test_data_classes.py +0 -0
  69. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/general/test_downloader.py +0 -0
  70. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/general/test_learning_loop_node.py +0 -0
  71. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/test_helper.py +0 -0
  72. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/trainer/__init__.py +0 -0
  73. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/trainer/conftest.py +0 -0
  74. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/trainer/pytest.ini +0 -0
  75. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/trainer/state_helper.py +0 -0
  76. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/trainer/states/__init__.py +0 -0
  77. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/trainer/states/test_state_cleanup.py +0 -0
  78. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/trainer/states/test_state_detecting.py +0 -0
  79. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/trainer/states/test_state_download_train_model.py +0 -0
  80. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/trainer/states/test_state_prepare.py +0 -0
  81. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/trainer/states/test_state_sync_confusion_matrix.py +0 -0
  82. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/trainer/states/test_state_train.py +0 -0
  83. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/trainer/states/test_state_upload_detections.py +0 -0
  84. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/trainer/states/test_state_upload_model.py +0 -0
  85. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/trainer/test_errors.py +0 -0
  86. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/trainer/test_trainer_states.py +0 -0
  87. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/tests/trainer/testing_trainer_logic.py +0 -0
  88. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/trainer/__init__.py +0 -0
  89. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/trainer/downloader.py +0 -0
  90. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/trainer/executor.py +0 -0
  91. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/trainer/io_helpers.py +0 -0
  92. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/trainer/rest/__init__.py +0 -0
  93. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/trainer/rest/backdoor_controls.py +0 -0
  94. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/trainer/test_executor.py +0 -0
  95. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/learning_loop_node/trainer/trainer_logic.py +0 -0
  96. {learning_loop_node-0.10.14 → learning_loop_node-0.10.15}/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.10.14
3
+ Version: 0.10.15
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
@@ -1,5 +1,6 @@
1
1
  import asyncio
2
2
  import logging
3
+ import time
3
4
  from typing import Awaitable, Callable, List, Optional
4
5
 
5
6
  import httpx
@@ -33,7 +34,6 @@ class LoopCommunicator():
33
34
  base_url=self.base_url, timeout=Timeout(60.0), verify=self.ssl_cert_path)
34
35
  else:
35
36
  self.async_client = httpx.AsyncClient(base_url=self.base_url, timeout=Timeout(60.0))
36
- self.async_client.cookies.clear()
37
37
 
38
38
  logging.info(f'Loop interface initialized with base_url: {self.base_url} / user: {self.username}')
39
39
 
@@ -68,16 +68,19 @@ class LoopCommunicator():
68
68
  if self.async_client is not None and not self.async_client.is_closed:
69
69
  await self.async_client.aclose()
70
70
 
71
- async def backend_ready(self) -> bool:
71
+ async def backend_ready(self, timeout: Optional[int] = None) -> bool:
72
72
  """Wait until the backend is ready"""
73
+ start_time = time.time()
73
74
  while True:
74
75
  try:
75
76
  logging.info('Checking if backend is ready')
76
77
  response = await self.get('/status', requires_login=False)
77
78
  if response.status_code == 200:
78
79
  return True
79
- except Exception as e:
80
- logging.info(f'backend not ready: {e}')
80
+ except Exception:
81
+ logging.info('backend not ready yet.')
82
+ if timeout is not None and time.time() + 10 - start_time > timeout:
83
+ raise TimeoutError('Backend not ready within timeout')
81
84
  await asyncio.sleep(10)
82
85
 
83
86
  async def retry_on_401(self, func: Callable[..., Awaitable[httpx.Response]], *args, **kwargs) -> httpx.Response:
@@ -126,6 +126,8 @@ class Node(FastAPI):
126
126
  await self.on_repeat()
127
127
  except asyncio.CancelledError:
128
128
  return
129
+ except TimeoutError:
130
+ self.log.debug('Backend not ready within timeout, skipping repeat loop')
129
131
  except Exception:
130
132
  self.log.exception('error in repeat loop')
131
133
 
@@ -140,6 +142,7 @@ class Node(FastAPI):
140
142
  async def reconnect_to_loop(self):
141
143
  """Initialize the loop communicator, log in if needed and reconnect to the loop via socket.io."""
142
144
  self.init_loop_communicator()
145
+ await self.loop_communicator.backend_ready(timeout=5)
143
146
  if self.needs_login:
144
147
  await self.loop_communicator.ensure_login(relogin=True)
145
148
  try:
@@ -162,7 +165,8 @@ class Node(FastAPI):
162
165
  The current client is disconnected and deleted if it already exists."""
163
166
 
164
167
  self.log.debug('-------------- Connecting to loop via socket.io -------------------')
165
- self.log.debug('HTTP Cookies: %s\n', self.loop_communicator.get_cookies())
168
+ cookies = self.loop_communicator.get_cookies()
169
+ self.log.debug('HTTP Cookies: %s\n', cookies)
166
170
 
167
171
  if self._sio_client is not None:
168
172
  try:
@@ -185,8 +189,12 @@ class Node(FastAPI):
185
189
  ssl_context.verify_mode = ssl.CERT_REQUIRED
186
190
  connector = TCPConnector(ssl=ssl_context)
187
191
 
188
- self._sio_client = AsyncClient(request_timeout=20, http_session=aiohttp.ClientSession(
189
- cookies=self.loop_communicator.get_cookies(), connector=connector))
192
+ if self.needs_login:
193
+ self._sio_client = AsyncClient(request_timeout=20, http_session=aiohttp.ClientSession(
194
+ cookies=cookies, connector=connector))
195
+ else:
196
+ self._sio_client = AsyncClient(request_timeout=20, http_session=aiohttp.ClientSession(
197
+ connector=connector))
190
198
 
191
199
  # pylint: disable=protected-access
192
200
  self._sio_client._trigger_event = ensure_socket_response(self._sio_client._trigger_event)
@@ -0,0 +1,12 @@
1
+ class CriticalError(Exception):
2
+ '''
3
+ CriticalError is raised when the training cannot be continued.
4
+ In this case the trainer jumps to the TrainerState.ReadyForCleanup and tries to upload the latest model.
5
+ '''
6
+
7
+
8
+ class NodeNeedsRestartError(Exception):
9
+ '''
10
+ NodeNeedsRestartError is raised when the node needs to be restarted.
11
+ This is e.g. the case when the GPU is not available anymore.
12
+ '''
@@ -14,7 +14,7 @@ from ..data_classes import (Context, Errors, Hyperparameter, PretrainedModel, Tr
14
14
  TrainingOut, TrainingStateData)
15
15
  from ..helpers.misc import create_project_folder, delete_all_training_folders, generate_training, is_valid_uuid4
16
16
  from .downloader import TrainingsDownloader
17
- from .exceptions import CriticalError
17
+ from .exceptions import CriticalError, NodeNeedsRestartError
18
18
  from .io_helpers import ActiveTrainingIO, EnvironmentVars, LastTrainingIO
19
19
 
20
20
  if TYPE_CHECKING:
@@ -294,6 +294,9 @@ class TrainerLogicGeneric(ABC):
294
294
  logger.error('CriticalError in %s - Exception: %s', state_during, e)
295
295
  self.errors.set(error_key, str(e))
296
296
  self.training.training_state = TrainerState.ReadyForCleanup
297
+ except NodeNeedsRestartError:
298
+ logger.error('Node Restart Requested')
299
+ sys.exit(0)
297
300
  except Exception as e:
298
301
  self.errors.set(error_key, str(e))
299
302
  logger.exception('Error in %s - Exception: %s', state_during, e)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "learning_loop_node"
3
- version = "v0.10.14"
3
+ version = "v0.10.15"
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"
@@ -1,2 +0,0 @@
1
- class CriticalError(Exception):
2
- pass