dtlpy 1.114.17__py3-none-any.whl → 1.116.6__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.
- dtlpy/__init__.py +491 -491
- dtlpy/__version__.py +1 -1
- dtlpy/assets/__init__.py +26 -26
- dtlpy/assets/code_server/config.yaml +2 -2
- dtlpy/assets/code_server/installation.sh +24 -24
- dtlpy/assets/code_server/launch.json +13 -13
- dtlpy/assets/code_server/settings.json +2 -2
- dtlpy/assets/main.py +53 -53
- dtlpy/assets/main_partial.py +18 -18
- dtlpy/assets/mock.json +11 -11
- dtlpy/assets/model_adapter.py +83 -83
- dtlpy/assets/package.json +61 -61
- dtlpy/assets/package_catalog.json +29 -29
- dtlpy/assets/package_gitignore +307 -307
- dtlpy/assets/service_runners/__init__.py +33 -33
- dtlpy/assets/service_runners/converter.py +96 -96
- dtlpy/assets/service_runners/multi_method.py +49 -49
- dtlpy/assets/service_runners/multi_method_annotation.py +54 -54
- dtlpy/assets/service_runners/multi_method_dataset.py +55 -55
- dtlpy/assets/service_runners/multi_method_item.py +52 -52
- dtlpy/assets/service_runners/multi_method_json.py +52 -52
- dtlpy/assets/service_runners/single_method.py +37 -37
- dtlpy/assets/service_runners/single_method_annotation.py +43 -43
- dtlpy/assets/service_runners/single_method_dataset.py +43 -43
- dtlpy/assets/service_runners/single_method_item.py +41 -41
- dtlpy/assets/service_runners/single_method_json.py +42 -42
- dtlpy/assets/service_runners/single_method_multi_input.py +45 -45
- dtlpy/assets/voc_annotation_template.xml +23 -23
- dtlpy/caches/base_cache.py +32 -32
- dtlpy/caches/cache.py +473 -473
- dtlpy/caches/dl_cache.py +201 -201
- dtlpy/caches/filesystem_cache.py +89 -89
- dtlpy/caches/redis_cache.py +84 -84
- dtlpy/dlp/__init__.py +20 -20
- dtlpy/dlp/cli_utilities.py +367 -367
- dtlpy/dlp/command_executor.py +764 -764
- dtlpy/dlp/dlp +1 -1
- dtlpy/dlp/dlp.bat +1 -1
- dtlpy/dlp/dlp.py +128 -128
- dtlpy/dlp/parser.py +651 -651
- dtlpy/entities/__init__.py +83 -83
- dtlpy/entities/analytic.py +347 -311
- dtlpy/entities/annotation.py +1879 -1879
- dtlpy/entities/annotation_collection.py +699 -699
- dtlpy/entities/annotation_definitions/__init__.py +20 -20
- dtlpy/entities/annotation_definitions/base_annotation_definition.py +100 -100
- dtlpy/entities/annotation_definitions/box.py +195 -195
- dtlpy/entities/annotation_definitions/classification.py +67 -67
- dtlpy/entities/annotation_definitions/comparison.py +72 -72
- dtlpy/entities/annotation_definitions/cube.py +204 -204
- dtlpy/entities/annotation_definitions/cube_3d.py +149 -149
- dtlpy/entities/annotation_definitions/description.py +32 -32
- dtlpy/entities/annotation_definitions/ellipse.py +124 -124
- dtlpy/entities/annotation_definitions/free_text.py +62 -62
- dtlpy/entities/annotation_definitions/gis.py +69 -69
- dtlpy/entities/annotation_definitions/note.py +139 -139
- dtlpy/entities/annotation_definitions/point.py +117 -117
- dtlpy/entities/annotation_definitions/polygon.py +182 -182
- dtlpy/entities/annotation_definitions/polyline.py +111 -111
- dtlpy/entities/annotation_definitions/pose.py +92 -92
- dtlpy/entities/annotation_definitions/ref_image.py +86 -86
- dtlpy/entities/annotation_definitions/segmentation.py +240 -240
- dtlpy/entities/annotation_definitions/subtitle.py +34 -34
- dtlpy/entities/annotation_definitions/text.py +85 -85
- dtlpy/entities/annotation_definitions/undefined_annotation.py +74 -74
- dtlpy/entities/app.py +220 -220
- dtlpy/entities/app_module.py +107 -107
- dtlpy/entities/artifact.py +174 -174
- dtlpy/entities/assignment.py +399 -399
- dtlpy/entities/base_entity.py +214 -214
- dtlpy/entities/bot.py +113 -113
- dtlpy/entities/codebase.py +292 -296
- dtlpy/entities/collection.py +38 -38
- dtlpy/entities/command.py +169 -169
- dtlpy/entities/compute.py +449 -442
- dtlpy/entities/dataset.py +1299 -1285
- dtlpy/entities/directory_tree.py +44 -44
- dtlpy/entities/dpk.py +470 -470
- dtlpy/entities/driver.py +235 -223
- dtlpy/entities/execution.py +397 -397
- dtlpy/entities/feature.py +124 -124
- dtlpy/entities/feature_set.py +145 -145
- dtlpy/entities/filters.py +798 -645
- dtlpy/entities/gis_item.py +107 -107
- dtlpy/entities/integration.py +184 -184
- dtlpy/entities/item.py +959 -953
- dtlpy/entities/label.py +123 -123
- dtlpy/entities/links.py +85 -85
- dtlpy/entities/message.py +175 -175
- dtlpy/entities/model.py +684 -684
- dtlpy/entities/node.py +1005 -1005
- dtlpy/entities/ontology.py +810 -803
- dtlpy/entities/organization.py +287 -287
- dtlpy/entities/package.py +657 -657
- dtlpy/entities/package_defaults.py +5 -5
- dtlpy/entities/package_function.py +185 -185
- dtlpy/entities/package_module.py +113 -113
- dtlpy/entities/package_slot.py +118 -118
- dtlpy/entities/paged_entities.py +299 -299
- dtlpy/entities/pipeline.py +624 -624
- dtlpy/entities/pipeline_execution.py +279 -279
- dtlpy/entities/project.py +394 -394
- dtlpy/entities/prompt_item.py +505 -499
- dtlpy/entities/recipe.py +301 -301
- dtlpy/entities/reflect_dict.py +102 -102
- dtlpy/entities/resource_execution.py +138 -138
- dtlpy/entities/service.py +963 -958
- dtlpy/entities/service_driver.py +117 -117
- dtlpy/entities/setting.py +294 -294
- dtlpy/entities/task.py +495 -495
- dtlpy/entities/time_series.py +143 -143
- dtlpy/entities/trigger.py +426 -426
- dtlpy/entities/user.py +118 -118
- dtlpy/entities/webhook.py +124 -124
- dtlpy/examples/__init__.py +19 -19
- dtlpy/examples/add_labels.py +135 -135
- dtlpy/examples/add_metadata_to_item.py +21 -21
- dtlpy/examples/annotate_items_using_model.py +65 -65
- dtlpy/examples/annotate_video_using_model_and_tracker.py +75 -75
- dtlpy/examples/annotations_convert_to_voc.py +9 -9
- dtlpy/examples/annotations_convert_to_yolo.py +9 -9
- dtlpy/examples/convert_annotation_types.py +51 -51
- dtlpy/examples/converter.py +143 -143
- dtlpy/examples/copy_annotations.py +22 -22
- dtlpy/examples/copy_folder.py +31 -31
- dtlpy/examples/create_annotations.py +51 -51
- dtlpy/examples/create_video_annotations.py +83 -83
- dtlpy/examples/delete_annotations.py +26 -26
- dtlpy/examples/filters.py +113 -113
- dtlpy/examples/move_item.py +23 -23
- dtlpy/examples/play_video_annotation.py +13 -13
- dtlpy/examples/show_item_and_mask.py +53 -53
- dtlpy/examples/triggers.py +49 -49
- dtlpy/examples/upload_batch_of_items.py +20 -20
- dtlpy/examples/upload_items_and_custom_format_annotations.py +55 -55
- dtlpy/examples/upload_items_with_modalities.py +43 -43
- dtlpy/examples/upload_segmentation_annotations_from_mask_image.py +44 -44
- dtlpy/examples/upload_yolo_format_annotations.py +70 -70
- dtlpy/exceptions.py +125 -125
- dtlpy/miscellaneous/__init__.py +20 -20
- dtlpy/miscellaneous/dict_differ.py +95 -95
- dtlpy/miscellaneous/git_utils.py +217 -217
- dtlpy/miscellaneous/json_utils.py +14 -14
- dtlpy/miscellaneous/list_print.py +105 -105
- dtlpy/miscellaneous/zipping.py +130 -130
- dtlpy/ml/__init__.py +20 -20
- dtlpy/ml/base_feature_extractor_adapter.py +27 -27
- dtlpy/ml/base_model_adapter.py +1257 -1086
- dtlpy/ml/metrics.py +461 -461
- dtlpy/ml/predictions_utils.py +274 -274
- dtlpy/ml/summary_writer.py +57 -57
- dtlpy/ml/train_utils.py +60 -60
- dtlpy/new_instance.py +252 -252
- dtlpy/repositories/__init__.py +56 -56
- dtlpy/repositories/analytics.py +85 -85
- dtlpy/repositories/annotations.py +916 -916
- dtlpy/repositories/apps.py +383 -383
- dtlpy/repositories/artifacts.py +452 -452
- dtlpy/repositories/assignments.py +599 -599
- dtlpy/repositories/bots.py +213 -213
- dtlpy/repositories/codebases.py +559 -559
- dtlpy/repositories/collections.py +332 -332
- dtlpy/repositories/commands.py +152 -158
- dtlpy/repositories/compositions.py +61 -61
- dtlpy/repositories/computes.py +439 -435
- dtlpy/repositories/datasets.py +1504 -1291
- dtlpy/repositories/downloader.py +976 -903
- dtlpy/repositories/dpks.py +433 -433
- dtlpy/repositories/drivers.py +482 -470
- dtlpy/repositories/executions.py +815 -817
- dtlpy/repositories/feature_sets.py +226 -226
- dtlpy/repositories/features.py +255 -238
- dtlpy/repositories/integrations.py +484 -484
- dtlpy/repositories/items.py +912 -909
- dtlpy/repositories/messages.py +94 -94
- dtlpy/repositories/models.py +1000 -988
- dtlpy/repositories/nodes.py +80 -80
- dtlpy/repositories/ontologies.py +511 -511
- dtlpy/repositories/organizations.py +525 -525
- dtlpy/repositories/packages.py +1941 -1941
- dtlpy/repositories/pipeline_executions.py +451 -451
- dtlpy/repositories/pipelines.py +640 -640
- dtlpy/repositories/projects.py +539 -539
- dtlpy/repositories/recipes.py +419 -399
- dtlpy/repositories/resource_executions.py +137 -137
- dtlpy/repositories/schema.py +120 -120
- dtlpy/repositories/service_drivers.py +213 -213
- dtlpy/repositories/services.py +1704 -1704
- dtlpy/repositories/settings.py +339 -339
- dtlpy/repositories/tasks.py +1477 -1477
- dtlpy/repositories/times_series.py +278 -278
- dtlpy/repositories/triggers.py +536 -536
- dtlpy/repositories/upload_element.py +257 -257
- dtlpy/repositories/uploader.py +661 -651
- dtlpy/repositories/webhooks.py +249 -249
- dtlpy/services/__init__.py +22 -22
- dtlpy/services/aihttp_retry.py +131 -131
- dtlpy/services/api_client.py +1785 -1782
- dtlpy/services/api_reference.py +40 -40
- dtlpy/services/async_utils.py +133 -133
- dtlpy/services/calls_counter.py +44 -44
- dtlpy/services/check_sdk.py +68 -68
- dtlpy/services/cookie.py +115 -115
- dtlpy/services/create_logger.py +156 -156
- dtlpy/services/events.py +84 -84
- dtlpy/services/logins.py +235 -235
- dtlpy/services/reporter.py +256 -256
- dtlpy/services/service_defaults.py +91 -91
- dtlpy/utilities/__init__.py +20 -20
- dtlpy/utilities/annotations/__init__.py +16 -16
- dtlpy/utilities/annotations/annotation_converters.py +269 -269
- dtlpy/utilities/base_package_runner.py +285 -264
- dtlpy/utilities/converter.py +1650 -1650
- dtlpy/utilities/dataset_generators/__init__.py +1 -1
- dtlpy/utilities/dataset_generators/dataset_generator.py +670 -670
- dtlpy/utilities/dataset_generators/dataset_generator_tensorflow.py +23 -23
- dtlpy/utilities/dataset_generators/dataset_generator_torch.py +21 -21
- dtlpy/utilities/local_development/__init__.py +1 -1
- dtlpy/utilities/local_development/local_session.py +179 -179
- dtlpy/utilities/reports/__init__.py +2 -2
- dtlpy/utilities/reports/figures.py +343 -343
- dtlpy/utilities/reports/report.py +71 -71
- dtlpy/utilities/videos/__init__.py +17 -17
- dtlpy/utilities/videos/video_player.py +598 -598
- dtlpy/utilities/videos/videos.py +470 -470
- {dtlpy-1.114.17.data → dtlpy-1.116.6.data}/scripts/dlp +1 -1
- dtlpy-1.116.6.data/scripts/dlp.bat +2 -0
- {dtlpy-1.114.17.data → dtlpy-1.116.6.data}/scripts/dlp.py +128 -128
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/METADATA +186 -183
- dtlpy-1.116.6.dist-info/RECORD +239 -0
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/WHEEL +1 -1
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/licenses/LICENSE +200 -200
- tests/features/environment.py +551 -551
- dtlpy/assets/__pycache__/__init__.cpython-310.pyc +0 -0
- dtlpy-1.114.17.data/scripts/dlp.bat +0 -2
- dtlpy-1.114.17.dist-info/RECORD +0 -240
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/entry_points.txt +0 -0
- {dtlpy-1.114.17.dist-info → dtlpy-1.116.6.dist-info}/top_level.txt +0 -0
dtlpy/ml/summary_writer.py
CHANGED
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
# from torch.utils.tensorboard import SummaryWriter, FileWriter
|
|
2
|
-
# from tensorboard.compat.proto.event_pb2 import Event, SessionLog
|
|
3
|
-
# import time
|
|
4
|
-
#
|
|
5
|
-
#
|
|
6
|
-
# class DtlpyFileWrite(FileWriter):
|
|
7
|
-
# def __init__(self, snapshot, *args, **kwargs):
|
|
8
|
-
# self.snapshot = snapshot
|
|
9
|
-
# super(DtlpyFileWrite, self).__init__(*args, **kwargs)
|
|
10
|
-
#
|
|
11
|
-
# def add_event(self, event, step=None, walltime=None):
|
|
12
|
-
# event: Event
|
|
13
|
-
# event.wall_time = time.time() if walltime is None else walltime
|
|
14
|
-
# if step is not None:
|
|
15
|
-
# # Make sure step is converted from numpy or other formats
|
|
16
|
-
# # since protobuf might not convert depending on version
|
|
17
|
-
# event.step = int(step)
|
|
18
|
-
# self.event_writer.add_event(event)
|
|
19
|
-
# # print(event)
|
|
20
|
-
# # print(event.step)
|
|
21
|
-
# # print(event.SerializeToString())
|
|
22
|
-
# dtlpy_records = list()
|
|
23
|
-
# for v in event.summary.value:
|
|
24
|
-
# dtlpy_records.append({'time': event.wall_time,
|
|
25
|
-
# 'step': event.step,
|
|
26
|
-
# 'tag': v.tag,
|
|
27
|
-
# 'value': v.simple_value,
|
|
28
|
-
# 'image': v.image.encoded_image_string,
|
|
29
|
-
# 'string': v.tensor.string_val,
|
|
30
|
-
# 'plugin_name': v.metadata.plugin_data.plugin_name})
|
|
31
|
-
# print(dtlpy_records)
|
|
32
|
-
# # self.snapshot.add_event(event)
|
|
33
|
-
#
|
|
34
|
-
#
|
|
35
|
-
# class DtlpySummaryWriter(SummaryWriter):
|
|
36
|
-
# def __init__(self, snapshot, *args, **kwargs):
|
|
37
|
-
# self.snapshot = snapshot
|
|
38
|
-
# super(DtlpySummaryWriter, self).__init__(*args, **kwargs)
|
|
39
|
-
#
|
|
40
|
-
# def _get_file_writer(self):
|
|
41
|
-
# """Returns the default FileWriter instance. Recreates it if closed."""
|
|
42
|
-
# print(self.snapshot)
|
|
43
|
-
# if self.all_writers is None or self.file_writer is None:
|
|
44
|
-
# self.file_writer = DtlpyFileWrite(snapshot=self.snapshot,
|
|
45
|
-
# log_dir=self.log_dir,
|
|
46
|
-
# max_queue=self.max_queue,
|
|
47
|
-
# flush_secs=self.flush_secs,
|
|
48
|
-
# filename_suffix=self.filename_suffix)
|
|
49
|
-
# self.all_writers = {self.file_writer.get_logdir(): self.file_writer}
|
|
50
|
-
# if self.purge_step is not None:
|
|
51
|
-
# most_recent_step = self.purge_step
|
|
52
|
-
# self.file_writer.add_event(
|
|
53
|
-
# Event(step=most_recent_step, file_version='brain.Event:2'))
|
|
54
|
-
# self.file_writer.add_event(
|
|
55
|
-
# Event(step=most_recent_step, session_log=SessionLog(status=SessionLog.START)))
|
|
56
|
-
# self.purge_step = None
|
|
57
|
-
# return self.file_writer
|
|
1
|
+
# from torch.utils.tensorboard import SummaryWriter, FileWriter
|
|
2
|
+
# from tensorboard.compat.proto.event_pb2 import Event, SessionLog
|
|
3
|
+
# import time
|
|
4
|
+
#
|
|
5
|
+
#
|
|
6
|
+
# class DtlpyFileWrite(FileWriter):
|
|
7
|
+
# def __init__(self, snapshot, *args, **kwargs):
|
|
8
|
+
# self.snapshot = snapshot
|
|
9
|
+
# super(DtlpyFileWrite, self).__init__(*args, **kwargs)
|
|
10
|
+
#
|
|
11
|
+
# def add_event(self, event, step=None, walltime=None):
|
|
12
|
+
# event: Event
|
|
13
|
+
# event.wall_time = time.time() if walltime is None else walltime
|
|
14
|
+
# if step is not None:
|
|
15
|
+
# # Make sure step is converted from numpy or other formats
|
|
16
|
+
# # since protobuf might not convert depending on version
|
|
17
|
+
# event.step = int(step)
|
|
18
|
+
# self.event_writer.add_event(event)
|
|
19
|
+
# # print(event)
|
|
20
|
+
# # print(event.step)
|
|
21
|
+
# # print(event.SerializeToString())
|
|
22
|
+
# dtlpy_records = list()
|
|
23
|
+
# for v in event.summary.value:
|
|
24
|
+
# dtlpy_records.append({'time': event.wall_time,
|
|
25
|
+
# 'step': event.step,
|
|
26
|
+
# 'tag': v.tag,
|
|
27
|
+
# 'value': v.simple_value,
|
|
28
|
+
# 'image': v.image.encoded_image_string,
|
|
29
|
+
# 'string': v.tensor.string_val,
|
|
30
|
+
# 'plugin_name': v.metadata.plugin_data.plugin_name})
|
|
31
|
+
# print(dtlpy_records)
|
|
32
|
+
# # self.snapshot.add_event(event)
|
|
33
|
+
#
|
|
34
|
+
#
|
|
35
|
+
# class DtlpySummaryWriter(SummaryWriter):
|
|
36
|
+
# def __init__(self, snapshot, *args, **kwargs):
|
|
37
|
+
# self.snapshot = snapshot
|
|
38
|
+
# super(DtlpySummaryWriter, self).__init__(*args, **kwargs)
|
|
39
|
+
#
|
|
40
|
+
# def _get_file_writer(self):
|
|
41
|
+
# """Returns the default FileWriter instance. Recreates it if closed."""
|
|
42
|
+
# print(self.snapshot)
|
|
43
|
+
# if self.all_writers is None or self.file_writer is None:
|
|
44
|
+
# self.file_writer = DtlpyFileWrite(snapshot=self.snapshot,
|
|
45
|
+
# log_dir=self.log_dir,
|
|
46
|
+
# max_queue=self.max_queue,
|
|
47
|
+
# flush_secs=self.flush_secs,
|
|
48
|
+
# filename_suffix=self.filename_suffix)
|
|
49
|
+
# self.all_writers = {self.file_writer.get_logdir(): self.file_writer}
|
|
50
|
+
# if self.purge_step is not None:
|
|
51
|
+
# most_recent_step = self.purge_step
|
|
52
|
+
# self.file_writer.add_event(
|
|
53
|
+
# Event(step=most_recent_step, file_version='brain.Event:2'))
|
|
54
|
+
# self.file_writer.add_event(
|
|
55
|
+
# Event(step=most_recent_step, session_log=SessionLog(status=SessionLog.START)))
|
|
56
|
+
# self.purge_step = None
|
|
57
|
+
# return self.file_writer
|
dtlpy/ml/train_utils.py
CHANGED
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
import datetime
|
|
2
|
-
import logging
|
|
3
|
-
import json
|
|
4
|
-
import time
|
|
5
|
-
|
|
6
|
-
import numpy as np
|
|
7
|
-
|
|
8
|
-
from .. import entities, exceptions
|
|
9
|
-
|
|
10
|
-
logger = logging.getLogger(name='dtlpy')
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def prepare_dataset(dataset: entities.Dataset,
|
|
14
|
-
subsets: dict,
|
|
15
|
-
filters: entities.Filters = None,
|
|
16
|
-
async_clone: bool = False):
|
|
17
|
-
"""
|
|
18
|
-
clones the given dataset and locks it to be readonly
|
|
19
|
-
|
|
20
|
-
:param dataset: `dl.Dataset` to clone
|
|
21
|
-
:param dtlpy.entities.filters.Filters filters: `dl.Filters` to use when cloning - which items to clone
|
|
22
|
-
:param subsets: dictionary to set subsets from the data.
|
|
23
|
-
key is subset name, value is the filter to set, eg.
|
|
24
|
-
{dl.DatasetSubsetType.TEST: dl.Filters(field='dir', values='/test')}
|
|
25
|
-
:param async_clone: `bool` if True (default) - waits until the sync is complete
|
|
26
|
-
False - return before the cloned dataset is fully populated
|
|
27
|
-
:return: `dl.Dataset` which is readonly
|
|
28
|
-
"""
|
|
29
|
-
|
|
30
|
-
project = dataset.project
|
|
31
|
-
now = datetime.datetime.now(datetime.timezone.utc).isoformat(timespec='minutes', sep='T') # This serves as an id
|
|
32
|
-
today = datetime.datetime.now(datetime.timezone.utc).strftime('%F')
|
|
33
|
-
|
|
34
|
-
# CLONE
|
|
35
|
-
clone_name = 'cloned-{ds_name}-{date_str}'.format(ds_name=dataset.name, date_str=today)
|
|
36
|
-
try:
|
|
37
|
-
cloned_dataset = project.datasets.get(clone_name)
|
|
38
|
-
logger.warning("Cloned dataset already exist. Using it...")
|
|
39
|
-
return cloned_dataset
|
|
40
|
-
except exceptions.NotFound:
|
|
41
|
-
pass
|
|
42
|
-
|
|
43
|
-
tic = time.time()
|
|
44
|
-
cloned_dataset = dataset.clone(clone_name=clone_name,
|
|
45
|
-
filters=filters)
|
|
46
|
-
toc = time.time()
|
|
47
|
-
|
|
48
|
-
orig_recipe = dataset.recipes.list()[0]
|
|
49
|
-
cloned_recipe = orig_recipe.clone(shallow=True)
|
|
50
|
-
cloned_dataset.metadata['system']['recipes'] = [cloned_recipe.id]
|
|
51
|
-
|
|
52
|
-
logger.info("clone complete: {!r} in {:1.1f}[s]".format(cloned_dataset.name, toc - tic))
|
|
53
|
-
|
|
54
|
-
assert cloned_dataset.name is not None, ('unable to get new ds {}'.format(clone_name))
|
|
55
|
-
cloned_dataset.metadata['system']['clone_info'] = {'date': now,
|
|
56
|
-
'originalDatasetId': dataset.id}
|
|
57
|
-
if filters is not None:
|
|
58
|
-
cloned_dataset.metadata['system']['clone_info'].update({'filters': json.dumps(filters.prepare())})
|
|
59
|
-
cloned_dataset.update(system_metadata=True)
|
|
60
|
-
return cloned_dataset
|
|
1
|
+
import datetime
|
|
2
|
+
import logging
|
|
3
|
+
import json
|
|
4
|
+
import time
|
|
5
|
+
|
|
6
|
+
import numpy as np
|
|
7
|
+
|
|
8
|
+
from .. import entities, exceptions
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(name='dtlpy')
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def prepare_dataset(dataset: entities.Dataset,
|
|
14
|
+
subsets: dict,
|
|
15
|
+
filters: entities.Filters = None,
|
|
16
|
+
async_clone: bool = False):
|
|
17
|
+
"""
|
|
18
|
+
clones the given dataset and locks it to be readonly
|
|
19
|
+
|
|
20
|
+
:param dataset: `dl.Dataset` to clone
|
|
21
|
+
:param dtlpy.entities.filters.Filters filters: `dl.Filters` to use when cloning - which items to clone
|
|
22
|
+
:param subsets: dictionary to set subsets from the data.
|
|
23
|
+
key is subset name, value is the filter to set, eg.
|
|
24
|
+
{dl.DatasetSubsetType.TEST: dl.Filters(field='dir', values='/test')}
|
|
25
|
+
:param async_clone: `bool` if True (default) - waits until the sync is complete
|
|
26
|
+
False - return before the cloned dataset is fully populated
|
|
27
|
+
:return: `dl.Dataset` which is readonly
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
project = dataset.project
|
|
31
|
+
now = datetime.datetime.now(datetime.timezone.utc).isoformat(timespec='minutes', sep='T') # This serves as an id
|
|
32
|
+
today = datetime.datetime.now(datetime.timezone.utc).strftime('%F')
|
|
33
|
+
|
|
34
|
+
# CLONE
|
|
35
|
+
clone_name = 'cloned-{ds_name}-{date_str}'.format(ds_name=dataset.name, date_str=today)
|
|
36
|
+
try:
|
|
37
|
+
cloned_dataset = project.datasets.get(clone_name)
|
|
38
|
+
logger.warning("Cloned dataset already exist. Using it...")
|
|
39
|
+
return cloned_dataset
|
|
40
|
+
except exceptions.NotFound:
|
|
41
|
+
pass
|
|
42
|
+
|
|
43
|
+
tic = time.time()
|
|
44
|
+
cloned_dataset = dataset.clone(clone_name=clone_name,
|
|
45
|
+
filters=filters)
|
|
46
|
+
toc = time.time()
|
|
47
|
+
|
|
48
|
+
orig_recipe = dataset.recipes.list()[0]
|
|
49
|
+
cloned_recipe = orig_recipe.clone(shallow=True)
|
|
50
|
+
cloned_dataset.metadata['system']['recipes'] = [cloned_recipe.id]
|
|
51
|
+
|
|
52
|
+
logger.info("clone complete: {!r} in {:1.1f}[s]".format(cloned_dataset.name, toc - tic))
|
|
53
|
+
|
|
54
|
+
assert cloned_dataset.name is not None, ('unable to get new ds {}'.format(clone_name))
|
|
55
|
+
cloned_dataset.metadata['system']['clone_info'] = {'date': now,
|
|
56
|
+
'originalDatasetId': dataset.id}
|
|
57
|
+
if filters is not None:
|
|
58
|
+
cloned_dataset.metadata['system']['clone_info'].update({'filters': json.dumps(filters.prepare())})
|
|
59
|
+
cloned_dataset.update(system_metadata=True)
|
|
60
|
+
return cloned_dataset
|