supervisely 6.73.332__py3-none-any.whl → 6.73.334__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.
@@ -786,7 +786,7 @@ class TaskApi(ModuleApiBase, ModuleWithStatus):
786
786
  resp = self._api.post("tasks.data.get", data)
787
787
  return resp.json()["result"]
788
788
 
789
- def get_field(self, task_id: int, field: Dict):
789
+ def get_field(self, task_id: int, field: str):
790
790
  """get_field"""
791
791
  result = self.get_fields(task_id, [field])
792
792
  return result[field]
@@ -11,7 +11,7 @@ import time
11
11
  import uuid
12
12
  from collections import OrderedDict, defaultdict
13
13
  from concurrent.futures import ThreadPoolExecutor
14
- from dataclasses import asdict
14
+ from dataclasses import asdict, dataclass
15
15
  from functools import partial, wraps
16
16
  from pathlib import Path
17
17
  from queue import Queue
@@ -46,7 +46,7 @@ from supervisely.annotation.label import Label
46
46
  from supervisely.annotation.obj_class import ObjClass
47
47
  from supervisely.annotation.tag_collection import TagCollection
48
48
  from supervisely.annotation.tag_meta import TagMeta, TagValueType
49
- from supervisely.api.api import Api
49
+ from supervisely.api.api import Api, ApiField
50
50
  from supervisely.api.app_api import WorkflowMeta, WorkflowSettings
51
51
  from supervisely.api.image_api import ImageInfo
52
52
  from supervisely.app.content import StateJson, get_data_dir
@@ -91,6 +91,33 @@ except ImportError:
91
91
  from typing_extensions import Literal
92
92
 
93
93
 
94
+ @dataclass
95
+ class AutoRestartInfo:
96
+ deploy_params: dict
97
+
98
+ class Fields:
99
+ AUTO_RESTART_INFO = "autoRestartInfo"
100
+ DEPLOY_PARAMS = "deployParams"
101
+
102
+ def generate_fields(self) -> List[dict]:
103
+ return [
104
+ {
105
+ ApiField.FIELD: self.Fields.AUTO_RESTART_INFO,
106
+ ApiField.PAYLOAD: {self.Fields.DEPLOY_PARAMS: self.deploy_params},
107
+ }
108
+ ]
109
+
110
+ @classmethod
111
+ def from_response(cls, data: dict):
112
+ autorestart_info = data.get(cls.Fields.AUTO_RESTART_INFO, None)
113
+ if autorestart_info is None:
114
+ return None
115
+ return cls(deploy_params=autorestart_info.get(cls.Fields.DEPLOY_PARAMS, None))
116
+
117
+ def is_changed(self, deploy_params: dict) -> bool:
118
+ return self.deploy_params != deploy_params
119
+
120
+
94
121
  class Inference:
95
122
  FRAMEWORK_NAME: str = None
96
123
  """Name of framework to register models in Supervisely"""
@@ -127,6 +154,7 @@ class Inference:
127
154
  model_dir = os.path.join(get_data_dir(), "models")
128
155
  sly_fs.mkdir(model_dir)
129
156
 
157
+ self.autorestart = None
130
158
  self.device: str = None
131
159
  self.runtime: str = None
132
160
  self.model_precision: str = None
@@ -327,6 +355,9 @@ class Inference:
327
355
  self._user_layout_card.unlock()
328
356
 
329
357
  def set_params_to_gui(self, deploy_params: dict) -> None:
358
+ """
359
+ Set params for load_model method to GUI.
360
+ """
330
361
  if isinstance(self.gui, GUI.ServingGUI):
331
362
  self._user_layout_card.hide()
332
363
  self._api_request_model_info.set_text(json.dumps(deploy_params), "json")
@@ -677,6 +708,23 @@ class Inference:
677
708
  self.load_model(**deploy_params)
678
709
  self._model_served = True
679
710
  self._deploy_params = deploy_params
