code-loader 1.0.208.dev5__tar.gz → 1.0.208.dev6__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.dev6}/PKG-INFO +1 -1
  2. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/inner_leap_binder/leapbinder_decorators.py +45 -0
  3. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/leaploader.py +9 -1
  4. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/pyproject.toml +1 -1
  5. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/LICENSE +0 -0
  6. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/README.md +0 -0
  7. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/__init__.py +0 -0
  8. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/contract/__init__.py +0 -0
  9. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/contract/datasetclasses.py +0 -0
  10. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/contract/enums.py +0 -0
  11. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/contract/exceptions.py +0 -0
  12. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/contract/mapping.py +0 -0
  13. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/contract/responsedataclasses.py +0 -0
  14. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/contract/sim_config.py +0 -0
  15. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/contract/visualizer_classes.py +0 -0
  16. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/default_losses.py +0 -0
  17. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/default_metrics.py +0 -0
  18. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/experiment_api/__init__.py +0 -0
  19. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/experiment_api/api.py +0 -0
  20. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/experiment_api/cli_config_utils.py +0 -0
  21. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/experiment_api/client.py +0 -0
  22. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/experiment_api/epoch.py +0 -0
  23. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/experiment_api/experiment.py +0 -0
  24. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/experiment_api/experiment_context.py +0 -0
  25. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/experiment_api/types.py +0 -0
  26. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/experiment_api/utils.py +0 -0
  27. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/experiment_api/workingspace_config_utils.py +0 -0
  28. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/inner_leap_binder/__init__.py +0 -0
  29. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/inner_leap_binder/leapbinder.py +0 -0
  30. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/leaploaderbase.py +0 -0
  31. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/mixpanel_tracker.py +0 -0
  32. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/plot_functions/__init__.py +0 -0
  33. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/plot_functions/plot_functions.py +0 -0
  34. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/plot_functions/visualize.py +0 -0
  35. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/utils.py +0 -0
  36. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/code_loader/visualizers/__init__.py +0 -0
  37. {code_loader-1.0.208.dev5 → code_loader-1.0.208.dev6}/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.dev6
4
4
  Summary:
5
5
  Home-page: https://github.com/tensorleap/code-loader
6
6
  License: MIT
@@ -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__}' "
@@ -2052,6 +2096,7 @@ def tensorleap_instance_custom_latent_space(name: Optional[str] = None, use_ls_f
2052
2096
  assert isinstance(result, np.ndarray), \
2053
2097
  (f'tensorleap_instance_custom_latent_space validation failed: '
2054
2098
  f'The return type should be a numpy array. Got {type(result)}.')
2099
+ _check_custom_latent_space_values(result, ls_name, has_batch_axis=False)
2055
2100
  if result.ndim > 1:
2056
2101
  flat_dim = int(np.prod(result.shape))
2057
2102
  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
@@ -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.dev6"
4
4
  description = ""
5
5
  authors = ["dorhar <doron.harnoy@tensorleap.ai>"]
6
6
  license = "MIT"