leap-model-parser 0.1.249.dev0__tar.gz → 0.1.250.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 (25) hide show
  1. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/PKG-INFO +3 -2
  2. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/contract/graph.py +2 -1
  3. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/contract/importmodelresponse.py +1 -0
  4. leap_model_parser-0.1.250.dev1/leap_model_parser/torch_model_parser.py +42 -0
  5. leap_model_parser-0.1.250.dev1/leap_model_parser/torch_utils.py +65 -0
  6. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/pyproject.toml +3 -2
  7. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/LICENSE +0 -0
  8. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/README.md +0 -0
  9. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/__init__.py +0 -0
  10. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/contract/__init__.py +0 -0
  11. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/contract/nodedata.py +0 -0
  12. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/contract/ui_components.json +0 -0
  13. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/keras_json_model_import.py +0 -0
  14. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/leap_graph_editor.py +0 -0
  15. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/model_parser.py +0 -0
  16. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/utils/__init__.py +0 -0
  17. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/utils/layerpedia/__init__.py +0 -0
  18. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/utils/layerpedia/layerpedia.py +0 -0
  19. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/utils/tlinspection/__init__.py +0 -0
  20. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/utils/tlinspection/leapinspection.py +0 -0
  21. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/utils/uicomponents/__init__.py +0 -0
  22. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/utils/uicomponents/generatenodedata.py +0 -0
  23. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/utils/uicomponents/tensorflowinscpection.py +0 -0
  24. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/utils/uicomponents/ui_components.json +0 -0
  25. {leap_model_parser-0.1.249.dev0 → leap_model_parser-0.1.250.dev1}/leap_model_parser/utils/uicomponents/ui_components_config.yaml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: leap-model-parser
3
- Version: 0.1.249.dev0
3
+ Version: 0.1.250.dev1
4
4
  Summary:
5
5
  Home-page: https://github.com/tensorleap/leap-model-parser
6
6
  License: MIT
@@ -17,10 +17,11 @@ Requires-Dist: keras-data-format-converter (==0.1.24)
17
17
  Requires-Dist: leap-model-rebuilder (==0.1.7)
18
18
  Requires-Dist: numpy (>=1.22.3,<2.0.0)
19
19
  Requires-Dist: onnx (==1.13.0)
20
- Requires-Dist: onnx2kerastl (==0.0.191.dev0)
20
+ Requires-Dist: onnx2kerastl (==0.0.191)
21
21
  Requires-Dist: tensorflow (==2.12.0) ; platform_machine == "x86_64"
22
22
  Requires-Dist: tensorflow-io-gcs-filesystem (==0.34.0)
23
23
  Requires-Dist: tensorflow-macos (==2.12.0) ; platform_machine == "arm64"
24
+ Requires-Dist: torch (>=2.3.0,<2.4.0)
24
25
  Project-URL: Repository, https://github.com/tensorleap/leap-model-parser
25
26
  Description-Content-Type: text/markdown
26
27
 
@@ -63,4 +63,5 @@ class Node:
63
63
  @dataclass
64
64
  class ModelGraph:
65
65
  id: str
66
- nodes: Dict[str, Node] = field(default_factory=dict)
66
+ nodes: Dict[str, Node] = field(default_factory=dict)
67
+ framework: str = "keras"
@@ -6,3 +6,4 @@ class ImportModelTypeEnum(Enum):
6
6
  ONNX = "ONNX"
7
7
  PB_TF2 = "PB_TF2"
8
8
  H5_TF2 = "H5_TF2"
