1- from pprint import pformat
1+ import terminaltables
22
3- from paperspace import version , logger
3+ from paperspace import version , logger , constants
44from paperspace .client import API
55from paperspace .config import config
66
1111experiments_api = API (config .CONFIG_EXPERIMENTS_HOST , headers = default_headers )
1212
1313
14- def _log_response (response , success_msg , error_msg ):
14+ def _log_response (response , success_msg , error_msg , logger_ = logger ):
1515 if response .ok :
16- logger .log (success_msg )
16+ logger_ .log (success_msg )
1717 else :
1818 try :
1919 data = response .json ()
20- logger .log_error_response (data )
20+ logger_ .log_error_response (data )
2121 except ValueError :
22- logger .log (error_msg )
22+ logger_ .log (error_msg )
2323
2424
25- def create_experiments (json , api = experiments_api ):
26- response = api .post ("/experiments/" , json = json )
27- _log_response (response , "Experiment created" , "Unknown error while creating experiment" )
25+ def _log_create_experiment (response , success_msg_template , error_msg , logger_ = logger ):
26+ if response .ok :
27+ j = response .json ()
28+ handle = j ["handle" ]
29+ msg = success_msg_template .format (handle )
30+ logger_ .log (msg )
31+ else :
32+ try :
33+ data = response .json ()
34+ logger_ .log_error_response (data )
35+ except ValueError :
36+ logger_ .log (error_msg )
2837
2938
30- def create_and_start_experiments (json , api = experiments_api ):
31- response = api .post ("/experiments/create_and_start/" , json = json )
32- _log_response (response , "Experiment created" , "Unknown error while creating experiment" )
39+ def create_experiment (json_ , api = experiments_api ):
40+ response = api .post ("/experiments/" , json = json_ )
41+
42+ _log_create_experiment (response ,
43+ "New experiment created with handle: {}" ,
44+ "Unknown error while creating the experiment" )
45+
46+
47+ def create_and_start_experiment (json_ , api = experiments_api ):
48+ response = api .post ("/experiments/create_and_start/" , json = json_ )
49+ _log_create_experiment (response ,
50+ "New experiment created and started with handle: {}" ,
51+ "Unknown error while creating/starting the experiment" )
3352
3453
3554def start_experiment (experiment_handle , api = experiments_api ):
3655 url = "/experiments/{}/start/" .format (experiment_handle )
3756 response = api .put (url )
38- _log_response (response , "Experiment started" , "Unknown error while starting experiment" )
57+ _log_response (response , "Experiment started" , "Unknown error while starting the experiment" )
3958
4059
4160def stop_experiment (experiment_handle , api = experiments_api ):
4261 url = "/experiments/{}/stop/" .format (experiment_handle )
4362 response = api .put (url )
44- _log_response (response , "Experiment stopped" , "Unknown error while stopping experiment" )
63+ _log_response (response , "Experiment stopped" , "Unknown error while stopping the experiment" )
64+
65+
66+ def _make_experiments_list_table (experiments ):
67+ data = [("Name" , "Handle" , "Status" )]
68+ for experiment in experiments :
69+ name = experiment ["templateHistory" ]["params" ]["name" ]
70+ handle = experiment ["handle" ]
71+ status = constants .ExperimentState .get_state_str (experiment ["state" ])
72+ data .append ((name , handle , status ))
73+
74+ ascii_table = terminaltables .AsciiTable (data )
75+ table_string = ascii_table .table
76+ return table_string
4577
4678
4779def list_experiments (api = experiments_api ):
4880 response = api .get ("/experiments/" )
49- _log_response (response , "Experiment stopped" , "Unknown error while stopping experiment" )
81+ details = response .content
82+ if response .ok :
83+ try :
84+ experiments = response .json ()["data" ]
85+ details = _make_experiments_list_table (experiments )
86+ except (ValueError , KeyError ) as e :
87+ logger .log ("Error parsing response data" )
88+ logger .debug (e )
89+
90+ _log_response (response , details , "Unknown error while retrieving list of experiments" )
91+
92+
93+ def _make_details_table (experiment ):
94+ if experiment ["experimentTypeId" ] == constants .ExperimentType .SINGLE_NODE :
95+ data = (
96+ ("Name" , experiment ["templateHistory" ]["params" ].get ("name" )),
97+ ("Handle" , experiment .get ("handle" )),
98+ ("State" , constants .ExperimentState .get_state_str (experiment .get ("state" ))),
99+ ("Ports" , experiment ["templateHistory" ]["params" ].get ("ports" )),
100+ ("Project Handle" , experiment ["templateHistory" ]["params" ].get ("project_handle" )),
101+ ("Worker Command" , experiment ["templateHistory" ]["params" ].get ("worker_command" )),
102+ ("Worker Container" , experiment ["templateHistory" ]["params" ].get ("worker_container" )),
103+ ("Worker Machine Type" , experiment ["templateHistory" ]["params" ].get ("worker_machine_type" )),
104+ ("Working Directory" , experiment ["templateHistory" ]["params" ].get ("workingDirectory" )),
105+ ("Workspace URL" , experiment ["templateHistory" ]["params" ].get ("workspaceUrl" )),
106+ )
107+ elif experiment ["experimentTypeId" ] in (constants .ExperimentType .GRPC_MULTI_NODE ,
108+ constants .ExperimentType .MPI_MULTI_NODE ):
109+ data = (
110+ ("Name" , experiment ["templateHistory" ]["params" ].get ("name" )),
111+ ("Handle" , experiment .get ("handle" )),
112+ ("State" , constants .ExperimentState .get_state_str (experiment .get ("state" ))),
113+ ("Artifact directory" , experiment ["templateHistory" ]["params" ].get ("artifactDirectory" )),
114+ ("Cluster ID" , experiment ["templateHistory" ]["params" ].get ("clusterId" )),
115+ ("Experiment Env" , experiment ["templateHistory" ]["params" ].get ("experimentEnv" )),
116+ ("Experiment Type" ,
117+ constants .ExperimentType .get_type_str (experiment ["templateHistory" ]["params" ].get ("experimentTypeId" ))),
118+ ("Parameter Server Command" , experiment ["templateHistory" ]["params" ].get ("parameter_server_command" )),
119+ ("Parameter Server Container" , experiment ["templateHistory" ]["params" ].get ("parameter_server_container" )),
120+ ("Parameter Server Count" , experiment ["templateHistory" ]["params" ].get ("parameter_server_count" )),
121+ ("Parameter Server Machine Type" ,
122+ experiment ["templateHistory" ]["params" ].get ("parameter_server_machine_type" )),
123+ ("Ports" , experiment ["templateHistory" ]["params" ].get ("ports" )),
124+ ("Project Handle" , experiment ["templateHistory" ]["params" ].get ("project_handle" )),
125+ ("Worker Command" , experiment ["templateHistory" ]["params" ].get ("worker_command" )),
126+ ("Worker Container" , experiment ["templateHistory" ]["params" ].get ("worker_container" )),
127+ ("Worker Count" , experiment ["templateHistory" ]["params" ].get ("worker_count" )),
128+ ("Worker Machine Type" , experiment ["templateHistory" ]["params" ].get ("worker_machine_type" )),
129+ ("Working Directory" , experiment ["templateHistory" ]["params" ].get ("workingDirectory" )),
130+ ("Workspace URL" , experiment ["templateHistory" ]["params" ].get ("workspaceUrl" )),
131+ )
132+ else :
133+ raise ValueError ("Wrong experiment type: {}" .format (experiment ["experimentTypeId" ]))
134+
135+ ascii_table = terminaltables .AsciiTable (data )
136+ table_string = ascii_table .table
137+ return table_string
50138
51139
52140def get_experiment_details (experiment_handle , api = experiments_api ):
@@ -55,7 +143,10 @@ def get_experiment_details(experiment_handle, api=experiments_api):
55143 details = response .content
56144 if response .ok :
57145 try :
58- details = pformat (response .json ()["data" ][0 ])
59- except (ValueError , KeyError , IndexError ):
60- pass
146+ experiment = response .json ()["data" ]
147+ details = _make_details_table (experiment )
148+ except (ValueError , KeyError ) as e :
149+ logger .log ("Error parsing response data" )
150+ logger .debug (e )
151+
61152 _log_response (response , details , "Unknown error while retrieving details of the experiment" )
0 commit comments