code-loader 1.0.208.dev5__tar.gz → 1.0.208.dev7__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 (37) hide show
  1. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/PKG-INFO +1 -1
  2. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/contract/responsedataclasses.py +0 -1
  3. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/inner_leap_binder/leapbinder.py +0 -1
  4. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/inner_leap_binder/leapbinder_decorators.py +51 -5
  5. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/leaploader.py +14 -6
  6. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/pyproject.toml +1 -1
  7. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/LICENSE +0 -0
  8. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/README.md +0 -0
  9. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/__init__.py +0 -0
  10. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/contract/__init__.py +0 -0
  11. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/contract/datasetclasses.py +0 -0
  12. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/contract/enums.py +0 -0
  13. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/contract/exceptions.py +0 -0
  14. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/contract/mapping.py +0 -0
  15. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/contract/sim_config.py +0 -0
  16. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/contract/visualizer_classes.py +0 -0
  17. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/default_losses.py +0 -0
  18. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/default_metrics.py +0 -0
  19. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/experiment_api/__init__.py +0 -0
  20. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/experiment_api/api.py +0 -0
  21. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/experiment_api/cli_config_utils.py +0 -0
  22. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/experiment_api/client.py +0 -0
  23. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/experiment_api/epoch.py +0 -0
  24. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/experiment_api/experiment.py +0 -0
  25. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/experiment_api/experiment_context.py +0 -0
  26. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/experiment_api/types.py +0 -0
  27. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/experiment_api/utils.py +0 -0
  28. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/experiment_api/workingspace_config_utils.py +0 -0
  29. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/inner_leap_binder/__init__.py +0 -0
  30. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/leaploaderbase.py +0 -0
  31. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/mixpanel_tracker.py +0 -0
  32. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/plot_functions/__init__.py +0 -0
  33. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/plot_functions/plot_functions.py +0 -0
  34. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/plot_functions/visualize.py +0 -0
  35. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/utils.py +0 -0
  36. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/visualizers/__init__.py +0 -0
  37. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev7}/code_loader/visualizers/default_visualizers.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: code-loader
3
- Version: 1.0.208.dev5
3
+ Version: 1.0.208.dev7
4
4
  Summary:
5
5
  Home-page: https://github.com/tensorleap/code-loader
6
6
  License: MIT
@@ -144,7 +144,6 @@ class LeapAnalysisConfiguration:
144
144
  class EngineFileContract:
145
145
  node_connections: Optional[List[NodeConnection]] = None
146
146
  leap_analysis_configuration: Optional[LeapAnalysisConfiguration] = None
147
- latent_space_connections: Optional[List[NodeConnection]] = None
148
147
 
149
148
 
150
149
  @dataclass
@@ -115,7 +115,6 @@ class LeapBinder:
115
115
  self._extend_with_default_losses()
116
116
 
117
117
  self.mapping_connections: List[NodeConnection] = []
118
- self.latent_space_connections: List[NodeConnection] = []
119
118
  self.integration_test_func: Optional[Callable[[str, PreprocessResponse], Any]] = None
120
119
 
121
120
  self.batch_size_to_validate: Optional[int] = None
@@ -1843,6 +1843,48 @@ def _check_custom_latent_space_width(result, ls_name, reduce, n_components, chan
1843
1843
  f"reduce=LatentSpaceReduction.RANDOM_PROJECTION."))
1844
1844
 
1845
1845
 
