learning-loop-node 0.18.4__tar.gz → 0.18.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.
Files changed (66) hide show
  1. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/PKG-INFO +3 -3
  2. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/detector/detector_logic.py +3 -2
  3. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/helpers/misc.py +16 -5
  4. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/trainer/io_helpers.py +1 -1
  5. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node.egg-info/PKG-INFO +3 -3
  6. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node.egg-info/requires.txt +1 -1
  7. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/pyproject.toml +3 -3
  8. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/README.md +0 -0
  9. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/__init__.py +0 -0
  10. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/annotation/__init__.py +0 -0
  11. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/annotation/annotator_logic.py +0 -0
  12. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/annotation/annotator_node.py +0 -0
  13. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/data_classes/__init__.py +0 -0
  14. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/data_classes/annotation_data.py +0 -0
  15. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/data_classes/annotations.py +0 -0
  16. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/data_classes/detections.py +0 -0
  17. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/data_classes/general.py +0 -0
  18. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/data_classes/image_metadata.py +0 -0
  19. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/data_classes/socket_response.py +0 -0
  20. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/data_classes/training.py +0 -0
  21. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/data_exchanger.py +0 -0
  22. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/detector/__init__.py +0 -0
  23. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/detector/detector_node.py +0 -0
  24. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/detector/exceptions.py +0 -0
  25. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/detector/inbox_filter/__init__.py +0 -0
  26. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/detector/inbox_filter/cam_observation_history.py +0 -0
  27. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/detector/inbox_filter/relevance_filter.py +0 -0
  28. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/detector/outbox.py +0 -0
  29. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/detector/rest/__init__.py +0 -0
  30. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/detector/rest/about.py +0 -0
  31. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/detector/rest/backdoor_controls.py +0 -0
  32. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/detector/rest/detect.py +0 -0
  33. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/detector/rest/model_version_control.py +0 -0
  34. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/detector/rest/operation_mode.py +0 -0
  35. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/detector/rest/outbox_mode.py +0 -0
  36. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/detector/rest/upload.py +0 -0
  37. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/enums/__init__.py +0 -0
  38. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/enums/annotator.py +0 -0
  39. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/enums/detector.py +0 -0
  40. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/enums/general.py +0 -0
  41. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/enums/trainer.py +0 -0
  42. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/globals.py +0 -0
  43. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/helpers/__init__.py +0 -0
  44. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/helpers/background_tasks.py +0 -0
  45. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/helpers/environment_reader.py +0 -0
  46. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/helpers/gdrive_downloader.py +0 -0
  47. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/helpers/log_conf.py +0 -0
  48. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/helpers/run.py +0 -0
  49. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/loop_communication.py +0 -0
  50. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/node.py +0 -0
  51. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/py.typed +0 -0
  52. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/rest.py +0 -0
  53. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/trainer/__init__.py +0 -0
  54. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/trainer/downloader.py +0 -0
  55. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/trainer/exceptions.py +0 -0
  56. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/trainer/executor.py +0 -0
  57. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/trainer/rest/__init__.py +0 -0
  58. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/trainer/rest/backdoor_controls.py +0 -0
  59. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/trainer/test_executor.py +0 -0
  60. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/trainer/trainer_logic.py +0 -0
  61. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/trainer/trainer_logic_generic.py +0 -0
  62. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node/trainer/trainer_node.py +0 -0
  63. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node.egg-info/SOURCES.txt +0 -0
  64. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node.egg-info/dependency_links.txt +0 -0
  65. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/learning_loop_node.egg-info/top_level.txt +0 -0
  66. {learning_loop_node-0.18.4 → learning_loop_node-0.18.5}/setup.cfg +0 -0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: learning_loop_node
3
- Version: 0.18.4
3
+ Version: 0.18.5
4
4
  Summary: Python Library for Nodes which connect to the Zauberzeug Learning Loop
5
5
  Author-email: Zauberzeug GmbH <info@zauberzeug.com>
6
6
  License: MIT
7
7
  Project-URL: Repository, https://github.com/zauberzeug/learning_loop_node
8
- Requires-Python: >=3.9
8
+ Requires-Python: >=3.10
9
9
  Description-Content-Type: text/markdown
10
10
  Requires-Dist: fastapi<1.0,>=0.128
11
11
  Requires-Dist: uvicorn[standard]<0.23.0,>=0.22.0
@@ -17,7 +17,7 @@ Requires-Dist: icecream<3.0.0,>=2.1.0
17
17
  Requires-Dist: aiofiles<0.8.0,>=0.7.0
18
18
  Requires-Dist: async_generator<2.0.0,>=1.10
19
19
  Requires-Dist: pytest-watch<5.0.0,>=4.2.0
20
- Requires-Dist: python-multipart<0.0.19,>=0.0.18
20
+ Requires-Dist: python-multipart>=0.0.22
21
21
  Requires-Dist: psutil<6.0.0,>=5.8.0
22
22
  Requires-Dist: numpy<3.0,>=2.0
23
23
  Requires-Dist: Pillow<12.0.0,>=11.0.0
@@ -38,10 +38,11 @@ class DetectorLogic():
38
38
  self.init()
39
39
  logging.info('Successfully loaded model %s', self.model_info)
40
40
  self._remaining_init_attempts = 2
41
- except Exception:
41
+ except Exception as e:
42
42
  self._remaining_init_attempts -= 1
43
+ logging.error('Could not init model %s. Retries left: %s. Error: %s',
44
+ self.model_info, self._remaining_init_attempts, e)
43
45
  self.model_info = None