9
+ PYTORCH_PT2 = "PYTORCH_PT2"
@@ -0,0 +1,42 @@
1
+ from typing import Dict, List, Tuple
2
+
3
+ import torch
4
+ from torch.export import ExportedProgram, load
5
+ from torch.export.graph_signature import InputKind
6
+
7
+ from leap_model_parser.contract.graph import InputInfo, Node
8
+ from leap_model_parser.torch_utils import build_module_to_node_map
9
+
10
+
11
+ class TorchModelParser:
12
+ def parse(self, file_path: str) -> Tuple[Dict[str, Node], List[InputInfo], ExportedProgram, str]:
13
+ ep = load(file_path)
14
+ nodes = self._build_node_graph(ep)
15
+ input_infos = self._extract_input_infos(ep)
16
+ return nodes, input_infos, ep, "torch"
17
+
18
+ def _build_node_graph(self, ep: ExportedProgram) -> Dict[str, Node]:
19
+ m2n = build_module_to_node_map(ep)
20
+ nodes: Dict[str, Node] = {}
21
+ for i, (mod_path, (node_name, class_name)) in enumerate(m2n.items()):
22
+ node = Node(
23
+ id=mod_path,
24
+ name=mod_path.split(".")[-1] if "." in mod_path else mod_path,
25
+ position=[i * 100, 0],
26
+ data={"type": class_name, "framework": "torch"},
27
+ )
28
+ nodes[mod_path] = node
29
+ return nodes
30
+
31
+ def _extract_input_infos(self, ep: ExportedProgram) -> List[InputInfo]:
32
+ node_to_spec = {s.arg.name: s for s in ep.graph_signature.input_specs}
33
+ infos: List[InputInfo] = []
34
+ for node in ep.graph_module.graph.nodes:
35
+ if node.op != "placeholder":
36
+ break
37
+ spec = node_to_spec.get(node.name)
38
+ if spec and spec.kind not in (InputKind.PARAMETER, InputKind.BUFFER):
39
+ val = node.meta.get("val")
40
+ shape = list(val.shape) if val is not None else []
41
+ infos.append(InputInfo(name=node.name, shape=shape))
42
+ return infos
@@ -0,0 +1,65 @@
1
+ import torch
2
+ import torch.fx as fx
3
+ from torch.export import ExportedProgram
4
+ from torch.export.graph_signature import InputKind
5
+ from typing import Any, Dict, List, Tuple
6
+
7
+
8
+ def get_full_args(ep: ExportedProgram, user_inputs: List[torch.Tensor]) -> List[torch.Tensor]:
9
+ node_to_spec = {s.arg.name: s for s in ep.graph_signature.input_specs}
10
+ user_iter = iter(user_inputs)
11
+ constants = getattr(ep, "constants", {}) or {}
12
+ full_args = []
13
+ for node in ep.graph_module.graph.nodes:
14
+ if node.op != "placeholder":
15
+ break
16
+ spec = node_to_spec.get(node.name)
17
+ if spec and spec.kind in (InputKind.PARAMETER, InputKind.BUFFER):
18
+ if spec.target in ep.state_dict:
19
+ full_args.append(ep.state_dict[spec.target].clone())
20
+ else:
21
+ full_args.append(constants[spec.target].clone())
22
+ else:
23
+ full_args.append(next(user_iter))
24
+ return full_args
25
+
26
+
27
+ def build_module_to_node_map(ep: ExportedProgram) -> Dict[str, Tuple[str, str]]:
28
+ mapping: Dict[str, Tuple[str, str]] = {}
29
+ for node in ep.graph_module.graph.nodes:
30
+ if node.op != "call_function":
31
+ continue
32
+ stack = node.meta.get("nn_module_stack", {})
33
+ if not stack:
34
+ continue
35
+ for mod_path, mod_type in stack.values():
36
+ class_name = mod_type.__name__ if not isinstance(mod_type, str) else mod_type.split(".")[-1]
37
+ mapping[mod_path] = (node.name, class_name)
38
+ return mapping
39
+
40
+
41
+ def extract_tensor(output: Any) -> torch.Tensor:
42
+ if isinstance(output, torch.Tensor):
43
+ return output
44
+ if isinstance(output, (tuple, list)):
45
+ t = output[0]
46
+ return t if isinstance(t, torch.Tensor) else extract_tensor(t)
47
+ if hasattr(output, "pooler_output") and output.pooler_output is not None:
48
+ return output.pooler_output
49
+ if hasattr(output, "last_hidden_state"):
50
+ return output.last_hidden_state[:, 0, :]
51
+ if hasattr(output, "logits"):
52
+ return output.logits
53
+ return output[0]
54
+
55
+
56
+ class ActivationInterpreter(fx.Interpreter):
57
+ def __init__(self, gm: fx.GraphModule):
58
+ super().__init__(gm)
59
+ self.cache: Dict[str, torch.Tensor] = {}
60
+
61
+ def run_node(self, node: fx.Node) -> Any:
62
+ result = super().run_node(node)
63
+ if isinstance(result, torch.Tensor):
64
+ self.cache[node.name] = result.detach().clone()
65
+ return result
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "leap-model-parser"
3
- version = "0.1.249.dev0"
3
+ version = "0.1.250.dev1"
4
4
  description = ""
5
5
  authors = ["idan <idan.yogev@tensorleap.ai>"]
6
6
  license = "MIT"
@@ -18,11 +18,12 @@ tensorflow = {version = "2.12.0", markers = "platform_machine == 'x86_64'"}
18
18
  tensorflow-macos = {version = "2.12.0", markers = "platform_machine == 'arm64'"}
19
19
  numpy = "^1.22.3"
20
20
  onnx = "1.13.0"
21
- onnx2kerastl = "0.0.191.dev0"
21
+ onnx2kerastl = "0.0.191"
22
22
  keras-data-format-converter = "0.1.24"
23
23
  leap-model-rebuilder = "0.1.7"
24
24
  tensorflow-io-gcs-filesystem = "0.34.0"
25
25
  code-loader = ">=1.0.127"
26
+ torch = "~=2.3.0"
26
27
 
27
28
  [tool.poetry.dev-dependencies]
28
29
  pytest = "^7.1.1"