1846
+ _FLOAT16_MAX = float(np.finfo(np.float16).max)
1847
+
1848
+
1849
+ def _check_custom_latent_space_values(result: np.ndarray, ls_name: str, has_batch_axis: bool) -> None:
1850
+ """Reject what no sample could store and warn about values the engine handles per sample."""
1851
+ if isinstance(result, np.ma.MaskedArray):
1852
+ raise Exception(
1853
+ f"tensorleap_custom_latent_space validation failed: '{ls_name}' returned a numpy masked "
1854
+ f"array; the mask would be ignored. Return a plain ndarray, with np.nan for a sample "
1855
+ f"you cannot compute.")
1856
+ if result.dtype.kind not in 'biuf':
1857
+ raise Exception(
1858
+ f"tensorleap_custom_latent_space validation failed: '{ls_name}' returned dtype "
1859
+ f"{result.dtype}. Return a real-valued numeric array (bool, int or float), with np.nan "
1860
+ f"for a sample you cannot compute.")
1861
+ dims = result.shape[1:] if has_batch_axis else result.shape
1862
+ if int(np.prod(dims)) == 0:
1863
+ raise Exception(
1864
+ f"tensorleap_custom_latent_space validation failed: '{ls_name}' returned shape "
1865
+ f"{tuple(result.shape)}, which has no features per sample.")
1866
+ finite = np.isfinite(result)
1867
+ if not finite.all():
1868
+ store_general_warning(
1869
+ key=("tensorleap_custom_latent_space_nonfinite", ls_name),
1870
+ message=(
1871
+ f"Custom latent space '{ls_name}' returned NaN or inf. Those samples are left out of "
1872
+ f"this latent space; if they exceed 5% of the evaluated samples the latent space is "
1873
+ f"dropped."))
1874
+ peak = 0.0
1875
+ if result.size and result.dtype.kind == 'f':
1876
+ peak = float(np.max(np.abs(result), where=finite, initial=0.0))
1877
+ elif result.size and result.dtype.kind in 'iu':
1878
+ peak = float(max(abs(int(result.min())), abs(int(result.max()))))
1879
+ if peak > _FLOAT16_MAX:
1880
+ store_general_warning(
1881
+ key=("tensorleap_custom_latent_space_clipped", ls_name),
1882
+ message=(
1883
+ f"Custom latent space '{ls_name}' returned values beyond +-{_FLOAT16_MAX:.0f}. Latent "
1884
+ f"spaces are stored as float16, so they are clipped to that range; scale or normalize "
1885
+ f"them inside the function to keep their relative size."))
1886
+
1887
+
1846
1888
  def tensorleap_custom_latent_space(name: Optional[str] = None, use_ls_for_analysis: bool = False,
1847
1889
  reduce: Optional[LatentSpaceReduction] = None,
1848
1890
  n_components: int = 512, channel_axis: int = -1):