711
+ try:
712
+ if self.autorestart is None:
713
+ self.autorestart = AutoRestartInfo(self._deploy_params)
714
+ self.api.task.set_fields(self._task_id, self.autorestart.generate_fields())
715
+ logger.debug(
716
+ "Created new autorestart info.",
717
+ extra=self.autorestart.deploy_params,
718
+ )
719
+ elif self.autorestart.is_changed(self._deploy_params):
720
+ self.autorestart.deploy_params.update(self._deploy_params)
721
+ self.api.task.set_fields(self._task_id, self.autorestart.generate_fields())
722
+ logger.debug(
723
+ "Autorestart info is changed. Parameters have been updated.",
724
+ extra=self.autorestart.deploy_params,
725
+ )
726
+ except Exception as e:
727
+ logger.warning(f"Failed to update autorestart info: {repr(e)}")
680
728
  if self.gui is not None:
681
729
  self.update_gui(self._model_served)
682
730
  self.gui.show_deployed_model_info(self)
@@ -2420,6 +2468,29 @@ class Inference:
2420
2468
  future.add_done_callback(end_callback)
2421
2469
  logger.debug("Scheduled task.", extra={"inference_request_uuid": inference_request_uuid})
2422
2470
 
2471
+ def _deploy_on_autorestart(self):
2472
+ try:
2473
+ self._api_request_model_layout._title = (
2474
+ "Model was deployed during auto restart with the following settings"
2475
+ )
2476
+ self._api_request_model_layout.update_data()
2477
+ deploy_params = self.autorestart.deploy_params
2478
+ if isinstance(self.gui, GUI.ServingGUITemplate):
2479
+ model_files = self._download_model_files(deploy_params)
2480
+ deploy_params["model_files"] = model_files
2481
+ self._load_model_headless(**deploy_params)
2482
+ elif isinstance(self.gui, GUI.ServingGUI):
2483
+ self._load_model(deploy_params)
2484
+
2485
+ self.set_params_to_gui(deploy_params)
2486
+ # update to set correct device
2487
+ device = deploy_params.get("device", "cpu")
2488
+ self.gui.set_deployed(device)
2489
+ return {"result": "model was successfully deployed"}
2490
+ except Exception as e:
2491
+ self.gui._success_label.hide()
2492
+ raise e
2493
+
2423
2494
  def serve(self):
2424
2495
  if not self._use_gui and not self._is_local_deploy:
2425
2496
  Progress("Deploying model ...", 1)
@@ -2463,6 +2534,20 @@ class Inference:
2463
2534
  else:
2464
2535
  self._app = Application(layout=self.get_ui())
2465
2536
 
2537
+ try:
2538
+ if self._task_id is not None:
2539
+ response = self.api.task.get_fields(
2540
+ self._task_id, [AutoRestartInfo.Fields.AUTO_RESTART_INFO]
2541
+ )
2542
+ self.autorestart = AutoRestartInfo.from_response(response)
2543
+ if self.autorestart is not None:
2544
+ logger.debug("Autorestart info is set.", extra=self.autorestart.deploy_params)
2545
+ self._deploy_on_autorestart()
2546
+ else:
2547
+ logger.debug("Autorestart info is not set.")
2548
+ except Exception:
2549
+ logger.error("Autorestart failed.", exc_info=True)
2550
+
2466
2551
  server = self._app.get_server()
2467
2552
  self._app.set_ready_check_function(self.is_model_deployed)
2468
2553
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: supervisely
3
- Version: 6.73.332
3
+ Version: 6.73.334
4
4
  Summary: Supervisely Python SDK.
5
5
  Home-page: https://github.com/supervisely/supervisely
6
6
  Author: Supervisely
@@ -42,7 +42,7 @@ supervisely/api/remote_storage_api.py,sha256=qTuPhPsstgEjRm1g-ZInddik8BNC_38YvBB
42
42
  supervisely/api/report_api.py,sha256=Om7CGulUbQ4BuJ16eDtz7luLe0JQNqab-LoLpUXu7YE,7123
43
43
  supervisely/api/role_api.py,sha256=aBL4mxtn08LDPXQuS153-lQFN6N2kcwiz8MbescZ8Gk,3044
