leap-model-parser 0.1.248.dev0__tar.gz → 0.1.250.dev0__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.
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/PKG-INFO +3 -2
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/contract/graph.py +2 -1
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/contract/importmodelresponse.py +1 -0
- leap_model_parser-0.1.250.dev0/leap_model_parser/torch_model_parser.py +42 -0
- leap_model_parser-0.1.250.dev0/leap_model_parser/torch_utils.py +65 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/pyproject.toml +3 -2
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/LICENSE +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/README.md +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/__init__.py +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/contract/__init__.py +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/contract/nodedata.py +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/contract/ui_components.json +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/keras_json_model_import.py +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/leap_graph_editor.py +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/model_parser.py +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/utils/__init__.py +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/utils/layerpedia/__init__.py +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/utils/layerpedia/layerpedia.py +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/utils/tlinspection/__init__.py +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/utils/tlinspection/leapinspection.py +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/utils/uicomponents/__init__.py +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/utils/uicomponents/generatenodedata.py +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/utils/uicomponents/tensorflowinscpection.py +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/utils/uicomponents/ui_components.json +0 -0
- {leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/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.
|
|
3
|
+
Version: 0.1.250.dev0
|
|
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.190
|
|
20
|
+
Requires-Dist: onnx2kerastl (==0.0.190)
|
|
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
|
|
|
@@ -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.
|
|
3
|
+
version = "0.1.250.dev"
|
|
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.190
|
|
21
|
+
onnx2kerastl = "0.0.190"
|
|
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"
|
|
File without changes
|
|
File without changes
|
{leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{leap_model_parser-0.1.248.dev0 → leap_model_parser-0.1.250.dev0}/leap_model_parser/model_parser.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|