@@ -1864,6 +1906,7 @@ def tensorleap_custom_latent_space(name: Optional[str] = None, use_ls_for_analys
1864
1906
  assert isinstance(single_result, np.ndarray), \
1865
1907
  (f'tensorleap_custom_latent_space validation failed: '
1866
1908
  f'The return type should be a numpy array. Got {type(single_result)}.')
1909
+ _check_custom_latent_space_values(single_result, ls_name, has_batch_axis=False)
1867
1910
  if single_result.ndim > 1:
1868
1911
  flat_dim = int(np.prod(single_result.shape))
1869
1912
  store_general_warning(
@@ -1966,6 +2009,7 @@ def _decorate_model_latent_space(user_function, ls_name, use_ls_for_analysis, re
1966
2009
  f"tensorleap_custom_latent_space validation failed: '{user_function.__name__}' "
1967
2010
  f"returned shape {tuple(result.shape)}. A model-computed latent space returns "
1968
2011
  f"(batch, d), so the result needs a batch axis and at least one feature axis.")
2012
+ _check_custom_latent_space_values(result, ls_name, has_batch_axis=True)
1969
2013
  if leap_binder.batch_size_to_validate:
1970
2014
  assert result.shape[0] == leap_binder.batch_size_to_validate, (
1971
2015
  f"tensorleap_custom_latent_space validation failed: '{user_function.__name__}' "
@@ -2011,14 +2055,15 @@ def _decorate_model_latent_space(user_function, ls_name, use_ls_for_analysis, re
2011
2055
  ordered_connections = [kwargs[arg_name] for arg_name in arg_names if arg_name in kwargs]
2012
2056
  ordered_connections = list(args) + ordered_connections
2013
2057
 
2014
- leap_binder.latent_space_connections[:] = [
2015
- connection for connection in leap_binder.latent_space_connections
2016
- if connection.node.name != ls_name]
2058
+ leap_binder.mapping_connections[:] = [
2059
+ connection for connection in leap_binder.mapping_connections
2060
+ if not (connection.node.type is NodeMappingType.CustomLatentSpace
2061
+ and connection.node.name == ls_name)]
2017
2062
  _add_mapping_connection(ls_name, ordered_connections, arg_names, ls_name,
2018
- NodeMappingType.CustomLatentSpace,
2019
- target_list=leap_binder.latent_space_connections)
2063
+ NodeMappingType.CustomLatentSpace)
2020
2064
  return None
2021
2065
 
2066
+ @functools.wraps(user_function)
2022
2067
  def final_inner(*args, **kwargs):
2023
2068
  if os.environ.get(mapping_runtime_mode_env_var_mame):
2024
2069
  return mapping_inner(*args, **kwargs)
@@ -2052,6 +2097,7 @@ def tensorleap_instance_custom_latent_space(name: Optional[str] = None, use_ls_f
2052
2097
  assert isinstance(result, np.ndarray), \
2053
2098
  (f'tensorleap_instance_custom_latent_space validation failed: '
2054
2099
  f'The return type should be a numpy array. Got {type(result)}.')
2100
+ _check_custom_latent_space_values(result, ls_name, has_batch_axis=False)
2055
2101
  if result.ndim > 1:
2056
2102
  flat_dim = int(np.prod(result.shape))
2057
2103
  store_general_warning(
@@ -55,6 +55,8 @@ class LeapLoader(LeapLoaderBase):
55
55
  self._preprocess_result_cached = None
56
56
  self._synthetic_lookup: Dict[str, Tuple[PreprocessResponse, Any]] = {}
57
57
  self._synthetic_populator: Optional[Callable[[str], None]] = None
58
+ # Dataset-computed custom LS the engine dropped for this job; get_sample stops computing them.
59
+ self._skipped_custom_latent_spaces: FrozenSet[str] = frozenset()
58
60
 
59
61
  try:
60
62
  from code_loader.mixpanel_tracker import track_code_loader_loaded
@@ -394,8 +396,7 @@ class LeapLoader(LeapLoaderBase):
394
396
  print_log=print_log,
395
397
  engine_file_contract=EngineFileContract(
396
398
  global_leap_binder.mapping_connections,
397
- global_leap_binder.leap_analysis_configuration,
398
- global_leap_binder.latent_space_connections))
399
+ global_leap_binder.leap_analysis_configuration))
399
400
 
400
401
  def _check_integration_test_exists(self) -> DatasetTestResultPayload:
401
402
  test_result = DatasetTestResultPayload('integration_test')
@@ -455,9 +456,10 @@ class LeapLoader(LeapLoaderBase):
455
456
  )
456
457
  if global_leap_binder.setup_container.unlabeled_data_preprocess is not None:
457
458
  gt_bound_names = [
458
- connection.node.name for connection in global_leap_binder.latent_space_connections
459
- if any(node_input.type == NodeMappingType.GroundTruth
460
- for node_input in (connection.node_inputs or {}).values())
459
+ connection.node.name for connection in global_leap_binder.mapping_connections
460
+ if connection.node.type is NodeMappingType.CustomLatentSpace
461
+ and any(node_input.type == NodeMappingType.GroundTruth
462
+ for node_input in (connection.node_inputs or {}).values())
461
463
  ]
462
464
  if gt_bound_names:
463
465
  test_result.display[TestingSectionEnum.Warnings.name] = (
@@ -1209,6 +1211,7 @@ class LeapLoader(LeapLoaderBase):
1209
1211
  custom_latent_spaces = {
1210
1212
  name: self._to_grouped_list(handler.function(group_ids, preprocess_state))
1211
1213
  for name, handler in latent_handlers.items()
1214
+ if name not in self._skipped_custom_latent_spaces
1212
1215
  }
1213
1216
 
1214
1217
  return DatasetSample(inputs=inputs, gt=gt, metadata=metadata, metadata_is_none=metadata_is_none,
@@ -1432,7 +1435,8 @@ class LeapLoader(LeapLoaderBase):
1432
1435
  instance_id: Optional[int] = None) -> Optional[Dict[str, npt.NDArray[np.float32]]]:
1433
1436
  handlers = {handler_name: handler for handler_name, handler
1434
1437
  in global_leap_binder.setup_container.custom_latent_spaces.items()
1435
- if handler.computed_at != CustomLatentSpaceComputedAt.MODEL}
1438
+ if handler.computed_at != CustomLatentSpaceComputedAt.MODEL
1439
+ and handler_name not in self._skipped_custom_latent_spaces}
1436
1440
  if not handlers:
1437
1441
  return None
1438
1442
  if preprocess.is_grouped:
@@ -1459,6 +1463,10 @@ class LeapLoader(LeapLoaderBase):
1459
1463
  self.exec_script()
1460
1464
  return len(global_leap_binder.setup_container.custom_latent_spaces) > 0
1461
1465
 
1466
+ def set_skipped_custom_latent_spaces(self, names: Iterable[str]) -> None:
1467
+ """Stop computing these dataset-computed custom latent spaces in get_sample(s)."""
1468
+ self._skipped_custom_latent_spaces = frozenset(names)
1469
+
1462
1470
  @lru_cache()
1463
1471
  def get_custom_latent_space_names(self) -> Tuple[str, ...]:
1464
1472
  """Names of all registered custom latent spaces, in registration order.
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "code-loader"
3
- version = "1.0.208.dev5"
3
+ version = "1.0.208.dev7"
4
4
  description = ""
5
5
  authors = ["dorhar <doron.harnoy@tensorleap.ai>"]
6
6
  license = "MIT"