44
- logging.error('Could not init model %s. Retries left: %s', self.model_info, self._remaining_init_attempts)
45
46
  if self._remaining_init_attempts == 0:
46
47
  raise NodeNeedsRestartError('Could not init model') from None
47
48
  raise
@@ -60,11 +60,22 @@ def _handle_task_result(task: asyncio.Task,
60
60
 
61
61
 
62
62
  def get_free_memory_mb() -> float: # NOTE used by yolov5
63
- pynvml.nvmlInit()
64
- h = pynvml.nvmlDeviceGetHandleByIndex(0)
65
- info = pynvml.nvmlDeviceGetMemoryInfo(h)
66
- free = float(info.free) / 1024 / 1024
67
- return free
63
+ """
64
+ Get the free memory available to the graphics card (index 0) in MB.
65
+ If VRAM information is unavailable, for example if the system shares ram
66
+ between CPU and GPU, the available RAM is returned instead.
67
+ """
68
+ try:
69
+ pynvml.nvmlInit()
70
+
71
+ h = pynvml.nvmlDeviceGetHandleByIndex(0)
72
+ info = pynvml.nvmlDeviceGetMemoryInfo(h)
73
+ free_mb = float(info.free) / 1024 / 1024
74
+ except pynvml.nvml.NVMLError:
75
+ logger = logging.getLogger(__name__)
76
+ logger.warning('Could not get GPU memory info, returning free CPU memory instead')
77
+ free_mb = float(os.sysconf('SC_PAGE_SIZE') * os.sysconf('SC_AVPHYS_PAGES')) / 1024 / 1024
78
+ return free_mb
68
79
 
69
80
 
70
81
  async def is_valid_image(filename: str, check_jpeg: bool) -> bool:
@@ -173,7 +173,7 @@ class ActiveTrainingIO:
173
173
  response = await self.loop_communicator.post(
174
174
  f'/{context.organization}/projects/{context.project}/detections', json=detections_json)
175
175
  if response.status_code != 200:
176
- msg = f'could not upload detections. {str(response)}'
176
+ msg = f'could not upload detections. HTTP {response.status_code}: {response.text}'
177
177
  logging.error(msg)
178
178
  raise Exception(msg)
179
179
 
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: learning_loop_node
3
- Version: 0.18.4
3
+ Version: 0.18.5
4
4
  Summary: Python Library for Nodes which connect to the Zauberzeug Learning Loop
5
5
  Author-email: Zauberzeug GmbH <info@zauberzeug.com>
6
6
  License: MIT
7
7
  Project-URL: Repository, https://github.com/zauberzeug/learning_loop_node
8
- Requires-Python: >=3.9
8
+ Requires-Python: >=3.10
9
9
  Description-Content-Type: text/markdown
10
10
  Requires-Dist: fastapi<1.0,>=0.128
11
11
  Requires-Dist: uvicorn[standard]<0.23.0,>=0.22.0
@@ -17,7 +17,7 @@ Requires-Dist: icecream<3.0.0,>=2.1.0
17
17
  Requires-Dist: aiofiles<0.8.0,>=0.7.0
18
18
  Requires-Dist: async_generator<2.0.0,>=1.10
19
19
  Requires-Dist: pytest-watch<5.0.0,>=4.2.0
20
- Requires-Dist: python-multipart<0.0.19,>=0.0.18
20
+ Requires-Dist: python-multipart>=0.0.22
21
21
  Requires-Dist: psutil<6.0.0,>=5.8.0
22
22
  Requires-Dist: numpy<3.0,>=2.0
23
23
  Requires-Dist: Pillow<12.0.0,>=11.0.0
@@ -8,7 +8,7 @@ icecream<3.0.0,>=2.1.0
8
8
  aiofiles<0.8.0,>=0.7.0
9
9
  async_generator<2.0.0,>=1.10
10
10
  pytest-watch<5.0.0,>=4.2.0
11
- python-multipart<0.0.19,>=0.0.18
11
+ python-multipart>=0.0.22
12
12
  psutil<6.0.0,>=5.8.0
13
13
  numpy<3.0,>=2.0
14
14
  Pillow<12.0.0,>=11.0.0
@@ -1,11 +1,11 @@
1
1
  [project]
2
2
  name = "learning_loop_node"
3
- version = "0.18.4"
3
+ version = "0.18.5"
4
4
  description = "Python Library for Nodes which connect to the Zauberzeug Learning Loop"
5
5
  authors = [{ name = "Zauberzeug GmbH", email = "info@zauberzeug.com" }]
6
6
  license = { text = "MIT" }
7
7
  readme = "README.md"
8
- requires-python = ">=3.9"
8
+ requires-python = ">=3.10"
9
9
  dependencies = [
10
10
  "fastapi>=0.128,<1.0",
11
11
  "uvicorn[standard]>=0.22.0,<0.23.0",
@@ -17,7 +17,7 @@ dependencies = [
17
17
  "aiofiles>=0.7.0,<0.8.0",
18
18
  "async_generator>=1.10,<2.0.0",
19
19
  "pytest-watch>=4.2.0,<5.0.0",
20
- "python-multipart>=0.0.18,<0.0.19",
20
+ "python-multipart>=0.0.22",
21
21
  "psutil>=5.8.0,<6.0.0",
22
22
  "numpy>=2.0,<3.0",
23
23
  "Pillow>=11.0.0,<12.0.0",