4
4
from datetime import datetime
5
5
from typing import Callable , Optional , Union , cast
6
6
7
- import aiohttp
8
7
from clearml import Task
9
8
from dynaconf .base import Settings
10
9
11
10
from ..utils .canceled_error import CanceledError
12
11
from ..utils .phased_progress_reporter import PhaseProgressStatus
13
12
from ..utils .progress_status import ProgressStatus
14
- from .async_scheduler import AsyncScheduler
15
13
16
14
17
15
class ProgressInfo :
@@ -37,7 +35,7 @@ def clearml_check_canceled() -> None:
37
35
38
36
39
37
def get_clearml_progress_caller (
40
- progress_info : ProgressInfo , task : Task , scheduler : AsyncScheduler , logger : logging .Logger
38
+ progress_info : ProgressInfo , task : Task , logger : logging .Logger
41
39
) -> Callable [[ProgressStatus ], None ]:
42
40
def clearml_progress (progress_status : ProgressStatus ) -> None :
43
41
percent_completed : Optional [int ] = None
@@ -51,11 +49,8 @@ def clearml_progress(progress_status: ProgressStatus) -> None:
51
49
progress_info .last_progress_time is None
52
50
or (current_time - progress_info .last_progress_time ).seconds > 1
53
51
):
54
- scheduler .schedule (
55
- update_runtime_properties (
56
- task ,
57
- create_runtime_properties (task , percent_completed , message , progress_status ),
58
- )
52
+ report_clearml_progress (
53
+ task = task , percent_completed = percent_completed , message = message , progress_status = progress_status
59
54
)
60
55
progress_info .last_progress_time = current_time
61
56
progress_info .last_percent_completed = percent_completed
@@ -64,6 +59,42 @@ def clearml_progress(progress_status: ProgressStatus) -> None:
64
59
return clearml_progress
65
60
66
61
62
+ def report_clearml_progress (
63
+ task : Task ,
64
+ percent_completed : Optional [int ] = None ,
65
+ message : Optional [str ] = None ,
66
+ progress_status : Optional [ProgressStatus ] = None ,
67
+ ) -> None :
68
+ if percent_completed is not None :
69
+ task .set_progress (percent_completed )
70
+ props = []
71
+ if message is not None :
72
+ props .append ({"type" : str , "name" : "message" , "description" : "Build Message" , "value" : message })
73
+ # Report the step within the phase
74
+ if progress_status is not None and isinstance (progress_status , PhaseProgressStatus ):
75
+ if progress_status .phase_stage is not None :
76
+ if progress_status .phase_step is not None :
77
+ props .append (
78
+ {
79
+ "type" : int ,
80
+ "name" : f"{ progress_status .phase_stage } _step" ,
81
+ "description" : "Phase Step" ,
82
+ "value" : progress_status .phase_step ,
83
+ }
84
+ )
85
+ if progress_status .step_count is not None :
86
+ props .append (
87
+ {
88
+ "type" : int ,
89
+ "name" : f"{ progress_status .phase_stage } _step_count" ,
90
+ "description" : "Maximum Phase Step" ,
91
+ "value" : progress_status .step_count ,
92
+ }
93
+ )
94
+ if len (props ) > 0 :
95
+ task .set_user_properties (* props )
96
+
97
+
67
98
def get_local_progress_caller (progress_info : ProgressInfo , logger : logging .Logger ) -> Callable [[ProgressStatus ], None ]:
68
99
69
100
def local_progress (progress_status : ProgressStatus ) -> None :
@@ -91,32 +122,3 @@ def update_settings(settings: Settings, args: dict):
91
122
raise TypeError (f"Build options could not be parsed: { e } " ) from e
92
123
settings .update ({settings .model_type : build_options })
93
124
settings .data_dir = os .path .expanduser (cast (str , settings .data_dir ))
94
-
95
-
96
- async def update_runtime_properties (task , runtime_props : dict ) -> None :
97
- current_runtime_properties = task .data .runtime or {}
98
- current_runtime_properties .update (runtime_props )
99
- async with aiohttp .ClientSession (
100
- base_url = task .session .host , headers = {"Authorization" : f"Bearer { task .session .token } " }
101
- ) as session :
102
- json = {"task" : task .id , "runtime" : runtime_props , "force" : True }
103
- async with session .post ("/tasks.edit" , json = json ) as response :
104
- response .raise_for_status ()
105
-
106
-
107
- def create_runtime_properties (
108
- task , percent_completed : Optional [int ], message : Optional [str ], status : Optional [ProgressStatus ]
109
- ) -> dict :
110
- runtime_props = task .data .runtime .copy () or {}
111
- if percent_completed is not None :
112
- runtime_props ["progress" ] = str (percent_completed )
113
- if message is not None :
114
- runtime_props ["message" ] = message
115
- # Report the step within the phase
116
- if status is not None and isinstance (status , PhaseProgressStatus ):
117
- if status .phase_stage is not None :
118
- if status .phase_step is not None :
119
- runtime_props [f"{ status .phase_stage } _step" ] = str (status .phase_step )
120
- if status .step_count is not None :
121
- runtime_props [f"{ status .phase_stage } _step_count" ] = str (status .step_count )
122
- return runtime_props
0 commit comments