digitalhub 0.8.0__py3-none-any.whl → 0.8.0b1__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.
Potentially problematic release.
This version of digitalhub might be problematic. Click here for more details.
- digitalhub/__init__.py +4 -5
- digitalhub/client/builder.py +58 -3
- digitalhub/client/{dhcore/client.py → objects/dhcore.py} +60 -48
- digitalhub/client/{local/client.py → objects/local.py} +2 -2
- digitalhub/context/builder.py +85 -1
- digitalhub/context/context.py +1 -1
- digitalhub/datastores/builder.py +37 -13
- digitalhub/datastores/{_base/datastore.py → objects/base.py} +3 -3
- digitalhub/datastores/{local/datastore.py → objects/local.py} +2 -10
- digitalhub/datastores/{remote/datastore.py → objects/remote.py} +1 -9
- digitalhub/datastores/{s3/datastore.py → objects/s3.py} +2 -10
- digitalhub/datastores/{sql/datastore.py → objects/sql.py} +2 -10
- digitalhub/entities/_base/{_base/entity.py → base.py} +1 -1
- digitalhub/entities/_base/crud.py +389 -247
- digitalhub/entities/_base/entity/{entity.py → base.py} +34 -8
- digitalhub/entities/_base/{context/entity.py → entity/context.py} +6 -6
- digitalhub/entities/_base/{executable/entity.py → entity/executable.py} +36 -61
- digitalhub/entities/_base/{material/entity.py → entity/material.py} +6 -6
- digitalhub/entities/_base/entity/unversioned.py +87 -0
- digitalhub/entities/_base/entity/versioned.py +94 -0
- digitalhub/entities/_base/{entity/metadata.py → metadata.py} +2 -2
- digitalhub/entities/_base/{entity/spec.py → spec/base.py} +11 -11
- digitalhub/entities/_base/{material/spec.py → spec/material.py} +3 -3
- digitalhub/entities/_base/{entity/status.py → status/base.py} +3 -14
- digitalhub/entities/_base/{material/status.py → status/material.py} +1 -1
- digitalhub/entities/_builders/metadata.py +60 -0
- digitalhub/entities/_builders/spec.py +43 -0
- digitalhub/entities/_builders/status.py +62 -0
- digitalhub/entities/{_base/entity/_constructors → _builders}/uuid.py +11 -4
- digitalhub/entities/artifact/builder.py +133 -0
- digitalhub/entities/artifact/crud.py +48 -22
- digitalhub/entities/artifact/{_base/entity.py → entity/_base.py} +5 -5
- digitalhub/entities/artifact/entity/artifact.py +9 -0
- digitalhub/entities/artifact/{artifact/spec.py → spec.py} +16 -4
- digitalhub/entities/artifact/{artifact/status.py → status.py} +1 -1
- digitalhub/entities/dataitem/builder.py +144 -0
- digitalhub/entities/dataitem/crud.py +52 -29
- digitalhub/entities/dataitem/{_base/entity.py → entity/_base.py} +5 -5
- digitalhub/entities/dataitem/entity/dataitem.py +9 -0
- digitalhub/entities/dataitem/entity/iceberg.py +7 -0
- digitalhub/entities/dataitem/{table/entity.py → entity/table.py} +4 -25
- digitalhub/entities/dataitem/spec.py +61 -0
- digitalhub/entities/dataitem/status.py +38 -0
- digitalhub/entities/function/builder.py +86 -0
- digitalhub/entities/function/crud.py +43 -17
- digitalhub/entities/function/{_base/entity.py → entity.py} +12 -9
- digitalhub/entities/function/{_base/models.py → models.py} +1 -1
- digitalhub/entities/function/spec.py +81 -0
- digitalhub/entities/function/status.py +9 -0
- digitalhub/entities/model/builder.py +152 -0
- digitalhub/entities/model/crud.py +48 -21
- digitalhub/entities/model/{_base/entity.py → entity/_base.py} +5 -5
- digitalhub/entities/model/entity/huggingface.py +9 -0
- digitalhub/entities/model/{mlflow/utils.py → entity/mlflow.py} +10 -1
- digitalhub/entities/model/entity/model.py +9 -0
- digitalhub/entities/model/entity/sklearn.py +9 -0
- digitalhub/entities/model/spec.py +146 -0
- digitalhub/entities/model/status.py +33 -0
- digitalhub/entities/project/builder.py +82 -0
- digitalhub/entities/project/crud.py +12 -19
- digitalhub/entities/project/{_base/entity.py → entity.py} +102 -120
- digitalhub/entities/project/{_base/spec.py → spec.py} +4 -4
- digitalhub/entities/project/status.py +9 -0
- digitalhub/entities/registries.py +48 -0
- digitalhub/entities/run/builder.py +77 -0
- digitalhub/entities/run/crud.py +33 -20
- digitalhub/entities/run/{_base/entity.py → entity.py} +189 -35
- digitalhub/entities/run/spec.py +153 -0
- digitalhub/entities/run/status.py +114 -0
- digitalhub/entities/secret/builder.py +93 -0
- digitalhub/entities/secret/crud.py +31 -27
- digitalhub/entities/secret/{_base/entity.py → entity.py} +7 -8
- digitalhub/entities/secret/{_base/spec.py → spec.py} +4 -4
- digitalhub/entities/secret/status.py +9 -0
- digitalhub/entities/task/builder.py +74 -0
- digitalhub/entities/task/crud.py +33 -20
- digitalhub/entities/task/{_base/entity.py → entity.py} +8 -9
- digitalhub/entities/task/{_base/models.py → models.py} +0 -9
- digitalhub/entities/task/{_base/spec.py → spec.py} +7 -9
- digitalhub/entities/task/status.py +9 -0
- digitalhub/entities/{utils/utils.py → utils.py} +2 -20
- digitalhub/entities/workflow/builder.py +91 -0
- digitalhub/entities/workflow/crud.py +43 -17
- digitalhub/entities/workflow/{_base/entity.py → entity.py} +12 -9
- digitalhub/entities/workflow/spec.py +15 -0
- digitalhub/entities/workflow/status.py +9 -0
- digitalhub/readers/builder.py +54 -0
- digitalhub/readers/{pandas/reader.py → objects/pandas.py} +1 -1
- digitalhub/readers/registry.py +15 -0
- digitalhub/registry/models.py +87 -0
- digitalhub/registry/registry.py +74 -0
- digitalhub/registry/utils.py +150 -0
- digitalhub/runtimes/{_base.py → base.py} +65 -3
- digitalhub/runtimes/builder.py +40 -19
- digitalhub/runtimes/kind_registry.py +170 -0
- digitalhub/stores/builder.py +52 -6
- digitalhub/stores/{local/store.py → objects/local.py} +1 -1
- digitalhub/stores/{remote/store.py → objects/remote.py} +1 -1
- digitalhub/stores/{s3/store.py → objects/s3.py} +1 -1
- digitalhub/stores/{sql/store.py → objects/sql.py} +1 -1
- digitalhub/{client/dhcore/utils.py → utils/env_utils.py} +14 -2
- digitalhub/utils/exceptions.py +0 -12
- digitalhub/utils/generic_utils.py +42 -18
- digitalhub/utils/io_utils.py +2 -39
- {digitalhub-0.8.0.dist-info → digitalhub-0.8.0b1.dist-info}/METADATA +2 -3
- digitalhub-0.8.0b1.dist-info/RECORD +161 -0
- {digitalhub-0.8.0.dist-info → digitalhub-0.8.0b1.dist-info}/WHEEL +1 -1
- test/test_crud_artifacts.py +96 -0
- test/test_crud_dataitems.py +96 -0
- test/test_crud_functions.py +1 -1
- test/test_crud_runs.py +1 -1
- test/test_crud_tasks.py +1 -1
- digitalhub/client/api.py +0 -63
- digitalhub/client/dhcore/env.py +0 -21
- digitalhub/client/dhcore/models.py +0 -46
- digitalhub/context/api.py +0 -93
- digitalhub/datastores/api.py +0 -37
- digitalhub/entities/_base/api_utils.py +0 -620
- digitalhub/entities/_base/entity/_constructors/metadata.py +0 -44
- digitalhub/entities/_base/entity/_constructors/spec.py +0 -33
- digitalhub/entities/_base/entity/_constructors/status.py +0 -52
- digitalhub/entities/_base/entity/builder.py +0 -175
- digitalhub/entities/_base/executable/__init__.py +0 -0
- digitalhub/entities/_base/material/__init__.py +0 -0
- digitalhub/entities/_base/runtime_entity/__init__.py +0 -0
- digitalhub/entities/_base/runtime_entity/builder.py +0 -106
- digitalhub/entities/_base/unversioned/__init__.py +0 -0
- digitalhub/entities/_base/unversioned/builder.py +0 -66
- digitalhub/entities/_base/unversioned/entity.py +0 -49
- digitalhub/entities/_base/versioned/__init__.py +0 -0
- digitalhub/entities/_base/versioned/builder.py +0 -68
- digitalhub/entities/_base/versioned/entity.py +0 -53
- digitalhub/entities/artifact/_base/__init__.py +0 -0
- digitalhub/entities/artifact/_base/builder.py +0 -86
- digitalhub/entities/artifact/_base/spec.py +0 -15
- digitalhub/entities/artifact/_base/status.py +0 -9
- digitalhub/entities/artifact/artifact/__init__.py +0 -0
- digitalhub/entities/artifact/artifact/builder.py +0 -18
- digitalhub/entities/artifact/artifact/entity.py +0 -32
- digitalhub/entities/builders.py +0 -63
- digitalhub/entities/dataitem/_base/__init__.py +0 -0
- digitalhub/entities/dataitem/_base/builder.py +0 -86
- digitalhub/entities/dataitem/_base/spec.py +0 -15
- digitalhub/entities/dataitem/_base/status.py +0 -20
- digitalhub/entities/dataitem/dataitem/__init__.py +0 -0
- digitalhub/entities/dataitem/dataitem/builder.py +0 -18
- digitalhub/entities/dataitem/dataitem/entity.py +0 -32
- digitalhub/entities/dataitem/dataitem/spec.py +0 -15
- digitalhub/entities/dataitem/dataitem/status.py +0 -9
- digitalhub/entities/dataitem/iceberg/__init__.py +0 -0
- digitalhub/entities/dataitem/iceberg/builder.py +0 -18
- digitalhub/entities/dataitem/iceberg/entity.py +0 -32
- digitalhub/entities/dataitem/iceberg/spec.py +0 -15
- digitalhub/entities/dataitem/iceberg/status.py +0 -9
- digitalhub/entities/dataitem/table/__init__.py +0 -0
- digitalhub/entities/dataitem/table/builder.py +0 -18
- digitalhub/entities/dataitem/table/spec.py +0 -25
- digitalhub/entities/dataitem/table/status.py +0 -9
- digitalhub/entities/function/_base/__init__.py +0 -0
- digitalhub/entities/function/_base/builder.py +0 -79
- digitalhub/entities/function/_base/spec.py +0 -15
- digitalhub/entities/function/_base/status.py +0 -9
- digitalhub/entities/model/_base/__init__.py +0 -0
- digitalhub/entities/model/_base/builder.py +0 -86
- digitalhub/entities/model/_base/spec.py +0 -49
- digitalhub/entities/model/_base/status.py +0 -9
- digitalhub/entities/model/huggingface/__init__.py +0 -0
- digitalhub/entities/model/huggingface/builder.py +0 -18
- digitalhub/entities/model/huggingface/entity.py +0 -32
- digitalhub/entities/model/huggingface/spec.py +0 -36
- digitalhub/entities/model/huggingface/status.py +0 -9
- digitalhub/entities/model/mlflow/__init__.py +0 -0
- digitalhub/entities/model/mlflow/builder.py +0 -18
- digitalhub/entities/model/mlflow/entity.py +0 -32
- digitalhub/entities/model/mlflow/spec.py +0 -44
- digitalhub/entities/model/mlflow/status.py +0 -9
- digitalhub/entities/model/model/__init__.py +0 -0
- digitalhub/entities/model/model/builder.py +0 -18
- digitalhub/entities/model/model/entity.py +0 -32
- digitalhub/entities/model/model/spec.py +0 -15
- digitalhub/entities/model/model/status.py +0 -9
- digitalhub/entities/model/sklearn/__init__.py +0 -0
- digitalhub/entities/model/sklearn/builder.py +0 -18
- digitalhub/entities/model/sklearn/entity.py +0 -32
- digitalhub/entities/model/sklearn/spec.py +0 -15
- digitalhub/entities/model/sklearn/status.py +0 -9
- digitalhub/entities/project/_base/__init__.py +0 -0
- digitalhub/entities/project/_base/builder.py +0 -128
- digitalhub/entities/project/_base/status.py +0 -9
- digitalhub/entities/run/_base/__init__.py +0 -0
- digitalhub/entities/run/_base/builder.py +0 -94
- digitalhub/entities/run/_base/spec.py +0 -50
- digitalhub/entities/run/_base/status.py +0 -9
- digitalhub/entities/secret/_base/__init__.py +0 -0
- digitalhub/entities/secret/_base/builder.py +0 -81
- digitalhub/entities/secret/_base/status.py +0 -9
- digitalhub/entities/task/_base/__init__.py +0 -0
- digitalhub/entities/task/_base/builder.py +0 -91
- digitalhub/entities/task/_base/status.py +0 -9
- digitalhub/entities/utils/__init__.py +0 -0
- digitalhub/entities/workflow/_base/__init__.py +0 -0
- digitalhub/entities/workflow/_base/builder.py +0 -79
- digitalhub/entities/workflow/_base/spec.py +0 -15
- digitalhub/entities/workflow/_base/status.py +0 -9
- digitalhub/factory/__init__.py +0 -0
- digitalhub/factory/api.py +0 -277
- digitalhub/factory/factory.py +0 -268
- digitalhub/factory/utils.py +0 -90
- digitalhub/readers/_base/__init__.py +0 -0
- digitalhub/readers/_base/builder.py +0 -26
- digitalhub/readers/api.py +0 -80
- digitalhub/readers/factory.py +0 -133
- digitalhub/readers/pandas/__init__.py +0 -0
- digitalhub/readers/pandas/builder.py +0 -29
- digitalhub/stores/_base/__init__.py +0 -0
- digitalhub/stores/api.py +0 -54
- digitalhub/stores/local/__init__.py +0 -0
- digitalhub/stores/remote/__init__.py +0 -0
- digitalhub/stores/s3/__init__.py +0 -0
- digitalhub/stores/sql/__init__.py +0 -0
- digitalhub/utils/s3_utils.py +0 -58
- digitalhub-0.8.0.dist-info/RECORD +0 -231
- test/local/CRUD/test_artifacts.py +0 -96
- test/local/CRUD/test_dataitems.py +0 -96
- test/local/CRUD/test_models.py +0 -95
- /digitalhub/client/{_base → objects}/__init__.py +0 -0
- /digitalhub/client/{_base/client.py → objects/base.py} +0 -0
- /digitalhub/{client/dhcore → datastores/objects}/__init__.py +0 -0
- /digitalhub/entities/{utils → _base}/api.py +0 -0
- /digitalhub/{client/local → entities/_base/spec}/__init__.py +0 -0
- /digitalhub/entities/{utils → _base}/state.py +0 -0
- /digitalhub/{datastores/_base → entities/_base/status}/__init__.py +0 -0
- /digitalhub/{datastores/local → entities/_builders}/__init__.py +0 -0
- /digitalhub/entities/{_base/entity/_constructors → _builders}/name.py +0 -0
- /digitalhub/{datastores/remote → entities/artifact/entity}/__init__.py +0 -0
- /digitalhub/{datastores/s3 → entities/dataitem/entity}/__init__.py +0 -0
- /digitalhub/entities/dataitem/{table/models.py → models.py} +0 -0
- /digitalhub/entities/{utils/entity_types.py → entity_types.py} +0 -0
- /digitalhub/{datastores/sql → entities/model/entity}/__init__.py +0 -0
- /digitalhub/entities/model/{mlflow/models.py → models.py} +0 -0
- /digitalhub/{entities/_base/_base → readers/objects}/__init__.py +0 -0
- /digitalhub/readers/{_base/reader.py → objects/base.py} +0 -0
- /digitalhub/{entities/_base/context → registry}/__init__.py +0 -0
- /digitalhub/{entities/_base/entity/_constructors → stores/objects}/__init__.py +0 -0
- /digitalhub/stores/{_base/store.py → objects/base.py} +0 -0
- {digitalhub-0.8.0.dist-info → digitalhub-0.8.0b1.dist-info}/LICENSE.txt +0 -0
- {digitalhub-0.8.0.dist-info → digitalhub-0.8.0b1.dist-info}/top_level.txt +0 -0
- /test/{local/imports/test_imports.py → test_imports.py} +0 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities._base.spec.base import Spec, SpecParams
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class FunctionSpec(Spec):
|
|
7
|
+
"""
|
|
8
|
+
Specification for a Function.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class FunctionParams(SpecParams):
|
|
13
|
+
"""
|
|
14
|
+
Function parameters model.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class SourceCodeStruct:
|
|
19
|
+
"""
|
|
20
|
+
Source code struct.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
def __init__(
|
|
24
|
+
self,
|
|
25
|
+
source: str | None = None,
|
|
26
|
+
handler: str | None = None,
|
|
27
|
+
code: str | None = None,
|
|
28
|
+
base64: str | None = None,
|
|
29
|
+
init_function: str | None = None,
|
|
30
|
+
lang: str | None = None,
|
|
31
|
+
) -> None:
|
|
32
|
+
"""
|
|
33
|
+
Constructor.
|
|
34
|
+
|
|
35
|
+
Parameters
|
|
36
|
+
----------
|
|
37
|
+
source : str
|
|
38
|
+
Source reference.
|
|
39
|
+
handler : str
|
|
40
|
+
Function entrypoint.
|
|
41
|
+
code : str
|
|
42
|
+
Source code (plain).
|
|
43
|
+
base64 : str
|
|
44
|
+
Source code (base64 encoded).
|
|
45
|
+
init_function : str
|
|
46
|
+
Init function for remote execution.
|
|
47
|
+
lang : str
|
|
48
|
+
Source code language (hint).
|
|
49
|
+
"""
|
|
50
|
+
self.source = source
|
|
51
|
+
self.handler = handler
|
|
52
|
+
self.code = code
|
|
53
|
+
self.base64 = base64
|
|
54
|
+
self.init_function = init_function
|
|
55
|
+
self.lang = lang
|
|
56
|
+
|
|
57
|
+
def to_dict(self) -> dict:
|
|
58
|
+
"""
|
|
59
|
+
Convert to dictionary.
|
|
60
|
+
|
|
61
|
+
Returns
|
|
62
|
+
-------
|
|
63
|
+
dict
|
|
64
|
+
Dictionary representation of the object.
|
|
65
|
+
"""
|
|
66
|
+
dict_ = {}
|
|
67
|
+
if self.source is not None:
|
|
68
|
+
dict_["source"] = self.source
|
|
69
|
+
if self.handler is not None:
|
|
70
|
+
dict_["handler"] = self.handler
|
|
71
|
+
if self.base64 is not None:
|
|
72
|
+
dict_["base64"] = self.base64
|
|
73
|
+
if self.init_function is not None:
|
|
74
|
+
dict_["init_function"] = self.init_function
|
|
75
|
+
if self.lang is not None:
|
|
76
|
+
dict_["lang"] = self.lang
|
|
77
|
+
|
|
78
|
+
return dict_
|
|
79
|
+
|
|
80
|
+
def __repr__(self) -> str:
|
|
81
|
+
return str(self.to_dict())
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities._builders.metadata import build_metadata
|
|
6
|
+
from digitalhub.entities._builders.name import build_name
|
|
7
|
+
from digitalhub.entities._builders.spec import build_spec
|
|
8
|
+
from digitalhub.entities._builders.status import build_status
|
|
9
|
+
from digitalhub.entities._builders.uuid import build_uuid
|
|
10
|
+
from digitalhub.utils.exceptions import EntityError
|
|
11
|
+
|
|
12
|
+
if typing.TYPE_CHECKING:
|
|
13
|
+
from digitalhub.entities.model.entity._base import Model
|
|
14
|
+
|
|
15
|
+
# Manage class mapper
|
|
16
|
+
cls_mapper = {}
|
|
17
|
+
|
|
18
|
+
try:
|
|
19
|
+
from digitalhub.entities.model.entity.model import ModelModel
|
|
20
|
+
|
|
21
|
+
cls_mapper["model"] = ModelModel
|
|
22
|
+
except ImportError:
|
|
23
|
+
...
|
|
24
|
+
|
|
25
|
+
try:
|
|
26
|
+
from digitalhub.entities.model.entity.mlflow import ModelMlflow
|
|
27
|
+
|
|
28
|
+
cls_mapper["mlflow"] = ModelMlflow
|
|
29
|
+
except ImportError:
|
|
30
|
+
...
|
|
31
|
+
try:
|
|
32
|
+
from digitalhub.entities.model.entity.sklearn import ModelSklearn
|
|
33
|
+
|
|
34
|
+
cls_mapper["sklearn"] = ModelSklearn
|
|
35
|
+
except ImportError:
|
|
36
|
+
...
|
|
37
|
+
try:
|
|
38
|
+
from digitalhub.entities.model.entity.huggingface import ModelHuggingface
|
|
39
|
+
|
|
40
|
+
cls_mapper["huggingface"] = ModelHuggingface
|
|
41
|
+
except ImportError:
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _choose_model_type(kind: str) -> type[Model]:
|
|
46
|
+
"""
|
|
47
|
+
Choose class based on kind.
|
|
48
|
+
|
|
49
|
+
Parameters
|
|
50
|
+
----------
|
|
51
|
+
kind : str
|
|
52
|
+
Kind the object.
|
|
53
|
+
|
|
54
|
+
Returns
|
|
55
|
+
-------
|
|
56
|
+
type[Model]
|
|
57
|
+
Class of the model.
|
|
58
|
+
"""
|
|
59
|
+
try:
|
|
60
|
+
return cls_mapper[kind]
|
|
61
|
+
except KeyError:
|
|
62
|
+
raise EntityError(f"Unknown model kind: {kind}")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def model_from_parameters(
|
|
66
|
+
project: str,
|
|
67
|
+
name: str,
|
|
68
|
+
kind: str,
|
|
69
|
+
uuid: str | None = None,
|
|
70
|
+
description: str | None = None,
|
|
71
|
+
labels: list[str] | None = None,
|
|
72
|
+
embedded: bool = True,
|
|
73
|
+
path: str | None = None,
|
|
74
|
+
**kwargs,
|
|
75
|
+
) -> Model:
|
|
76
|
+
"""
|
|
77
|
+
Create a new object.
|
|
78
|
+
|
|
79
|
+
Parameters
|
|
80
|
+
----------
|
|
81
|
+
project : str
|
|
82
|
+
Project name.
|
|
83
|
+
name : str
|
|
84
|
+
Object name.
|
|
85
|
+
kind : str
|
|
86
|
+
Kind the object.
|
|
87
|
+
uuid : str
|
|
88
|
+
ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
|
|
89
|
+
labels : list[str]
|
|
90
|
+
List of labels.
|
|
91
|
+
description : str
|
|
92
|
+
Description of the object (human readable).
|
|
93
|
+
embedded : bool
|
|
94
|
+
Flag to determine if object spec must be embedded in project spec.
|
|
95
|
+
path : str
|
|
96
|
+
Object path on local file system or remote storage. It is also the destination path of upload() method.
|
|
97
|
+
**kwargs : dict
|
|
98
|
+
Spec keyword arguments.
|
|
99
|
+
|
|
100
|
+
Returns
|
|
101
|
+
-------
|
|
102
|
+
Model
|
|
103
|
+
Object instance.
|
|
104
|
+
"""
|
|
105
|
+
if path is None:
|
|
106
|
+
raise EntityError("Path must be provided.")
|
|
107
|
+
name = build_name(name)
|
|
108
|
+
uuid = build_uuid(uuid)
|
|
109
|
+
metadata = build_metadata(
|
|
110
|
+
kind,
|
|
111
|
+
project=project,
|
|
112
|
+
name=name,
|
|
113
|
+
version=uuid,
|
|
114
|
+
description=description,
|
|
115
|
+
labels=labels,
|
|
116
|
+
embedded=embedded,
|
|
117
|
+
)
|
|
118
|
+
spec = build_spec(
|
|
119
|
+
kind,
|
|
120
|
+
path=path,
|
|
121
|
+
**kwargs,
|
|
122
|
+
)
|
|
123
|
+
status = build_status(kind)
|
|
124
|
+
cls = _choose_model_type(kind)
|
|
125
|
+
return cls(
|
|
126
|
+
project=project,
|
|
127
|
+
name=name,
|
|
128
|
+
uuid=uuid,
|
|
129
|
+
kind=kind,
|
|
130
|
+
metadata=metadata,
|
|
131
|
+
spec=spec,
|
|
132
|
+
status=status,
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def model_from_dict(obj: dict) -> Model:
|
|
137
|
+
"""
|
|
138
|
+
Create a new object from dictionary.
|
|
139
|
+
|
|
140
|
+
Parameters
|
|
141
|
+
----------
|
|
142
|
+
obj : dict
|
|
143
|
+
Dictionary to create object from.
|
|
144
|
+
|
|
145
|
+
Returns
|
|
146
|
+
-------
|
|
147
|
+
Model
|
|
148
|
+
Object instance.
|
|
149
|
+
"""
|
|
150
|
+
kind = obj.get("kind")
|
|
151
|
+
cls = _choose_model_type(kind)
|
|
152
|
+
return cls.from_dict(obj)
|
|
@@ -2,20 +2,22 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import typing
|
|
4
4
|
|
|
5
|
+
from digitalhub.context.builder import check_context
|
|
5
6
|
from digitalhub.entities._base.crud import (
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
list_material_entities,
|
|
11
|
-
new_context_entity,
|
|
7
|
+
delete_entity_api_ctx,
|
|
8
|
+
list_entity_api_ctx,
|
|
9
|
+
read_entity_api_ctx,
|
|
10
|
+
read_entity_api_ctx_versions,
|
|
12
11
|
)
|
|
13
|
-
from digitalhub.entities.
|
|
14
|
-
from digitalhub.entities.
|
|
15
|
-
from digitalhub.entities.
|
|
12
|
+
from digitalhub.entities._builders.uuid import build_uuid
|
|
13
|
+
from digitalhub.entities.entity_types import EntityTypes
|
|
14
|
+
from digitalhub.entities.model.builder import model_from_dict, model_from_parameters
|
|
15
|
+
from digitalhub.entities.utils import build_log_path_from_source, eval_local_source
|
|
16
|
+
from digitalhub.utils.exceptions import EntityAlreadyExistsError
|
|
17
|
+
from digitalhub.utils.io_utils import read_yaml
|
|
16
18
|
|
|
17
19
|
if typing.TYPE_CHECKING:
|
|
18
|
-
from digitalhub.entities.model._base
|
|
20
|
+
from digitalhub.entities.model.entity._base import Model
|
|
19
21
|
|
|
20
22
|
|
|
21
23
|
ENTITY_TYPE = EntityTypes.MODEL.value
|
|
@@ -28,7 +30,7 @@ def new_model(
|
|
|
28
30
|
uuid: str | None = None,
|
|
29
31
|
description: str | None = None,
|
|
30
32
|
labels: list[str] | None = None,
|
|
31
|
-
embedded: bool =
|
|
33
|
+
embedded: bool = True,
|
|
32
34
|
path: str | None = None,
|
|
33
35
|
**kwargs,
|
|
34
36
|
) -> Model:
|
|
@@ -44,7 +46,7 @@ def new_model(
|
|
|
44
46
|
kind : str
|
|
45
47
|
Kind the object.
|
|
46
48
|
uuid : str
|
|
47
|
-
ID of the object.
|
|
49
|
+
ID of the object (UUID4, e.g. 40f25c4b-d26b-4221-b048-9527aff291e2).
|
|
48
50
|
description : str
|
|
49
51
|
Description of the object (human readable).
|
|
50
52
|
labels : list[str]
|
|
@@ -68,7 +70,8 @@ def new_model(
|
|
|
68
70
|
>>> kind="model",
|
|
69
71
|
>>> path="s3://my-bucket/my-key")
|
|
70
72
|
"""
|
|
71
|
-
|
|
73
|
+
check_context(project)
|
|
74
|
+
obj = model_from_parameters(
|
|
72
75
|
project=project,
|
|
73
76
|
name=name,
|
|
74
77
|
kind=kind,
|
|
@@ -79,6 +82,8 @@ def new_model(
|
|
|
79
82
|
path=path,
|
|
80
83
|
**kwargs,
|
|
81
84
|
)
|
|
85
|
+
obj.save()
|
|
86
|
+
return obj
|
|
82
87
|
|
|
83
88
|
|
|
84
89
|
def log_model(
|
|
@@ -166,13 +171,16 @@ def get_model(
|
|
|
166
171
|
>>> project="my-project",
|
|
167
172
|
>>> entity_id="my-model-id")
|
|
168
173
|
"""
|
|
169
|
-
|
|
170
|
-
identifier
|
|
171
|
-
|
|
174
|
+
obj = read_entity_api_ctx(
|
|
175
|
+
identifier,
|
|
176
|
+
ENTITY_TYPE,
|
|
172
177
|
project=project,
|
|
173
178
|
entity_id=entity_id,
|
|
174
179
|
**kwargs,
|
|
175
180
|
)
|
|
181
|
+
entity = model_from_dict(obj)
|
|
182
|
+
entity._get_files_info()
|
|
183
|
+
return entity
|
|
176
184
|
|
|
177
185
|
|
|
178
186
|
def get_model_versions(
|
|
@@ -206,12 +214,18 @@ def get_model_versions(
|
|
|
206
214
|
>>> objs = get_model_versions("my-model-name",
|
|
207
215
|
>>> project="my-project")
|
|
208
216
|
"""
|
|
209
|
-
|
|
210
|
-
identifier
|
|
217
|
+
objs = read_entity_api_ctx_versions(
|
|
218
|
+
identifier,
|
|
211
219
|
entity_type=ENTITY_TYPE,
|
|
212
220
|
project=project,
|
|
213
221
|
**kwargs,
|
|
214
222
|
)
|
|
223
|
+
objects = []
|
|
224
|
+
for o in objs:
|
|
225
|
+
entity = model_from_dict(o)
|
|
226
|
+
entity._get_files_info()
|
|
227
|
+
objects.append(entity)
|
|
228
|
+
return objects
|
|
215
229
|
|
|
216
230
|
|
|
217
231
|
def list_models(project: str, **kwargs) -> list[Model]:
|
|
@@ -234,11 +248,17 @@ def list_models(project: str, **kwargs) -> list[Model]:
|
|
|
234
248
|
--------
|
|
235
249
|
>>> objs = list_models(project="my-project")
|
|
236
250
|
"""
|
|
237
|
-
|
|
251
|
+
objs = list_entity_api_ctx(
|
|
238
252
|
project=project,
|
|
239
253
|
entity_type=ENTITY_TYPE,
|
|
240
254
|
**kwargs,
|
|
241
255
|
)
|
|
256
|
+
objects = []
|
|
257
|
+
for o in objs:
|
|
258
|
+
entity = model_from_dict(o)
|
|
259
|
+
entity._get_files_info()
|
|
260
|
+
objects.append(entity)
|
|
261
|
+
return objects
|
|
242
262
|
|
|
243
263
|
|
|
244
264
|
def import_model(file: str) -> Model:
|
|
@@ -259,7 +279,14 @@ def import_model(file: str) -> Model:
|
|
|
259
279
|
--------
|
|
260
280
|
>>> obj = import_model("my-model.yaml")
|
|
261
281
|
"""
|
|
262
|
-
|
|
282
|
+
dict_obj: dict = read_yaml(file)
|
|
283
|
+
obj = model_from_dict(dict_obj)
|
|
284
|
+
try:
|
|
285
|
+
obj.save()
|
|
286
|
+
except EntityAlreadyExistsError:
|
|
287
|
+
pass
|
|
288
|
+
finally:
|
|
289
|
+
return obj
|
|
263
290
|
|
|
264
291
|
|
|
265
292
|
def update_model(entity: Model) -> Model:
|
|
@@ -321,7 +348,7 @@ def delete_model(
|
|
|
321
348
|
>>> project="my-project",
|
|
322
349
|
>>> delete_all_versions=True)
|
|
323
350
|
"""
|
|
324
|
-
return
|
|
351
|
+
return delete_entity_api_ctx(
|
|
325
352
|
identifier=identifier,
|
|
326
353
|
entity_type=ENTITY_TYPE,
|
|
327
354
|
project=project,
|
|
@@ -2,13 +2,13 @@ from __future__ import annotations
|
|
|
2
2
|
|
|
3
3
|
import typing
|
|
4
4
|
|
|
5
|
-
from digitalhub.entities._base.material
|
|
6
|
-
from digitalhub.entities.
|
|
5
|
+
from digitalhub.entities._base.entity.material import MaterialEntity
|
|
6
|
+
from digitalhub.entities.entity_types import EntityTypes
|
|
7
7
|
|
|
8
8
|
if typing.TYPE_CHECKING:
|
|
9
|
-
from digitalhub.entities._base.
|
|
10
|
-
from digitalhub.entities.model.
|
|
11
|
-
from digitalhub.entities.model.
|
|
9
|
+
from digitalhub.entities._base.metadata import Metadata
|
|
10
|
+
from digitalhub.entities.model.spec import ModelSpec
|
|
11
|
+
from digitalhub.entities.model.status import ModelStatus
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class Model(MaterialEntity):
|
|
@@ -1,8 +1,17 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
1
3
|
from urllib.parse import urlparse
|
|
2
4
|
|
|
3
5
|
import mlflow
|
|
4
6
|
|
|
5
|
-
from digitalhub.entities.model.
|
|
7
|
+
from digitalhub.entities.model.entity._base import Model
|
|
8
|
+
from digitalhub.entities.model.models import Dataset, Signature
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class ModelMlflow(Model):
|
|
12
|
+
"""
|
|
13
|
+
Mlflow model.
|
|
14
|
+
"""
|
|
6
15
|
|
|
7
16
|
|
|
8
17
|
def from_mlflow_run(run_id: str) -> dict:
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities._base.spec.material import MaterialParams, MaterialSpec
|
|
4
|
+
from digitalhub.entities.model.models import Dataset, Signature
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ModelSpec(MaterialSpec):
|
|
8
|
+
"""
|
|
9
|
+
Model specifications.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
def __init__(
|
|
13
|
+
self,
|
|
14
|
+
path: str,
|
|
15
|
+
framework: str | None = None,
|
|
16
|
+
algorithm: str | None = None,
|
|
17
|
+
base_model: str | None = None,
|
|
18
|
+
parameters: dict | None = None,
|
|
19
|
+
metrics: dict | None = None,
|
|
20
|
+
) -> None:
|
|
21
|
+
self.path = path
|
|
22
|
+
self.framework = framework
|
|
23
|
+
self.algorithm = algorithm
|
|
24
|
+
self.base_model = base_model
|
|
25
|
+
self.parameters = parameters
|
|
26
|
+
self.metrics = metrics
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class ModelParams(MaterialParams):
|
|
30
|
+
"""
|
|
31
|
+
Model parameters.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
path: str
|
|
35
|
+
"""Path to the model."""
|
|
36
|
+
|
|
37
|
+
framework: str = None
|
|
38
|
+
"""Model framework (e.g. 'pytorch')."""
|
|
39
|
+
|
|
40
|
+
algorithm: str = None
|
|
41
|
+
"""Model algorithm (e.g. 'resnet')."""
|
|
42
|
+
|
|
43
|
+
base_model: str = None
|
|
44
|
+
"""Base model."""
|
|
45
|
+
|
|
46
|
+
parameters: dict = None
|
|
47
|
+
"""Model parameters."""
|
|
48
|
+
|
|
49
|
+
metrics: dict = None
|
|
50
|
+
"""Model metrics."""
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class ModelSpecModel(ModelSpec):
|
|
54
|
+
"""
|
|
55
|
+
Model specifications.
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class ModelParamsModel(ModelParams):
|
|
60
|
+
"""
|
|
61
|
+
Model parameters.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class ModelSpecMlflow(ModelSpec):
|
|
66
|
+
"""
|
|
67
|
+
Mlflow model specifications.
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
def __init__(
|
|
71
|
+
self,
|
|
72
|
+
path: str,
|
|
73
|
+
framework: str | None = None,
|
|
74
|
+
algorithm: str | None = None,
|
|
75
|
+
base_model: str | None = None,
|
|
76
|
+
parameters: dict | None = None,
|
|
77
|
+
metrics: dict | None = None,
|
|
78
|
+
flavor: str | None = None,
|
|
79
|
+
model_config: dict | None = None,
|
|
80
|
+
input_datasets: list[Dataset] | None = None,
|
|
81
|
+
signature: Signature = None,
|
|
82
|
+
) -> None:
|
|
83
|
+
super().__init__(path, framework, algorithm, base_model, parameters, metrics)
|
|
84
|
+
self.flavor = flavor
|
|
85
|
+
self.model_config = model_config
|
|
86
|
+
self.input_datasets = input_datasets
|
|
87
|
+
self.signature = signature
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class ModelParamsMlflow(ModelParams):
|
|
91
|
+
"""
|
|
92
|
+
Mlflow model parameters.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
flavor: str = None
|
|
96
|
+
"""Mlflow model flavor."""
|
|
97
|
+
model_config: dict = None
|
|
98
|
+
"""Mlflow model config."""
|
|
99
|
+
input_datasets: list[Dataset] = None
|
|
100
|
+
"""Mlflow input datasets."""
|
|
101
|
+
signature: Signature = None
|
|
102
|
+
"""Mlflow model signature."""
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
class ModelSpecSklearn(ModelSpec):
|
|
106
|
+
"""
|
|
107
|
+
SKLearn model specifications.
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class ModelParamsSklearn(ModelParams):
|
|
112
|
+
"""
|
|
113
|
+
SKLearn model parameters.
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
class ModelSpecHuggingface(ModelSpec):
|
|
118
|
+
"""
|
|
119
|
+
Huggingface model specifications.
|
|
120
|
+
"""
|
|
121
|
+
|
|
122
|
+
def __init__(
|
|
123
|
+
self,
|
|
124
|
+
path: str,
|
|
125
|
+
framework: str | None = None,
|
|
126
|
+
algorithm: str | None = None,
|
|
127
|
+
base_model: str | None = None,
|
|
128
|
+
parameters: dict | None = None,
|
|
129
|
+
metrics: dict | None = None,
|
|
130
|
+
model_id: str | None = None,
|
|
131
|
+
model_revision: str = None,
|
|
132
|
+
) -> None:
|
|
133
|
+
super().__init__(path, framework, algorithm, base_model, parameters, metrics)
|
|
134
|
+
self.model_id = model_id
|
|
135
|
+
self.model_revision = model_revision
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class ModelParamsHuggingface(ModelParams):
|
|
139
|
+
"""
|
|
140
|
+
Huggingface model parameters.
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
model_id: str = None
|
|
144
|
+
"""Huggingface model id. Optional. If not specified, the model is loaded from the model path"""
|
|
145
|
+
model_revision: str = None
|
|
146
|
+
"""Huggingface model revision. Optional."""
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities._base.status.material import MaterialStatus
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ModelStatus(MaterialStatus):
|
|
7
|
+
"""
|
|
8
|
+
Status class for model entities.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ModelStatusModel(ModelStatus):
|
|
13
|
+
"""
|
|
14
|
+
Status class for model entities.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ModelStatusMlflow(ModelStatus):
|
|
19
|
+
"""
|
|
20
|
+
Status class for model entities.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class ModelStatusSklearn(ModelStatus):
|
|
25
|
+
"""
|
|
26
|
+
Status class for model entities.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class ModelStatusHuggingface(ModelStatus):
|
|
31
|
+
"""
|
|
32
|
+
Status class for model entities.
|
|
33
|
+
"""
|