44
44
  supervisely/api/storage_api.py,sha256=FPGYf3Rn3LBoe38RBNdoiURs306oshzvKOEOQ56XAbs,13030
45
- supervisely/api/task_api.py,sha256=WUyovA322egcfjG6Iv_vX8RdfU_3Bw7qxcniYeLpqwA,53874
45
+ supervisely/api/task_api.py,sha256=ZuPXAfHO5WwWRfR0f93iprkcGlqRMK0q2UXF55dGneo,53873
46
46
  supervisely/api/team_api.py,sha256=bEoz3mrykvliLhKnzEy52vzdd_H8VBJCpxF-Bnek9Q8,19467
47
47
  supervisely/api/user_api.py,sha256=4S97yIc6AMTZCa0N57lzETnpIE8CeqClvCb6kjUkgfc,24940
48
48
  supervisely/api/video_annotation_tool_api.py,sha256=3A9-U8WJzrTShP_n9T8U01M9FzGYdeS51CCBTzUnooo,6686
@@ -883,7 +883,7 @@ supervisely/nn/benchmark/visualization/widgets/table/__init__.py,sha256=47DEQpj8
883
883
  supervisely/nn/benchmark/visualization/widgets/table/table.py,sha256=atmDnF1Af6qLQBUjLhK18RMDKAYlxnsuVHMSEa5a-e8,4319
884
884
  supervisely/nn/inference/__init__.py,sha256=QFukX2ip-U7263aEPCF_UCFwj6EujbMnsgrXp5Bbt8I,1623
885
885
  supervisely/nn/inference/cache.py,sha256=LAirR5mFHCtK59EO1lefQ2qhpp0vBvRTH26EVrs13Y0,32073
886
- supervisely/nn/inference/inference.py,sha256=O0GR2o0t9hDh-bMdiKrxk-hxdmQU1M-44aIcZM89Qo8,166222
886
+ supervisely/nn/inference/inference.py,sha256=dzfvHjisVYgsijnHYazb_y0mXYZQJX0E1fEsDY6S5lw,169730
887
887
  supervisely/nn/inference/session.py,sha256=jmkkxbe2kH-lEgUU6Afh62jP68dxfhF5v6OGDfLU62E,35757
888
888
  supervisely/nn/inference/video_inference.py,sha256=8Bshjr6rDyLay5Za8IB8Dr6FURMO2R_v7aELasO8pR4,5746
889
889
  supervisely/nn/inference/gui/__init__.py,sha256=wCxd-lF5Zhcwsis-wScDA8n1Gk_1O00PKgDviUZ3F1U,221
@@ -1082,9 +1082,9 @@ supervisely/worker_proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
1082
1082
  supervisely/worker_proto/worker_api_pb2.py,sha256=VQfi5JRBHs2pFCK1snec3JECgGnua3Xjqw_-b3aFxuM,59142
1083
1083
  supervisely/worker_proto/worker_api_pb2_grpc.py,sha256=3BwQXOaP9qpdi0Dt9EKG--Lm8KGN0C5AgmUfRv77_Jk,28940
1084
1084
  supervisely_lib/__init__.py,sha256=7-3QnN8Zf0wj8NCr2oJmqoQWMKKPKTECvjH9pd2S5vY,159
1085
- supervisely-6.73.332.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1086
- supervisely-6.73.332.dist-info/METADATA,sha256=BJvt3Cmxv83_ptkDl7bpGY-Wawc2IY89aF3aIZ7LwAE,33596
1087
- supervisely-6.73.332.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
1088
- supervisely-6.73.332.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1089
- supervisely-6.73.332.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1090
- supervisely-6.73.332.dist-info/RECORD,,
1085
+ supervisely-6.73.334.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
1086
+ supervisely-6.73.334.dist-info/METADATA,sha256=jD55cUT6bmdvsvTMuPD3Jt61Aus-DzBZciz5C5VO2HA,33596
1087
+ supervisely-6.73.334.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
1088
+ supervisely-6.73.334.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
1089
+ supervisely-6.73.334.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
1090
+ supervisely-6.73.334.dist-info/RECORD,,