digitalhub 0.7.0b2__py3-none-any.whl → 0.8.0__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 +63 -93
- digitalhub/client/__init__.py +0 -0
- digitalhub/client/_base/__init__.py +0 -0
- digitalhub/client/_base/client.py +56 -0
- digitalhub/client/api.py +63 -0
- digitalhub/client/builder.py +50 -0
- digitalhub/client/dhcore/__init__.py +0 -0
- digitalhub/client/dhcore/client.py +669 -0
- digitalhub/client/dhcore/env.py +21 -0
- digitalhub/client/dhcore/models.py +46 -0
- digitalhub/client/dhcore/utils.py +111 -0
- digitalhub/client/local/__init__.py +0 -0
- digitalhub/client/local/client.py +533 -0
- digitalhub/context/__init__.py +0 -0
- digitalhub/context/api.py +93 -0
- digitalhub/context/builder.py +94 -0
- digitalhub/context/context.py +136 -0
- digitalhub/datastores/__init__.py +0 -0
- digitalhub/datastores/_base/__init__.py +0 -0
- digitalhub/datastores/_base/datastore.py +85 -0
- digitalhub/datastores/api.py +37 -0
- digitalhub/datastores/builder.py +110 -0
- digitalhub/datastores/local/__init__.py +0 -0
- digitalhub/datastores/local/datastore.py +50 -0
- digitalhub/datastores/remote/__init__.py +0 -0
- digitalhub/datastores/remote/datastore.py +31 -0
- digitalhub/datastores/s3/__init__.py +0 -0
- digitalhub/datastores/s3/datastore.py +46 -0
- digitalhub/datastores/sql/__init__.py +0 -0
- digitalhub/datastores/sql/datastore.py +68 -0
- digitalhub/entities/__init__.py +0 -0
- digitalhub/entities/_base/__init__.py +0 -0
- digitalhub/entities/_base/_base/__init__.py +0 -0
- digitalhub/entities/_base/_base/entity.py +82 -0
- digitalhub/entities/_base/api_utils.py +620 -0
- digitalhub/entities/_base/context/__init__.py +0 -0
- digitalhub/entities/_base/context/entity.py +118 -0
- digitalhub/entities/_base/crud.py +468 -0
- digitalhub/entities/_base/entity/__init__.py +0 -0
- digitalhub/entities/_base/entity/_constructors/__init__.py +0 -0
- digitalhub/entities/_base/entity/_constructors/metadata.py +44 -0
- digitalhub/entities/_base/entity/_constructors/name.py +31 -0
- digitalhub/entities/_base/entity/_constructors/spec.py +33 -0
- digitalhub/entities/_base/entity/_constructors/status.py +52 -0
- digitalhub/entities/_base/entity/_constructors/uuid.py +26 -0
- digitalhub/entities/_base/entity/builder.py +175 -0
- digitalhub/entities/_base/entity/entity.py +106 -0
- digitalhub/entities/_base/entity/metadata.py +59 -0
- digitalhub/entities/_base/entity/spec.py +58 -0
- digitalhub/entities/_base/entity/status.py +43 -0
- digitalhub/entities/_base/executable/__init__.py +0 -0
- digitalhub/entities/_base/executable/entity.py +405 -0
- digitalhub/entities/_base/material/__init__.py +0 -0
- digitalhub/entities/_base/material/entity.py +214 -0
- digitalhub/entities/_base/material/spec.py +22 -0
- digitalhub/entities/_base/material/status.py +49 -0
- digitalhub/entities/_base/runtime_entity/__init__.py +0 -0
- digitalhub/entities/_base/runtime_entity/builder.py +106 -0
- digitalhub/entities/_base/unversioned/__init__.py +0 -0
- digitalhub/entities/_base/unversioned/builder.py +66 -0
- digitalhub/entities/_base/unversioned/entity.py +49 -0
- digitalhub/entities/_base/versioned/__init__.py +0 -0
- digitalhub/entities/_base/versioned/builder.py +68 -0
- digitalhub/entities/_base/versioned/entity.py +53 -0
- digitalhub/entities/artifact/__init__.py +0 -0
- digitalhub/entities/artifact/_base/__init__.py +0 -0
- digitalhub/entities/artifact/_base/builder.py +86 -0
- digitalhub/entities/artifact/_base/entity.py +39 -0
- digitalhub/entities/artifact/_base/spec.py +15 -0
- digitalhub/entities/artifact/_base/status.py +9 -0
- digitalhub/entities/artifact/artifact/__init__.py +0 -0
- digitalhub/entities/artifact/artifact/builder.py +18 -0
- digitalhub/entities/artifact/artifact/entity.py +32 -0
- digitalhub/entities/artifact/artifact/spec.py +27 -0
- digitalhub/entities/artifact/artifact/status.py +15 -0
- digitalhub/entities/artifact/crud.py +332 -0
- digitalhub/entities/builders.py +63 -0
- digitalhub/entities/dataitem/__init__.py +0 -0
- digitalhub/entities/dataitem/_base/__init__.py +0 -0
- digitalhub/entities/dataitem/_base/builder.py +86 -0
- digitalhub/entities/dataitem/_base/entity.py +75 -0
- digitalhub/entities/dataitem/_base/spec.py +15 -0
- digitalhub/entities/dataitem/_base/status.py +20 -0
- digitalhub/entities/dataitem/crud.py +372 -0
- digitalhub/entities/dataitem/dataitem/__init__.py +0 -0
- digitalhub/entities/dataitem/dataitem/builder.py +18 -0
- digitalhub/entities/dataitem/dataitem/entity.py +32 -0
- digitalhub/entities/dataitem/dataitem/spec.py +15 -0
- digitalhub/entities/dataitem/dataitem/status.py +9 -0
- digitalhub/entities/dataitem/iceberg/__init__.py +0 -0
- digitalhub/entities/dataitem/iceberg/builder.py +18 -0
- digitalhub/entities/dataitem/iceberg/entity.py +32 -0
- digitalhub/entities/dataitem/iceberg/spec.py +15 -0
- digitalhub/entities/dataitem/iceberg/status.py +9 -0
- digitalhub/entities/dataitem/table/__init__.py +0 -0
- digitalhub/entities/dataitem/table/builder.py +18 -0
- digitalhub/entities/dataitem/table/entity.py +146 -0
- digitalhub/entities/dataitem/table/models.py +62 -0
- digitalhub/entities/dataitem/table/spec.py +25 -0
- digitalhub/entities/dataitem/table/status.py +9 -0
- digitalhub/entities/function/__init__.py +0 -0
- digitalhub/entities/function/_base/__init__.py +0 -0
- digitalhub/entities/function/_base/builder.py +79 -0
- digitalhub/entities/function/_base/entity.py +98 -0
- digitalhub/entities/function/_base/models.py +118 -0
- digitalhub/entities/function/_base/spec.py +15 -0
- digitalhub/entities/function/_base/status.py +9 -0
- digitalhub/entities/function/crud.py +279 -0
- digitalhub/entities/model/__init__.py +0 -0
- digitalhub/entities/model/_base/__init__.py +0 -0
- digitalhub/entities/model/_base/builder.py +86 -0
- digitalhub/entities/model/_base/entity.py +34 -0
- digitalhub/entities/model/_base/spec.py +49 -0
- digitalhub/entities/model/_base/status.py +9 -0
- digitalhub/entities/model/crud.py +331 -0
- digitalhub/entities/model/huggingface/__init__.py +0 -0
- digitalhub/entities/model/huggingface/builder.py +18 -0
- digitalhub/entities/model/huggingface/entity.py +32 -0
- digitalhub/entities/model/huggingface/spec.py +36 -0
- digitalhub/entities/model/huggingface/status.py +9 -0
- digitalhub/entities/model/mlflow/__init__.py +0 -0
- digitalhub/entities/model/mlflow/builder.py +18 -0
- digitalhub/entities/model/mlflow/entity.py +32 -0
- digitalhub/entities/model/mlflow/models.py +26 -0
- digitalhub/entities/model/mlflow/spec.py +44 -0
- digitalhub/entities/model/mlflow/status.py +9 -0
- digitalhub/entities/model/mlflow/utils.py +81 -0
- digitalhub/entities/model/model/__init__.py +0 -0
- digitalhub/entities/model/model/builder.py +18 -0
- digitalhub/entities/model/model/entity.py +32 -0
- digitalhub/entities/model/model/spec.py +15 -0
- digitalhub/entities/model/model/status.py +9 -0
- digitalhub/entities/model/sklearn/__init__.py +0 -0
- digitalhub/entities/model/sklearn/builder.py +18 -0
- digitalhub/entities/model/sklearn/entity.py +32 -0
- digitalhub/entities/model/sklearn/spec.py +15 -0
- digitalhub/entities/model/sklearn/status.py +9 -0
- digitalhub/entities/project/__init__.py +0 -0
- digitalhub/entities/project/_base/__init__.py +0 -0
- digitalhub/entities/project/_base/builder.py +128 -0
- digitalhub/entities/project/_base/entity.py +2078 -0
- digitalhub/entities/project/_base/spec.py +50 -0
- digitalhub/entities/project/_base/status.py +9 -0
- digitalhub/entities/project/crud.py +357 -0
- digitalhub/entities/run/__init__.py +0 -0
- digitalhub/entities/run/_base/__init__.py +0 -0
- digitalhub/entities/run/_base/builder.py +94 -0
- digitalhub/entities/run/_base/entity.py +307 -0
- digitalhub/entities/run/_base/spec.py +50 -0
- digitalhub/entities/run/_base/status.py +9 -0
- digitalhub/entities/run/crud.py +219 -0
- digitalhub/entities/secret/__init__.py +0 -0
- digitalhub/entities/secret/_base/__init__.py +0 -0
- digitalhub/entities/secret/_base/builder.py +81 -0
- digitalhub/entities/secret/_base/entity.py +74 -0
- digitalhub/entities/secret/_base/spec.py +35 -0
- digitalhub/entities/secret/_base/status.py +9 -0
- digitalhub/entities/secret/crud.py +290 -0
- digitalhub/entities/task/__init__.py +0 -0
- digitalhub/entities/task/_base/__init__.py +0 -0
- digitalhub/entities/task/_base/builder.py +91 -0
- digitalhub/entities/task/_base/entity.py +136 -0
- digitalhub/entities/task/_base/models.py +208 -0
- digitalhub/entities/task/_base/spec.py +53 -0
- digitalhub/entities/task/_base/status.py +9 -0
- digitalhub/entities/task/crud.py +228 -0
- digitalhub/entities/utils/__init__.py +0 -0
- digitalhub/entities/utils/api.py +346 -0
- digitalhub/entities/utils/entity_types.py +19 -0
- digitalhub/entities/utils/state.py +31 -0
- digitalhub/entities/utils/utils.py +202 -0
- digitalhub/entities/workflow/__init__.py +0 -0
- digitalhub/entities/workflow/_base/__init__.py +0 -0
- digitalhub/entities/workflow/_base/builder.py +79 -0
- digitalhub/entities/workflow/_base/entity.py +74 -0
- digitalhub/entities/workflow/_base/spec.py +15 -0
- digitalhub/entities/workflow/_base/status.py +9 -0
- digitalhub/entities/workflow/crud.py +278 -0
- digitalhub/factory/__init__.py +0 -0
- digitalhub/factory/api.py +277 -0
- digitalhub/factory/factory.py +268 -0
- digitalhub/factory/utils.py +90 -0
- digitalhub/readers/__init__.py +0 -0
- digitalhub/readers/_base/__init__.py +0 -0
- digitalhub/readers/_base/builder.py +26 -0
- digitalhub/readers/_base/reader.py +70 -0
- digitalhub/readers/api.py +80 -0
- digitalhub/readers/factory.py +133 -0
- digitalhub/readers/pandas/__init__.py +0 -0
- digitalhub/readers/pandas/builder.py +29 -0
- digitalhub/readers/pandas/reader.py +207 -0
- digitalhub/runtimes/__init__.py +0 -0
- digitalhub/runtimes/_base.py +102 -0
- digitalhub/runtimes/builder.py +32 -0
- digitalhub/stores/__init__.py +0 -0
- digitalhub/stores/_base/__init__.py +0 -0
- digitalhub/stores/_base/store.py +189 -0
- digitalhub/stores/api.py +54 -0
- digitalhub/stores/builder.py +211 -0
- digitalhub/stores/local/__init__.py +0 -0
- digitalhub/stores/local/store.py +230 -0
- digitalhub/stores/remote/__init__.py +0 -0
- digitalhub/stores/remote/store.py +143 -0
- digitalhub/stores/s3/__init__.py +0 -0
- digitalhub/stores/s3/store.py +563 -0
- digitalhub/stores/sql/__init__.py +0 -0
- digitalhub/stores/sql/store.py +328 -0
- digitalhub/utils/__init__.py +0 -0
- digitalhub/utils/data_utils.py +127 -0
- digitalhub/utils/exceptions.py +67 -0
- digitalhub/utils/file_utils.py +204 -0
- digitalhub/utils/generic_utils.py +183 -0
- digitalhub/utils/git_utils.py +148 -0
- digitalhub/utils/io_utils.py +116 -0
- digitalhub/utils/logger.py +17 -0
- digitalhub/utils/s3_utils.py +58 -0
- digitalhub/utils/uri_utils.py +56 -0
- {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/METADATA +30 -13
- digitalhub-0.8.0.dist-info/RECORD +231 -0
- {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/WHEEL +1 -1
- test/local/CRUD/test_artifacts.py +96 -0
- test/local/CRUD/test_dataitems.py +96 -0
- test/local/CRUD/test_models.py +95 -0
- test/test_crud_functions.py +1 -1
- test/test_crud_runs.py +1 -1
- test/test_crud_tasks.py +1 -1
- digitalhub-0.7.0b2.dist-info/RECORD +0 -14
- test/test_crud_artifacts.py +0 -96
- test/test_crud_dataitems.py +0 -96
- {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/LICENSE.txt +0 -0
- {digitalhub-0.7.0b2.dist-info → digitalhub-0.8.0.dist-info}/top_level.txt +0 -0
- /test/{test_imports.py → local/imports/test_imports.py} +0 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities._base.versioned.builder import VersionedBuilder
|
|
6
|
+
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
7
|
+
from digitalhub.utils.exceptions import EntityError
|
|
8
|
+
|
|
9
|
+
if typing.TYPE_CHECKING:
|
|
10
|
+
from digitalhub.entities.model._base.entity import Model
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ModelBuilder(VersionedBuilder):
|
|
14
|
+
"""
|
|
15
|
+
Model builder.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
ENTITY_TYPE = EntityTypes.MODEL.value
|
|
19
|
+
|
|
20
|
+
def build(
|
|
21
|
+
self,
|
|
22
|
+
kind: str,
|
|
23
|
+
project: str,
|
|
24
|
+
name: str,
|
|
25
|
+
uuid: str | None = None,
|
|
26
|
+
description: str | None = None,
|
|
27
|
+
labels: list[str] | None = None,
|
|
28
|
+
embedded: bool = False,
|
|
29
|
+
path: str | None = None,
|
|
30
|
+
**kwargs,
|
|
31
|
+
) -> Model:
|
|
32
|
+
"""
|
|
33
|
+
Create a new object.
|
|
34
|
+
|
|
35
|
+
Parameters
|
|
36
|
+
----------
|
|
37
|
+
project : str
|
|
38
|
+
Project name.
|
|
39
|
+
name : str
|
|
40
|
+
Object name.
|
|
41
|
+
kind : str
|
|
42
|
+
Kind the object.
|
|
43
|
+
uuid : str
|
|
44
|
+
ID of the object.
|
|
45
|
+
description : str
|
|
46
|
+
Description of the object (human readable).
|
|
47
|
+
labels : list[str]
|
|
48
|
+
List of labels.
|
|
49
|
+
embedded : bool
|
|
50
|
+
Flag to determine if object spec must be embedded in project spec.
|
|
51
|
+
path : str
|
|
52
|
+
Object path on local file system or remote storage. It is also the destination path of upload() method.
|
|
53
|
+
**kwargs : dict
|
|
54
|
+
Spec keyword arguments.
|
|
55
|
+
|
|
56
|
+
Returns
|
|
57
|
+
-------
|
|
58
|
+
Model
|
|
59
|
+
Object instance.
|
|
60
|
+
"""
|
|
61
|
+
if path is None:
|
|
62
|
+
raise EntityError("Path must be provided.")
|
|
63
|
+
|
|
64
|
+
name = self.build_name(name)
|
|
65
|
+
uuid = self.build_uuid(uuid)
|
|
66
|
+
metadata = self.build_metadata(
|
|
67
|
+
project=project,
|
|
68
|
+
name=name,
|
|
69
|
+
description=description,
|
|
70
|
+
labels=labels,
|
|
71
|
+
embedded=embedded,
|
|
72
|
+
)
|
|
73
|
+
spec = self.build_spec(
|
|
74
|
+
path=path,
|
|
75
|
+
**kwargs,
|
|
76
|
+
)
|
|
77
|
+
status = self.build_status()
|
|
78
|
+
return self.build_entity(
|
|
79
|
+
project=project,
|
|
80
|
+
name=name,
|
|
81
|
+
uuid=uuid,
|
|
82
|
+
kind=kind,
|
|
83
|
+
metadata=metadata,
|
|
84
|
+
spec=spec,
|
|
85
|
+
status=status,
|
|
86
|
+
)
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities._base.material.entity import MaterialEntity
|
|
6
|
+
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
7
|
+
|
|
8
|
+
if typing.TYPE_CHECKING:
|
|
9
|
+
from digitalhub.entities._base.entity.metadata import Metadata
|
|
10
|
+
from digitalhub.entities.model._base.spec import ModelSpec
|
|
11
|
+
from digitalhub.entities.model._base.status import ModelStatus
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Model(MaterialEntity):
|
|
15
|
+
"""
|
|
16
|
+
A class representing a model.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
ENTITY_TYPE = EntityTypes.MODEL.value
|
|
20
|
+
|
|
21
|
+
def __init__(
|
|
22
|
+
self,
|
|
23
|
+
project: str,
|
|
24
|
+
name: str,
|
|
25
|
+
uuid: str,
|
|
26
|
+
kind: str,
|
|
27
|
+
metadata: Metadata,
|
|
28
|
+
spec: ModelSpec,
|
|
29
|
+
status: ModelStatus,
|
|
30
|
+
user: str | None = None,
|
|
31
|
+
) -> None:
|
|
32
|
+
super().__init__(project, name, uuid, kind, metadata, spec, status, user)
|
|
33
|
+
self.spec: ModelSpec
|
|
34
|
+
self.status: ModelStatus
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities._base.material.spec import MaterialSpec, MaterialValidator
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ModelSpec(MaterialSpec):
|
|
7
|
+
"""
|
|
8
|
+
ModelSpec specifications.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def __init__(
|
|
12
|
+
self,
|
|
13
|
+
path: str,
|
|
14
|
+
framework: str | None = None,
|
|
15
|
+
algorithm: str | None = None,
|
|
16
|
+
base_model: str | None = None,
|
|
17
|
+
parameters: dict | None = None,
|
|
18
|
+
metrics: dict | None = None,
|
|
19
|
+
) -> None:
|
|
20
|
+
self.path = path
|
|
21
|
+
self.framework = framework
|
|
22
|
+
self.algorithm = algorithm
|
|
23
|
+
self.base_model = base_model
|
|
24
|
+
self.parameters = parameters
|
|
25
|
+
self.metrics = metrics
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class ModelValidator(MaterialValidator):
|
|
29
|
+
"""
|
|
30
|
+
ModelValidator validator.
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
path: str
|
|
34
|
+
"""Path to the model."""
|
|
35
|
+
|
|
36
|
+
framework: str = None
|
|
37
|
+
"""Model framework (e.g. 'pytorch')."""
|
|
38
|
+
|
|
39
|
+
algorithm: str = None
|
|
40
|
+
"""Model algorithm (e.g. 'resnet')."""
|
|
41
|
+
|
|
42
|
+
base_model: str = None
|
|
43
|
+
"""Base model."""
|
|
44
|
+
|
|
45
|
+
parameters: dict = None
|
|
46
|
+
"""Model validator."""
|
|
47
|
+
|
|
48
|
+
metrics: dict = None
|
|
49
|
+
"""Model metrics."""
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities._base.crud import (
|
|
6
|
+
delete_entity,
|
|
7
|
+
get_material_entity,
|
|
8
|
+
get_material_entity_versions,
|
|
9
|
+
import_context_entity,
|
|
10
|
+
list_material_entities,
|
|
11
|
+
new_context_entity,
|
|
12
|
+
)
|
|
13
|
+
from digitalhub.entities._base.entity._constructors.uuid import build_uuid
|
|
14
|
+
from digitalhub.entities.utils.entity_types import EntityTypes
|
|
15
|
+
from digitalhub.entities.utils.utils import build_log_path_from_source, eval_local_source
|
|
16
|
+
|
|
17
|
+
if typing.TYPE_CHECKING:
|
|
18
|
+
from digitalhub.entities.model._base.entity import Model
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
ENTITY_TYPE = EntityTypes.MODEL.value
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def new_model(
|
|
25
|
+
project: str,
|
|
26
|
+
name: str,
|
|
27
|
+
kind: str,
|
|
28
|
+
uuid: str | None = None,
|
|
29
|
+
description: str | None = None,
|
|
30
|
+
labels: list[str] | None = None,
|
|
31
|
+
embedded: bool = False,
|
|
32
|
+
path: str | None = None,
|
|
33
|
+
**kwargs,
|
|
34
|
+
) -> Model:
|
|
35
|
+
"""
|
|
36
|
+
Create a new object.
|
|
37
|
+
|
|
38
|
+
Parameters
|
|
39
|
+
----------
|
|
40
|
+
project : str
|
|
41
|
+
Project name.
|
|
42
|
+
name : str
|
|
43
|
+
Object name.
|
|
44
|
+
kind : str
|
|
45
|
+
Kind the object.
|
|
46
|
+
uuid : str
|
|
47
|
+
ID of the object.
|
|
48
|
+
description : str
|
|
49
|
+
Description of the object (human readable).
|
|
50
|
+
labels : list[str]
|
|
51
|
+
List of labels.
|
|
52
|
+
embedded : bool
|
|
53
|
+
Flag to determine if object spec must be embedded in project spec.
|
|
54
|
+
path : str
|
|
55
|
+
Object path on local file system or remote storage. It is also the destination path of upload() method.
|
|
56
|
+
**kwargs : dict
|
|
57
|
+
Spec keyword arguments.
|
|
58
|
+
|
|
59
|
+
Returns
|
|
60
|
+
-------
|
|
61
|
+
Model
|
|
62
|
+
Object instance.
|
|
63
|
+
|
|
64
|
+
Examples
|
|
65
|
+
--------
|
|
66
|
+
>>> obj = new_model(project="my-project",
|
|
67
|
+
>>> name="my-model",
|
|
68
|
+
>>> kind="model",
|
|
69
|
+
>>> path="s3://my-bucket/my-key")
|
|
70
|
+
"""
|
|
71
|
+
return new_context_entity(
|
|
72
|
+
project=project,
|
|
73
|
+
name=name,
|
|
74
|
+
kind=kind,
|
|
75
|
+
uuid=uuid,
|
|
76
|
+
description=description,
|
|
77
|
+
labels=labels,
|
|
78
|
+
embedded=embedded,
|
|
79
|
+
path=path,
|
|
80
|
+
**kwargs,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def log_model(
|
|
85
|
+
project: str,
|
|
86
|
+
name: str,
|
|
87
|
+
kind: str,
|
|
88
|
+
source: list[str] | str,
|
|
89
|
+
path: str | None = None,
|
|
90
|
+
**kwargs,
|
|
91
|
+
) -> Model:
|
|
92
|
+
"""
|
|
93
|
+
Create and upload an object.
|
|
94
|
+
|
|
95
|
+
Parameters
|
|
96
|
+
----------
|
|
97
|
+
project : str
|
|
98
|
+
Project name.
|
|
99
|
+
name : str
|
|
100
|
+
Object name.
|
|
101
|
+
kind : str
|
|
102
|
+
Kind the object.
|
|
103
|
+
source : str
|
|
104
|
+
Model location on local path.
|
|
105
|
+
path : str
|
|
106
|
+
Destination path of the model. If not provided, it's generated.
|
|
107
|
+
**kwargs : dict
|
|
108
|
+
New model spec parameters.
|
|
109
|
+
|
|
110
|
+
Returns
|
|
111
|
+
-------
|
|
112
|
+
Model
|
|
113
|
+
Object instance.
|
|
114
|
+
|
|
115
|
+
Examples
|
|
116
|
+
--------
|
|
117
|
+
>>> obj = log_model(project="my-project",
|
|
118
|
+
>>> name="my-model",
|
|
119
|
+
>>> kind="model",
|
|
120
|
+
>>> source="./local-path")
|
|
121
|
+
"""
|
|
122
|
+
eval_local_source(source)
|
|
123
|
+
|
|
124
|
+
if path is None:
|
|
125
|
+
uuid = build_uuid()
|
|
126
|
+
kwargs["uuid"] = uuid
|
|
127
|
+
path = build_log_path_from_source(project, ENTITY_TYPE, name, uuid, source)
|
|
128
|
+
|
|
129
|
+
obj = new_model(project=project, name=name, kind=kind, path=path, **kwargs)
|
|
130
|
+
obj.upload(source)
|
|
131
|
+
return obj
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def get_model(
|
|
135
|
+
identifier: str,
|
|
136
|
+
project: str | None = None,
|
|
137
|
+
entity_id: str | None = None,
|
|
138
|
+
**kwargs,
|
|
139
|
+
) -> Model:
|
|
140
|
+
"""
|
|
141
|
+
Get object from backend.
|
|
142
|
+
|
|
143
|
+
Parameters
|
|
144
|
+
----------
|
|
145
|
+
identifier : str
|
|
146
|
+
Entity key (store://...) or entity name.
|
|
147
|
+
project : str
|
|
148
|
+
Project name.
|
|
149
|
+
entity_id : str
|
|
150
|
+
Entity ID.
|
|
151
|
+
**kwargs : dict
|
|
152
|
+
Parameters to pass to the API call.
|
|
153
|
+
|
|
154
|
+
Returns
|
|
155
|
+
-------
|
|
156
|
+
Model
|
|
157
|
+
Object instance.
|
|
158
|
+
|
|
159
|
+
Examples
|
|
160
|
+
--------
|
|
161
|
+
Using entity key:
|
|
162
|
+
>>> obj = get_model("store://my-model-key")
|
|
163
|
+
|
|
164
|
+
Using entity name:
|
|
165
|
+
>>> obj = get_model("my-model-name"
|
|
166
|
+
>>> project="my-project",
|
|
167
|
+
>>> entity_id="my-model-id")
|
|
168
|
+
"""
|
|
169
|
+
return get_material_entity(
|
|
170
|
+
identifier=identifier,
|
|
171
|
+
entity_type=ENTITY_TYPE,
|
|
172
|
+
project=project,
|
|
173
|
+
entity_id=entity_id,
|
|
174
|
+
**kwargs,
|
|
175
|
+
)
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def get_model_versions(
|
|
179
|
+
identifier: str,
|
|
180
|
+
project: str | None = None,
|
|
181
|
+
**kwargs,
|
|
182
|
+
) -> list[Model]:
|
|
183
|
+
"""
|
|
184
|
+
Get object versions from backend.
|
|
185
|
+
|
|
186
|
+
Parameters
|
|
187
|
+
----------
|
|
188
|
+
identifier : str
|
|
189
|
+
Entity key (store://...) or entity name.
|
|
190
|
+
project : str
|
|
191
|
+
Project name.
|
|
192
|
+
**kwargs : dict
|
|
193
|
+
Parameters to pass to the API call.
|
|
194
|
+
|
|
195
|
+
Returns
|
|
196
|
+
-------
|
|
197
|
+
list[Model]
|
|
198
|
+
List of object instances.
|
|
199
|
+
|
|
200
|
+
Examples
|
|
201
|
+
--------
|
|
202
|
+
Using entity key:
|
|
203
|
+
>>> objs = get_model_versions("store://my-model-key")
|
|
204
|
+
|
|
205
|
+
Using entity name:
|
|
206
|
+
>>> objs = get_model_versions("my-model-name",
|
|
207
|
+
>>> project="my-project")
|
|
208
|
+
"""
|
|
209
|
+
return get_material_entity_versions(
|
|
210
|
+
identifier=identifier,
|
|
211
|
+
entity_type=ENTITY_TYPE,
|
|
212
|
+
project=project,
|
|
213
|
+
**kwargs,
|
|
214
|
+
)
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def list_models(project: str, **kwargs) -> list[Model]:
|
|
218
|
+
"""
|
|
219
|
+
List all latest version objects from backend.
|
|
220
|
+
|
|
221
|
+
Parameters
|
|
222
|
+
----------
|
|
223
|
+
project : str
|
|
224
|
+
Project name.
|
|
225
|
+
**kwargs : dict
|
|
226
|
+
Parameters to pass to the API call.
|
|
227
|
+
|
|
228
|
+
Returns
|
|
229
|
+
-------
|
|
230
|
+
list[Model]
|
|
231
|
+
List of object instances.
|
|
232
|
+
|
|
233
|
+
Examples
|
|
234
|
+
--------
|
|
235
|
+
>>> objs = list_models(project="my-project")
|
|
236
|
+
"""
|
|
237
|
+
return list_material_entities(
|
|
238
|
+
project=project,
|
|
239
|
+
entity_type=ENTITY_TYPE,
|
|
240
|
+
**kwargs,
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
def import_model(file: str) -> Model:
|
|
245
|
+
"""
|
|
246
|
+
Import object from a YAML file.
|
|
247
|
+
|
|
248
|
+
Parameters
|
|
249
|
+
----------
|
|
250
|
+
file : str
|
|
251
|
+
Path to YAML file.
|
|
252
|
+
|
|
253
|
+
Returns
|
|
254
|
+
-------
|
|
255
|
+
Model
|
|
256
|
+
Object instance.
|
|
257
|
+
|
|
258
|
+
Examples
|
|
259
|
+
--------
|
|
260
|
+
>>> obj = import_model("my-model.yaml")
|
|
261
|
+
"""
|
|
262
|
+
return import_context_entity(file)
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
def update_model(entity: Model) -> Model:
|
|
266
|
+
"""
|
|
267
|
+
Update object. Note that object spec are immutable.
|
|
268
|
+
|
|
269
|
+
Parameters
|
|
270
|
+
----------
|
|
271
|
+
entity : Model
|
|
272
|
+
Object to update.
|
|
273
|
+
|
|
274
|
+
Returns
|
|
275
|
+
-------
|
|
276
|
+
Model
|
|
277
|
+
Entity updated.
|
|
278
|
+
|
|
279
|
+
Examples
|
|
280
|
+
--------
|
|
281
|
+
>>> obj = get_model("store://my-model-key")
|
|
282
|
+
"""
|
|
283
|
+
return entity.save(update=True)
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
def delete_model(
|
|
287
|
+
identifier: str,
|
|
288
|
+
project: str | None = None,
|
|
289
|
+
entity_id: str | None = None,
|
|
290
|
+
delete_all_versions: bool = False,
|
|
291
|
+
**kwargs,
|
|
292
|
+
) -> dict:
|
|
293
|
+
"""
|
|
294
|
+
Delete object from backend.
|
|
295
|
+
|
|
296
|
+
Parameters
|
|
297
|
+
----------
|
|
298
|
+
identifier : str
|
|
299
|
+
Entity key (store://...) or entity name.
|
|
300
|
+
project : str
|
|
301
|
+
Project name.
|
|
302
|
+
entity_id : str
|
|
303
|
+
Entity ID.
|
|
304
|
+
delete_all_versions : bool
|
|
305
|
+
Delete all versions of the named entity. If True, use entity name instead of entity key as identifier.
|
|
306
|
+
**kwargs : dict
|
|
307
|
+
Parameters to pass to the API call.
|
|
308
|
+
|
|
309
|
+
Returns
|
|
310
|
+
-------
|
|
311
|
+
dict
|
|
312
|
+
Response from backend.
|
|
313
|
+
|
|
314
|
+
Examples
|
|
315
|
+
--------
|
|
316
|
+
If delete_all_versions is False:
|
|
317
|
+
>>> obj = delete_model("store://my-model-key")
|
|
318
|
+
|
|
319
|
+
Otherwise:
|
|
320
|
+
>>> obj = delete_model("my-model-name",
|
|
321
|
+
>>> project="my-project",
|
|
322
|
+
>>> delete_all_versions=True)
|
|
323
|
+
"""
|
|
324
|
+
return delete_entity(
|
|
325
|
+
identifier=identifier,
|
|
326
|
+
entity_type=ENTITY_TYPE,
|
|
327
|
+
project=project,
|
|
328
|
+
entity_id=entity_id,
|
|
329
|
+
delete_all_versions=delete_all_versions,
|
|
330
|
+
**kwargs,
|
|
331
|
+
)
|
|
File without changes
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities.model._base.builder import ModelBuilder
|
|
4
|
+
from digitalhub.entities.model.huggingface.entity import ModelHuggingface
|
|
5
|
+
from digitalhub.entities.model.huggingface.spec import ModelSpecHuggingface, ModelValidatorHuggingface
|
|
6
|
+
from digitalhub.entities.model.huggingface.status import ModelStatusHuggingface
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ModelHuggingfaceBuilder(ModelBuilder):
|
|
10
|
+
"""
|
|
11
|
+
ModelHuggingface builder.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
ENTITY_CLASS = ModelHuggingface
|
|
15
|
+
ENTITY_SPEC_CLASS = ModelSpecHuggingface
|
|
16
|
+
ENTITY_SPEC_VALIDATOR = ModelValidatorHuggingface
|
|
17
|
+
ENTITY_STATUS_CLASS = ModelStatusHuggingface
|
|
18
|
+
ENTITY_KIND = "huggingface"
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities.model._base.entity import Model
|
|
6
|
+
|
|
7
|
+
if typing.TYPE_CHECKING:
|
|
8
|
+
from digitalhub.entities._base.entity.metadata import Metadata
|
|
9
|
+
from digitalhub.entities.model.huggingface.spec import ModelSpecHuggingface
|
|
10
|
+
from digitalhub.entities.model.huggingface.status import ModelStatusHuggingface
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ModelHuggingface(Model):
|
|
14
|
+
"""
|
|
15
|
+
ModelHuggingface class.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __init__(
|
|
19
|
+
self,
|
|
20
|
+
project: str,
|
|
21
|
+
name: str,
|
|
22
|
+
uuid: str,
|
|
23
|
+
kind: str,
|
|
24
|
+
metadata: Metadata,
|
|
25
|
+
spec: ModelSpecHuggingface,
|
|
26
|
+
status: ModelStatusHuggingface,
|
|
27
|
+
user: str | None = None,
|
|
28
|
+
) -> None:
|
|
29
|
+
super().__init__(project, name, uuid, kind, metadata, spec, status, user)
|
|
30
|
+
|
|
31
|
+
self.spec: ModelSpecHuggingface
|
|
32
|
+
self.status: ModelStatusHuggingface
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities.model._base.spec import ModelSpec, ModelValidator
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ModelSpecHuggingface(ModelSpec):
|
|
7
|
+
"""
|
|
8
|
+
ModelSpecHuggingface specifications.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
def __init__(
|
|
12
|
+
self,
|
|
13
|
+
path: str,
|
|
14
|
+
framework: str | None = None,
|
|
15
|
+
algorithm: str | None = None,
|
|
16
|
+
base_model: str | None = None,
|
|
17
|
+
parameters: dict | None = None,
|
|
18
|
+
metrics: dict | None = None,
|
|
19
|
+
model_id: str | None = None,
|
|
20
|
+
model_revision: str = None,
|
|
21
|
+
) -> None:
|
|
22
|
+
super().__init__(path, framework, algorithm, base_model, parameters, metrics)
|
|
23
|
+
self.model_id = model_id
|
|
24
|
+
self.model_revision = model_revision
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class ModelValidatorHuggingface(ModelValidator):
|
|
28
|
+
"""
|
|
29
|
+
ModelValidatorHuggingface validator.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
model_id: str = None
|
|
33
|
+
"""Huggingface model id. If not specified, the model is loaded from the model path."""
|
|
34
|
+
|
|
35
|
+
model_revision: str = None
|
|
36
|
+
"""Huggingface model revision."""
|
|
File without changes
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from digitalhub.entities.model._base.builder import ModelBuilder
|
|
4
|
+
from digitalhub.entities.model.mlflow.entity import ModelMlflow
|
|
5
|
+
from digitalhub.entities.model.mlflow.spec import ModelSpecMlflow, ModelValidatorMlflow
|
|
6
|
+
from digitalhub.entities.model.mlflow.status import ModelStatusMlflow
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ModelModelBuilder(ModelBuilder):
|
|
10
|
+
"""
|
|
11
|
+
ModelMlflow builder.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
ENTITY_CLASS = ModelMlflow
|
|
15
|
+
ENTITY_SPEC_CLASS = ModelSpecMlflow
|
|
16
|
+
ENTITY_SPEC_VALIDATOR = ModelValidatorMlflow
|
|
17
|
+
ENTITY_STATUS_CLASS = ModelStatusMlflow
|
|
18
|
+
ENTITY_KIND = "mlflow"
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import typing
|
|
4
|
+
|
|
5
|
+
from digitalhub.entities.model._base.entity import Model
|
|
6
|
+
|
|
7
|
+
if typing.TYPE_CHECKING:
|
|
8
|
+
from digitalhub.entities._base.entity.metadata import Metadata
|
|
9
|
+
from digitalhub.entities.model.mlflow.spec import ModelSpecMlflow
|
|
10
|
+
from digitalhub.entities.model.mlflow.status import ModelStatusMlflow
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class ModelMlflow(Model):
|
|
14
|
+
"""
|
|
15
|
+
ModelMlflow class.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
def __init__(
|
|
19
|
+
self,
|
|
20
|
+
project: str,
|
|
21
|
+
name: str,
|
|
22
|
+
uuid: str,
|
|
23
|
+
kind: str,
|
|
24
|
+
metadata: Metadata,
|
|
25
|
+
spec: ModelSpecMlflow,
|
|
26
|
+
status: ModelStatusMlflow,
|
|
27
|
+
user: str | None = None,
|
|
28
|
+
) -> None:
|
|
29
|
+
super().__init__(project, name, uuid, kind, metadata, spec, status, user)
|
|
30
|
+
|
|
31
|
+
self.spec: ModelSpecMlflow
|
|
32
|
+
self.status: ModelStatusMlflow
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pydantic import BaseModel, Field
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Signature(BaseModel):
|
|
7
|
+
"""
|
|
8
|
+
MLFlow model signature.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
inputs: str = None
|
|
12
|
+
outputs: str = None
|
|
13
|
+
params: str = None
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class Dataset(BaseModel):
|
|
17
|
+
"""
|
|
18
|
+
MLFlow model dataset.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
name: str = None
|
|
22
|
+
digest: str = None
|
|
23
|
+
profile: str = None
|
|
24
|
+
schema_: str = Field(default=None, alias="schema")
|
|
25
|
+
source: str = None
|
|
26
|
+
source_type: str = None
|