code-loader 1.0.202.dev0__tar.gz → 1.0.202.dev1__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.202.dev0 → code_loader-1.0.202.dev1}/PKG-INFO +1 -1
  2. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/inner_leap_binder/leapbinder_decorators.py +14 -36
  3. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/pyproject.toml +1 -1
  4. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/LICENSE +0 -0
  5. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/README.md +0 -0
  6. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/__init__.py +0 -0
  7. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/contract/__init__.py +0 -0
  8. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/contract/datasetclasses.py +0 -0
  9. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/contract/enums.py +0 -0
  10. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/contract/exceptions.py +0 -0
  11. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/contract/mapping.py +0 -0
  12. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/contract/responsedataclasses.py +0 -0
  13. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/contract/sim_config.py +0 -0
  14. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/contract/visualizer_classes.py +0 -0
  15. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/default_losses.py +0 -0
  16. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/default_metrics.py +0 -0
  17. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/experiment_api/__init__.py +0 -0
  18. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/experiment_api/api.py +0 -0
  19. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/experiment_api/cli_config_utils.py +0 -0
  20. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/experiment_api/client.py +0 -0
  21. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/experiment_api/epoch.py +0 -0
  22. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/experiment_api/experiment.py +0 -0
  23. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/experiment_api/experiment_context.py +0 -0
  24. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/experiment_api/types.py +0 -0
  25. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/experiment_api/utils.py +0 -0
  26. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/experiment_api/workingspace_config_utils.py +0 -0
  27. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/inner_leap_binder/__init__.py +0 -0
  28. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/inner_leap_binder/leapbinder.py +0 -0
  29. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/leaploader.py +0 -0
  30. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/leaploaderbase.py +0 -0
  31. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/mixpanel_tracker.py +0 -0
  32. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/plot_functions/__init__.py +0 -0
  33. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/plot_functions/plot_functions.py +0 -0
  34. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/plot_functions/visualize.py +0 -0
  35. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/utils.py +0 -0
  36. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/visualizers/__init__.py +0 -0
  37. {code_loader-1.0.202.dev0 → code_loader-1.0.202.dev1}/code_loader/visualizers/default_visualizers.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-loader
3
- Version: 1.0.202.dev0
3
+ Version: 1.0.202.dev1
4
4
  Summary:
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -733,12 +733,22 @@ def tensorleap_load_model(prediction_types: Optional[List[PredictionTypeHandler]
733
733
  assert isinstance(input_dict, dict), \
734
734
  f'Expected input_dict to be a dict, got {type(input_dict)} instead.'
735
735
  seen: set = set()
736
- for i, (input_key, elem) in enumerate(input_dict.items()):
736
+ # A declared KV-cache is threaded by the platform, not wired from an input
737
+ # encoder, so those slots have no mapping node to assign — the loop feeds
738
+ # them real arrays even in mapping mode. Skip them, and count only the wired
739
+ # inputs so the remaining slot indices stay contiguous.
740
+ step_handler = leap_binder.setup_container.autoregressive_step
741
+ cache_tensors = (step_handler.cache_tensors if step_handler else None) or {}
742
+ slot = 0
743
+ for input_key, elem in input_dict.items():
744
+ if input_key in cache_tensors:
745
+ continue
737
746
  self._reject_reused_input_source(elem, seen)
738
747
  if isinstance(input_key, NodeMappingType):
739
748
  elem.node_mapping.type = input_key
740
749
  else:
741
- elem.node_mapping.type = _safe_get_item(i)
750
+ elem.node_mapping.type = _safe_get_item(slot)
751
+ slot += 1
742
752
 
743
753
  return ModelOutputPlaceholder()
744
754
 
@@ -1893,18 +1903,6 @@ class _MappingStatePlaceholder:
1893
1903
  self._unsupported()
1894
1904
 
1895
1905
 
1896
- def _shares_base(leaf, original):
1897
- """True when `leaf` is `original` or a view onto it (e.g. original[None])."""
1898
- if leaf is original:
1899
- return True
1900
- base = getattr(leaf, 'base', None)
1901
- while base is not None:
1902
- if base is original:
1903
- return True
1904
- base = getattr(base, 'base', None)
1905
- return False
1906
-
1907
-
1908
1906
  class _ModelLoopContext:
1909
1907
  def __init__(self, sample_id, preprocess_response, prediction_names, is_mapping,
1910
1908
  cache_tensors=None):
@@ -2016,29 +2014,9 @@ class _ModelLoopContext:
2016
2014
  # identity check rather than demanding the hook produce tensors it cannot see.
2017
2015
  if isinstance(fed, dict) and self.cache_tensors:
2018
2016
  fed = {key: value for key, value in fed.items() if key not in self.cache_tensors}
2017
+ fed_ids = {id(leaf) for leaf in _ndarray_leaves(fed)}
2019
2018
  hook_ids = {id(value) for value in self.fed_inputs.values()}
2020
- # A leaf may be the hook's array itself, or a VIEW of it: `arr[None]` adds the batch
2021
- # axis an ONNX model needs and shares its memory, so `.base` is the original. Allowing
2022
- # views keeps the guarantee that matters — no tensor may be COMPUTED between the hook
2023
- # and the model, since the platform would not see that work — while not forcing every
2024
- # integration to choose between the identity check and a model that expects a batch
2025
- # dimension. A genuinely new array has no base among the hook's tensors.
2026
- def _from_hook(leaf):
2027
- if id(leaf) in hook_ids:
2028
- return True
2029
- base = getattr(leaf, 'base', None)
2030
- while base is not None:
2031
- if id(base) in hook_ids:
2032
- return True
2033
- base = getattr(base, 'base', None)
2034
- return False
2035
-
2036
- fed_leaves = list(_ndarray_leaves(fed))
2037
- matched = {id(value) for value in self.fed_inputs.values()
2038
- if any(_from_hook(leaf) and (id(leaf) == id(value)
2039
- or _shares_base(leaf, value))
2040
- for leaf in fed_leaves)}
2041
- if not all(_from_hook(leaf) for leaf in fed_leaves) or matched != hook_ids:
2019
+ if fed_ids != hook_ids:
2042
2020
  extra = (' (the declared KV-cache inputs are exempt — those are threaded for you)'
2043
2021
  if self.cache_tensors else '')
2044
2022
  self._fail('the model must be fed exactly the tensors the last hook call returned — '
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "code-loader"
3
- version = "1.0.202.dev0"
3
+ version = "1.0.202.dev1"
4
4
  description = ""
5
5
  authors = ["dorhar <doron.harnoy@tensorleap.ai>"]
6
6
  license = "MIT"