diffract-core 0.2.1__py3-none-any.whl
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.
- diffract/__init__.py +52 -0
- diffract/configs/fast_speed_without_disk.ini +48 -0
- diffract/configs/hybrid.ini +74 -0
- diffract/configs/sqlite.ini +62 -0
- diffract/containers.py +405 -0
- diffract/core/__init__.py +23 -0
- diffract/core/cache/__init__.py +24 -0
- diffract/core/cache/containers.py +93 -0
- diffract/core/cache/interface.py +117 -0
- diffract/core/cache/redis_manager.py +464 -0
- diffract/core/cache/simple_manager.py +478 -0
- diffract/core/compute/__init__.py +46 -0
- diffract/core/compute/config.py +48 -0
- diffract/core/compute/containers.py +81 -0
- diffract/core/compute/decorator.py +125 -0
- diffract/core/compute/exceptions.py +31 -0
- diffract/core/compute/execution/__init__.py +14 -0
- diffract/core/compute/execution/_types.py +70 -0
- diffract/core/compute/execution/aggregation.py +74 -0
- diffract/core/compute/execution/aggregation_runner.py +362 -0
- diffract/core/compute/execution/enums.py +38 -0
- diffract/core/compute/execution/executor.py +125 -0
- diffract/core/compute/execution/parameter_runner.py +125 -0
- diffract/core/compute/execution/restrictions.py +61 -0
- diffract/core/compute/execution/strategy.py +118 -0
- diffract/core/compute/execution/utils.py +112 -0
- diffract/core/compute/extensions/__init__.py +0 -0
- diffract/core/compute/extensions/power_law.py +1051 -0
- diffract/core/compute/extensions/rmt.py +150 -0
- diffract/core/compute/extensions/utils.py +36 -0
- diffract/core/compute/field_signature.py +183 -0
- diffract/core/compute/kernels/__init__.py +48 -0
- diffract/core/compute/kernels/alignment.py +106 -0
- diffract/core/compute/kernels/heavy_tailed.py +394 -0
- diffract/core/compute/kernels/marchenko_pastur.py +99 -0
- diffract/core/compute/kernels/mat_decomposition.py +101 -0
- diffract/core/compute/kernels/mat_properties.py +53 -0
- diffract/core/compute/kernels/model_quality.py +27 -0
- diffract/core/compute/kernels/norms.py +88 -0
- diffract/core/compute/kernels/ranks.py +35 -0
- diffract/core/compute/kernels/tracy_widom.py +36 -0
- diffract/core/compute/metadata.py +67 -0
- diffract/core/compute/registry.py +485 -0
- diffract/core/constants.py +147 -0
- diffract/core/data/__init__.py +32 -0
- diffract/core/data/interface.py +304 -0
- diffract/core/data/metadata/__init__.py +15 -0
- diffract/core/data/metadata/containers.py +60 -0
- diffract/core/data/metadata/interface.py +208 -0
- diffract/core/data/metadata/sqlite_index.py +604 -0
- diffract/core/data/nn/__init__.py +43 -0
- diffract/core/data/nn/aggregates/__init__.py +35 -0
- diffract/core/data/nn/aggregates/metadata.py +96 -0
- diffract/core/data/nn/aggregates/proxy.py +57 -0
- diffract/core/data/nn/aggregates/repository.py +87 -0
- diffract/core/data/nn/aggregates/view.py +307 -0
- diffract/core/data/nn/containers.py +86 -0
- diffract/core/data/nn/extractors/__init__.py +49 -0
- diffract/core/data/nn/extractors/base.py +300 -0
- diffract/core/data/nn/extractors/factory.py +234 -0
- diffract/core/data/nn/extractors/flax.py +112 -0
- diffract/core/data/nn/extractors/handlers/__init__.py +39 -0
- diffract/core/data/nn/extractors/handlers/base.py +110 -0
- diffract/core/data/nn/extractors/handlers/flax_handlers.py +71 -0
- diffract/core/data/nn/extractors/handlers/numpy_handlers.py +63 -0
- diffract/core/data/nn/extractors/handlers/onnx_handlers.py +67 -0
- diffract/core/data/nn/extractors/handlers/tensorflow_handlers.py +82 -0
- diffract/core/data/nn/extractors/handlers/torch_handlers.py +124 -0
- diffract/core/data/nn/extractors/interface.py +56 -0
- diffract/core/data/nn/extractors/numpy.py +94 -0
- diffract/core/data/nn/extractors/onnx.py +108 -0
- diffract/core/data/nn/extractors/tensorflow.py +99 -0
- diffract/core/data/nn/extractors/torch.py +204 -0
- diffract/core/data/nn/params/__init__.py +27 -0
- diffract/core/data/nn/params/interface.py +402 -0
- diffract/core/data/nn/params/metadata.py +110 -0
- diffract/core/data/nn/params/proxy.py +93 -0
- diffract/core/data/nn/params/repository.py +45 -0
- diffract/core/data/nn/params/schema.py +82 -0
- diffract/core/data/nn/params/view.py +393 -0
- diffract/core/data/proxy.py +246 -0
- diffract/core/data/repository.py +227 -0
- diffract/core/data/utils.py +33 -0
- diffract/core/data/view.py +389 -0
- diffract/core/export/__init__.py +27 -0
- diffract/core/export/containers.py +47 -0
- diffract/core/export/exporters.py +191 -0
- diffract/core/export/formatters/__init__.py +23 -0
- diffract/core/export/formatters/base.py +68 -0
- diffract/core/export/formatters/dict_formatter.py +38 -0
- diffract/core/export/formatters/json_formatter.py +58 -0
- diffract/core/export/formatters/list_formatter.py +41 -0
- diffract/core/export/formatters/pandas_formatter.py +86 -0
- diffract/core/export/formatters/polars_formatter.py +86 -0
- diffract/core/export/formatters/registry.py +84 -0
- diffract/core/export/interface.py +105 -0
- diffract/core/parallel/__init__.py +21 -0
- diffract/core/parallel/containers.py +57 -0
- diffract/core/parallel/execution.py +91 -0
- diffract/core/parallel/runtime.py +91 -0
- diffract/core/storage/__init__.py +35 -0
- diffract/core/storage/base_manager.py +330 -0
- diffract/core/storage/containers.py +122 -0
- diffract/core/storage/hdf5_manager.py +856 -0
- diffract/core/storage/hybrid_manager.py +218 -0
- diffract/core/storage/interface.py +222 -0
- diffract/core/storage/metadata.py +89 -0
- diffract/core/storage/ram_manager.py +159 -0
- diffract/core/storage/sqlite_manager.py +1062 -0
- diffract/core/storage/zarr_manager.py +992 -0
- diffract/core/utils/__init__.py +45 -0
- diffract/core/utils/build.py +46 -0
- diffract/core/utils/exceptions.py +11 -0
- diffract/core/utils/hashing.py +90 -0
- diffract/core/utils/imports.py +292 -0
- diffract/core/utils/math.py +15 -0
- diffract/py.typed +0 -0
- diffract/session/__init__.py +24 -0
- diffract/session/errors.py +17 -0
- diffract/session/field_cache.py +216 -0
- diffract/session/namespaces/__init__.py +15 -0
- diffract/session/namespaces/compute/__init__.py +219 -0
- diffract/session/namespaces/models/__init__.py +282 -0
- diffract/session/namespaces/models/parameters/__init__.py +133 -0
- diffract/session/namespaces/models/parameters/meta_patcher.py +167 -0
- diffract/session/namespaces/results/__init__.py +378 -0
- diffract/session/namespaces/results/eraser.py +129 -0
- diffract/session/namespaces/results/injester.py +249 -0
- diffract/session/namespaces/utils/__init__.py +141 -0
- diffract/session/namespaces/utils/merger.py +295 -0
- diffract/session/namespaces/viz/__init__.py +91 -0
- diffract/session/namespaces/viz/_utils.py +14 -0
- diffract/session/namespaces/viz/box.py +207 -0
- diffract/session/namespaces/viz/grid.py +160 -0
- diffract/session/namespaces/viz/heatmap.py +164 -0
- diffract/session/namespaces/viz/scatter.py +202 -0
- diffract/session/namespaces/viz/sparkline.py +270 -0
- diffract/session/namespaces/viz/violin.py +212 -0
- diffract/session/session.py +260 -0
- diffract/session/utils.py +81 -0
- diffract/viz/__init__.py +42 -0
- diffract/viz/data/__init__.py +34 -0
- diffract/viz/data/detection.py +57 -0
- diffract/viz/data/extraction.py +117 -0
- diffract/viz/data/filtering.py +57 -0
- diffract/viz/data/ordering.py +129 -0
- diffract/viz/data/provider.py +99 -0
- diffract/viz/data/types.py +98 -0
- diffract/viz/plots/__init__.py +37 -0
- diffract/viz/plots/base/__init__.py +20 -0
- diffract/viz/plots/base/axis.py +219 -0
- diffract/viz/plots/base/coloraxis.py +133 -0
- diffract/viz/plots/base/configurator.py +18 -0
- diffract/viz/plots/base/jitter.py +368 -0
- diffract/viz/plots/base/line.py +197 -0
- diffract/viz/plots/base/marker.py +278 -0
- diffract/viz/plots/base/overlay.py +14 -0
- diffract/viz/plots/base/plot.py +110 -0
- diffract/viz/plots/base/update.py +50 -0
- diffract/viz/plots/boxplot.py +283 -0
- diffract/viz/plots/cluster.py +374 -0
- diffract/viz/plots/heatmap.py +168 -0
- diffract/viz/plots/scatter.py +233 -0
- diffract/viz/plots/sparkline.py +405 -0
- diffract/viz/plots/subplots/__init__.py +32 -0
- diffract/viz/plots/subplots/coloraxis.py +339 -0
- diffract/viz/plots/subplots/factory.py +713 -0
- diffract/viz/plots/subplots/grid.py +214 -0
- diffract/viz/plots/subplots/layout.py +370 -0
- diffract/viz/plots/subplots/spec.py +39 -0
- diffract/viz/plots/violin.py +298 -0
- diffract/viz/renderer.py +513 -0
- diffract/viz/styling/__init__.py +78 -0
- diffract/viz/styling/palettes/__init__.py +20 -0
- diffract/viz/styling/palettes/bundle.py +16 -0
- diffract/viz/styling/palettes/color.py +83 -0
- diffract/viz/styling/palettes/dashes.py +27 -0
- diffract/viz/styling/palettes/symbols.py +42 -0
- diffract/viz/styling/resolvers/__init__.py +11 -0
- diffract/viz/styling/resolvers/categorical.py +68 -0
- diffract/viz/styling/resolvers/color.py +77 -0
- diffract/viz/styling/resolvers/numeric.py +108 -0
- diffract/viz/styling/sources.py +27 -0
- diffract/viz/styling/theme/__init__.py +29 -0
- diffract/viz/styling/theme/applier.py +114 -0
- diffract/viz/styling/theme/components.py +66 -0
- diffract/viz/styling/theme/presets.py +58 -0
- diffract/viz/styling/theme/theme.py +36 -0
- diffract_core-0.2.1.dist-info/METADATA +530 -0
- diffract_core-0.2.1.dist-info/RECORD +193 -0
- diffract_core-0.2.1.dist-info/WHEEL +4 -0
- diffract_core-0.2.1.dist-info/licenses/LICENSE +201 -0
- diffract_core-0.2.1.dist-info/licenses/NOTICE +2 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"""ONNX parameter extractors.
|
|
2
|
+
|
|
3
|
+
Provides a parameter extractor for ONNX `ModelProto` objects.
|
|
4
|
+
Currently supports only dense (fully-connected) weights, extracted from `Gemm`
|
|
5
|
+
nodes when their weight input is present in graph initializers.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import logging
|
|
11
|
+
from typing import TYPE_CHECKING, Any, Self
|
|
12
|
+
|
|
13
|
+
import diffract.core.utils.imports as import_utils
|
|
14
|
+
|
|
15
|
+
from .base import BaseParameterExtractor
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from collections.abc import Generator
|
|
19
|
+
|
|
20
|
+
from .base import ExtractorOverrides
|
|
21
|
+
from .handlers.base import ParameterHandler
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
if not import_utils.is_available("onnx"):
|
|
27
|
+
logger.debug("ONNX not available, disabling ONNX extractors")
|
|
28
|
+
|
|
29
|
+
class OnnxModelExtractor(BaseParameterExtractor):
|
|
30
|
+
"""Stub implementation when ONNX is not available."""
|
|
31
|
+
|
|
32
|
+
def __new__(cls, *_args: Any, **_kwargs: Any) -> Self: # noqa: D102
|
|
33
|
+
msg = "onnx package not available"
|
|
34
|
+
raise ImportError(msg)
|
|
35
|
+
|
|
36
|
+
else:
|
|
37
|
+
import numpy as np
|
|
38
|
+
|
|
39
|
+
onnx = import_utils.require("onnx")
|
|
40
|
+
numpy_helper = import_utils.require("onnx.numpy_helper")
|
|
41
|
+
|
|
42
|
+
from .handlers import OnnxDenseHandler
|
|
43
|
+
|
|
44
|
+
def _onnx_node_display_name(node: Any) -> str:
|
|
45
|
+
if getattr(node, "name", ""):
|
|
46
|
+
return node.name
|
|
47
|
+
outputs = list(getattr(node, "output", []) or [])
|
|
48
|
+
if outputs:
|
|
49
|
+
return outputs[0]
|
|
50
|
+
return "gemm"
|
|
51
|
+
|
|
52
|
+
class OnnxModelExtractor(BaseParameterExtractor):
|
|
53
|
+
"""ONNX ModelProto parameter extractor (DENSE only)."""
|
|
54
|
+
|
|
55
|
+
def __init__(
|
|
56
|
+
self,
|
|
57
|
+
model: Any,
|
|
58
|
+
overrides: ExtractorOverrides | None = None,
|
|
59
|
+
skip_not_implemented_types: bool = True,
|
|
60
|
+
custom_handlers: list[ParameterHandler] | None = None,
|
|
61
|
+
) -> None:
|
|
62
|
+
super().__init__(
|
|
63
|
+
model, overrides, skip_not_implemented_types, custom_handlers
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
def _register_default_handlers(self) -> None:
|
|
67
|
+
self.handler_registry.register_handler_class(OnnxDenseHandler)
|
|
68
|
+
logger.debug(
|
|
69
|
+
"Registered %d default handlers for ONNX models (DENSE only)",
|
|
70
|
+
len(self.handler_registry.list_handlers()),
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
def _iter_parameters(self) -> Generator[tuple[str, Any], None, None]:
|
|
74
|
+
"""Yield dense weight arrays from Gemm nodes.
|
|
75
|
+
|
|
76
|
+
For `Gemm` node: inputs are typically [A, B, C]. We treat B as the
|
|
77
|
+
weight matrix, and ignore bias (C).
|
|
78
|
+
"""
|
|
79
|
+
model = self.model
|
|
80
|
+
if not isinstance(model, onnx.ModelProto):
|
|
81
|
+
msg = f"OnnxModelExtractor expects onnx.ModelProto, got {type(model)}"
|
|
82
|
+
raise TypeError(msg)
|
|
83
|
+
|
|
84
|
+
graph = model.graph
|
|
85
|
+
initializer_by_name: dict[str, Any] = {
|
|
86
|
+
init.name: init for init in graph.initializer
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
min_gemm_inputs = 2
|
|
90
|
+
for node in graph.node:
|
|
91
|
+
if getattr(node, "op_type", None) != "Gemm":
|
|
92
|
+
continue
|
|
93
|
+
|
|
94
|
+
inputs = list(getattr(node, "input", []) or [])
|
|
95
|
+
if len(inputs) < min_gemm_inputs:
|
|
96
|
+
continue
|
|
97
|
+
|
|
98
|
+
weight_name = inputs[1]
|
|
99
|
+
init = initializer_by_name.get(weight_name)
|
|
100
|
+
if init is None:
|
|
101
|
+
continue
|
|
102
|
+
|
|
103
|
+
weight_arr = numpy_helper.to_array(init)
|
|
104
|
+
# Ensure NumPy array for downstream handlers.
|
|
105
|
+
weight_arr = np.asarray(weight_arr)
|
|
106
|
+
|
|
107
|
+
node_name = _onnx_node_display_name(node)
|
|
108
|
+
yield f"{node_name}.weight", weight_arr
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""TensorFlow/Keras parameter extractors.
|
|
2
|
+
|
|
3
|
+
Provides a parameter extractor for TensorFlow Keras models.
|
|
4
|
+
Currently supports only dense (fully-connected) layer kernels.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import logging
|
|
10
|
+
from typing import TYPE_CHECKING, Any, Self
|
|
11
|
+
|
|
12
|
+
import diffract.core.utils.imports as import_utils
|
|
13
|
+
|
|
14
|
+
from .base import BaseParameterExtractor
|
|
15
|
+
|
|
16
|
+
if TYPE_CHECKING:
|
|
17
|
+
from collections.abc import Generator
|
|
18
|
+
|
|
19
|
+
from .base import ExtractorOverrides
|
|
20
|
+
from .handlers.base import ParameterHandler
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
if not import_utils.is_available("tensorflow"):
|
|
26
|
+
logger.debug("TensorFlow not available, disabling TensorFlow extractors")
|
|
27
|
+
|
|
28
|
+
class TensorFlowModelExtractor(BaseParameterExtractor):
|
|
29
|
+
"""Stub implementation when TensorFlow is not available."""
|
|
30
|
+
|
|
31
|
+
def __new__(cls, *_args: Any, **_kwargs: Any) -> Self: # noqa: D102
|
|
32
|
+
msg = "TensorFlow package not available"
|
|
33
|
+
raise ImportError(msg)
|
|
34
|
+
|
|
35
|
+
else:
|
|
36
|
+
tf = import_utils.require("tensorflow")
|
|
37
|
+
|
|
38
|
+
from .handlers import TensorFlowDenseHandler
|
|
39
|
+
|
|
40
|
+
def _walk_layers(obj: Any) -> Generator[Any, None, None]:
|
|
41
|
+
"""Yield layers contained in a Keras model/layer.
|
|
42
|
+
|
|
43
|
+
Uses public attributes (`layers`) when available and falls back to yielding
|
|
44
|
+
the object itself. This avoids relying on private APIs that may change
|
|
45
|
+
across TensorFlow/Keras versions.
|
|
46
|
+
"""
|
|
47
|
+
if isinstance(obj, tf.keras.Model):
|
|
48
|
+
for layer in obj.layers:
|
|
49
|
+
yield from _walk_layers(layer)
|
|
50
|
+
return
|
|
51
|
+
|
|
52
|
+
if isinstance(obj, tf.keras.layers.Layer):
|
|
53
|
+
yield obj
|
|
54
|
+
# Some composite layers expose nested layers via `.layers`.
|
|
55
|
+
nested = getattr(obj, "layers", None)
|
|
56
|
+
if isinstance(nested, list):
|
|
57
|
+
for layer in nested:
|
|
58
|
+
yield from _walk_layers(layer)
|
|
59
|
+
return
|
|
60
|
+
|
|
61
|
+
class TensorFlowModelExtractor(BaseParameterExtractor):
|
|
62
|
+
"""TensorFlow Keras model parameter extractor (DENSE only)."""
|
|
63
|
+
|
|
64
|
+
def __init__(
|
|
65
|
+
self,
|
|
66
|
+
model: Any,
|
|
67
|
+
overrides: ExtractorOverrides | None = None,
|
|
68
|
+
skip_not_implemented_types: bool = True,
|
|
69
|
+
custom_handlers: list[ParameterHandler] | None = None,
|
|
70
|
+
) -> None:
|
|
71
|
+
super().__init__(
|
|
72
|
+
model, overrides, skip_not_implemented_types, custom_handlers
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
def _register_default_handlers(self) -> None:
|
|
76
|
+
# Register only the DENSE handler.
|
|
77
|
+
self.handler_registry.register_handler_class(TensorFlowDenseHandler)
|
|
78
|
+
logger.debug(
|
|
79
|
+
"Registered %d default handlers for TensorFlow models (DENSE only)",
|
|
80
|
+
len(self.handler_registry.list_handlers()),
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
def _iter_parameters(self) -> Generator[tuple[str, Any], None, None]:
|
|
84
|
+
"""Yield Dense layers as parameters.
|
|
85
|
+
|
|
86
|
+
We intentionally yield only Dense layers and name parameters as
|
|
87
|
+
`<layer.name>.kernel` to match weight-level naming convention.
|
|
88
|
+
"""
|
|
89
|
+
model = self.model
|
|
90
|
+
if not isinstance(model, (tf.keras.Model, tf.keras.layers.Layer)):
|
|
91
|
+
msg = (
|
|
92
|
+
"TensorFlowModelExtractor expects a tf.keras.Model or "
|
|
93
|
+
f"tf.keras.layers.Layer, got {type(model)}"
|
|
94
|
+
)
|
|
95
|
+
raise TypeError(msg)
|
|
96
|
+
|
|
97
|
+
for layer in _walk_layers(model):
|
|
98
|
+
if isinstance(layer, tf.keras.layers.Dense):
|
|
99
|
+
yield f"{layer.name}.kernel", layer
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"""PyTorch-specific parameter extractors.
|
|
2
|
+
|
|
3
|
+
This module provides parameter extractors specifically designed for PyTorch
|
|
4
|
+
models and state dictionaries. It implements the BaseParameterExtractor
|
|
5
|
+
interface with PyTorch-specific parameter iteration and handler registration.
|
|
6
|
+
|
|
7
|
+
Supported PyTorch Objects:
|
|
8
|
+
- torch.nn.Module: Complete PyTorch models with named modules
|
|
9
|
+
- dict[str, torch.Tensor]: PyTorch state dictionaries
|
|
10
|
+
|
|
11
|
+
The extractors use handler-based processing to support different parameter
|
|
12
|
+
types while maintaining extensibility for custom parameter handling. Currently
|
|
13
|
+
focused on dense (fully-connected) layer parameters with room for expansion.
|
|
14
|
+
|
|
15
|
+
Example:
|
|
16
|
+
>>> import torch
|
|
17
|
+
>>> model = torch.nn.Sequential(
|
|
18
|
+
... torch.nn.Linear(10, 5), torch.nn.ReLU(), torch.nn.Linear(5, 1)
|
|
19
|
+
... )
|
|
20
|
+
>>> extractor = TorchModuleExtractor(model)
|
|
21
|
+
>>> parameters = extractor.extract_parameters(storage, cache)
|
|
22
|
+
>>> # For state dict:
|
|
23
|
+
>>> state_dict = model.state_dict()
|
|
24
|
+
>>> extractor = TorchStateDictExtractor(state_dict)
|
|
25
|
+
>>> parameters = extractor.extract_parameters(storage, cache)
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
import logging
|
|
31
|
+
from typing import TYPE_CHECKING, Any, Self
|
|
32
|
+
|
|
33
|
+
import diffract.core.utils.imports as import_utils
|
|
34
|
+
|
|
35
|
+
from .base import BaseParameterExtractor
|
|
36
|
+
|
|
37
|
+
if TYPE_CHECKING:
|
|
38
|
+
from collections.abc import Generator
|
|
39
|
+
|
|
40
|
+
import torch
|
|
41
|
+
from torch import nn
|
|
42
|
+
|
|
43
|
+
from .base import ExtractorOverrides
|
|
44
|
+
from .handlers.base import ParameterHandler
|
|
45
|
+
|
|
46
|
+
logger = logging.getLogger(__name__)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
if not import_utils.is_available("torch"):
|
|
50
|
+
logger.debug("PyTorch not available, disabling PyTorch extractors")
|
|
51
|
+
|
|
52
|
+
class TorchModuleExtractor(BaseParameterExtractor):
|
|
53
|
+
"""Stub implementation when PyTorch is not available.
|
|
54
|
+
|
|
55
|
+
Raises ImportError when instantiated to indicate PyTorch dependency
|
|
56
|
+
is missing.
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
def __new__(cls, *_args: Any, **_kwargs: Any) -> Self:
|
|
60
|
+
"""Raise ImportError since PyTorch is unavailable."""
|
|
61
|
+
msg = "PyTorch package not available"
|
|
62
|
+
raise ImportError(msg)
|
|
63
|
+
|
|
64
|
+
class TorchStateDictExtractor(BaseParameterExtractor):
|
|
65
|
+
"""Stub implementation when PyTorch is not available.
|
|
66
|
+
|
|
67
|
+
Raises ImportError when instantiated to indicate PyTorch dependency
|
|
68
|
+
is missing.
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
def __new__(cls, *_args: Any, **_kwargs: Any) -> Self:
|
|
72
|
+
"""Raise ImportError since PyTorch is unavailable."""
|
|
73
|
+
msg = "PyTorch package not available"
|
|
74
|
+
raise ImportError(msg)
|
|
75
|
+
|
|
76
|
+
else:
|
|
77
|
+
from .handlers import TorchDenseHandler, TorchStateDictDenseHandler
|
|
78
|
+
|
|
79
|
+
class TorchModuleExtractor(BaseParameterExtractor):
|
|
80
|
+
"""PyTorch nn.Module parameter extractor with handler-based processing.
|
|
81
|
+
|
|
82
|
+
Extracts parameters from PyTorch nn.Module objects by iterating through
|
|
83
|
+
named modules and processing them with registered handlers. Currently
|
|
84
|
+
supports dense (fully-connected) layer parameters with extensible
|
|
85
|
+
architecture for additional parameter types.
|
|
86
|
+
|
|
87
|
+
Example:
|
|
88
|
+
>>> import torch.nn as nn
|
|
89
|
+
>>> model = nn.Sequential(nn.Linear(128, 64), nn.Linear(64, 10))
|
|
90
|
+
>>> extractor = TorchModuleExtractor(model)
|
|
91
|
+
>>> params = extractor.extract_parameters(storage, cache)
|
|
92
|
+
|
|
93
|
+
Attributes:
|
|
94
|
+
model: PyTorch nn.Module to extract parameters from.
|
|
95
|
+
"""
|
|
96
|
+
|
|
97
|
+
def __init__(
|
|
98
|
+
self,
|
|
99
|
+
model: nn.Module,
|
|
100
|
+
overrides: ExtractorOverrides | None = None,
|
|
101
|
+
skip_not_implemented_types: bool = True,
|
|
102
|
+
custom_handlers: list[ParameterHandler] | None = None,
|
|
103
|
+
) -> None:
|
|
104
|
+
"""Initialize PyTorch module extractor.
|
|
105
|
+
|
|
106
|
+
Args:
|
|
107
|
+
model: PyTorch nn.Module to extract parameters from.
|
|
108
|
+
overrides: Optional extraction behavior overrides.
|
|
109
|
+
skip_not_implemented_types: Whether to skip unsupported modules.
|
|
110
|
+
custom_handlers: Optional list of custom parameter handlers.
|
|
111
|
+
"""
|
|
112
|
+
super().__init__(
|
|
113
|
+
model, overrides, skip_not_implemented_types, custom_handlers
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
def _register_default_handlers(self) -> None:
|
|
117
|
+
"""Register default handlers for PyTorch modules.
|
|
118
|
+
|
|
119
|
+
Registers the TorchDenseHandler for processing dense/linear layers.
|
|
120
|
+
Additional handlers can be registered for other layer types.
|
|
121
|
+
"""
|
|
122
|
+
# Register only the DENSE handler that was originally supported
|
|
123
|
+
self.handler_registry.register_handler_class(TorchDenseHandler)
|
|
124
|
+
logger.debug(
|
|
125
|
+
"Registered %d default handlers for PyTorch modules (DENSE only)",
|
|
126
|
+
len(self.handler_registry.list_handlers()),
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
def _iter_parameters(self) -> Generator[tuple[str, nn.Module], None, None]:
|
|
130
|
+
"""Iterate over named modules in the PyTorch model.
|
|
131
|
+
|
|
132
|
+
Yields all named modules in the model, allowing handlers to process
|
|
133
|
+
each module type appropriately. This includes leaf modules and
|
|
134
|
+
intermediate containers.
|
|
135
|
+
|
|
136
|
+
Yields:
|
|
137
|
+
Tuples of (module_name, module) for each module in the model.
|
|
138
|
+
"""
|
|
139
|
+
yield from self.model.named_modules()
|
|
140
|
+
|
|
141
|
+
class TorchStateDictExtractor(BaseParameterExtractor):
|
|
142
|
+
"""PyTorch state_dict parameter extractor with handler-based processing.
|
|
143
|
+
|
|
144
|
+
Extracts parameters from PyTorch state dictionaries by iterating through
|
|
145
|
+
tensor entries and processing them with registered handlers. State dicts
|
|
146
|
+
provide direct access to parameter tensors without module structure.
|
|
147
|
+
|
|
148
|
+
This extractor is useful for processing saved model weights, checkpoint
|
|
149
|
+
files, or when working with parameter tensors directly without the
|
|
150
|
+
full model architecture.
|
|
151
|
+
|
|
152
|
+
Example:
|
|
153
|
+
>>> import torch
|
|
154
|
+
>>> state_dict = torch.load("model.pt")
|
|
155
|
+
>>> extractor = TorchStateDictExtractor(state_dict)
|
|
156
|
+
>>> params = extractor.extract_parameters(storage, cache)
|
|
157
|
+
|
|
158
|
+
Attributes:
|
|
159
|
+
model: Dictionary mapping parameter names to tensors.
|
|
160
|
+
"""
|
|
161
|
+
|
|
162
|
+
def __init__(
|
|
163
|
+
self,
|
|
164
|
+
model: dict[str, torch.Tensor],
|
|
165
|
+
overrides: ExtractorOverrides | None = None,
|
|
166
|
+
skip_not_implemented_types: bool = True,
|
|
167
|
+
custom_handlers: list[ParameterHandler] | None = None,
|
|
168
|
+
) -> None:
|
|
169
|
+
"""Initialize PyTorch state dict extractor.
|
|
170
|
+
|
|
171
|
+
Args:
|
|
172
|
+
model: Dictionary mapping parameter names to torch.Tensor.
|
|
173
|
+
overrides: Optional extraction behavior overrides.
|
|
174
|
+
skip_not_implemented_types: Whether to skip unsupported tensors.
|
|
175
|
+
custom_handlers: Optional list of custom parameter handlers.
|
|
176
|
+
"""
|
|
177
|
+
super().__init__(
|
|
178
|
+
model, overrides, skip_not_implemented_types, custom_handlers
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
def _register_default_handlers(self) -> None:
|
|
182
|
+
"""Register default handlers for PyTorch state dict tensors.
|
|
183
|
+
|
|
184
|
+
Registers the TorchStateDictDenseHandler for processing dense layer
|
|
185
|
+
parameter tensors from state dictionaries.
|
|
186
|
+
"""
|
|
187
|
+
# Register only the DENSE handler that was originally supported
|
|
188
|
+
self.handler_registry.register_handler_class(TorchStateDictDenseHandler)
|
|
189
|
+
logger.debug(
|
|
190
|
+
"Registered %d default handlers for PyTorch state_dict (DENSE only)",
|
|
191
|
+
len(self.handler_registry.list_handlers()),
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
def _iter_parameters(self) -> Generator[tuple[str, torch.Tensor], None, None]:
|
|
195
|
+
"""Iterate over parameter tensors in the state dictionary.
|
|
196
|
+
|
|
197
|
+
Yields all parameter name-tensor pairs from the state dictionary,
|
|
198
|
+
allowing handlers to process each tensor appropriately.
|
|
199
|
+
|
|
200
|
+
Yields:
|
|
201
|
+
Tuples of (parameter_name, tensor) for each entry in state_dict.
|
|
202
|
+
"""
|
|
203
|
+
state_dict: dict[str, torch.Tensor] = self.model
|
|
204
|
+
yield from state_dict.items()
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""Parameter management module.
|
|
2
|
+
|
|
3
|
+
This package contains the core parameter management components:
|
|
4
|
+
- schema: Domain type definitions and enumerations
|
|
5
|
+
- interface: Protocol definitions for repositories, views, and proxies
|
|
6
|
+
- proxy: Parameter proxy implementation
|
|
7
|
+
- view: Parameter view implementation
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from .interface import IParameterProxy, IParameterRepository, IParameterView
|
|
11
|
+
from .metadata import ParameterMetadata
|
|
12
|
+
from .proxy import ParameterDataProxy
|
|
13
|
+
from .schema import FieldName, ParameterIndex, ParameterType, ParameterUID
|
|
14
|
+
from .view import ParameterView
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"FieldName",
|
|
18
|
+
"IParameterProxy",
|
|
19
|
+
"IParameterRepository",
|
|
20
|
+
"IParameterView",
|
|
21
|
+
"ParameterDataProxy",
|
|
22
|
+
"ParameterIndex",
|
|
23
|
+
"ParameterMetadata",
|
|
24
|
+
"ParameterType",
|
|
25
|
+
"ParameterUID",
|
|
26
|
+
"ParameterView",
|
|
27
|
+
]
|