18
18
"""Shared utils for tensorboard log uploader."""
19
19
import abc
20
20
import contextlib
21
+ import json
21
22
import logging
22
23
import re
23
24
import time
@@ -120,7 +121,7 @@ def batch_create_runs(
120
121
"""
121
122
created_runs = []
122
123
for run_name in run_names :
123
- tb_run = self ._get_or_create_run_resource (run_name )
124
+ tb_run = self ._create_or_get_run_resource (run_name )
124
125
created_runs .append (tb_run )
125
126
if run_name not in self ._run_name_to_run_resource_name :
126
127
self ._run_name_to_run_resource_name [run_name ] = tb_run .resource_name
@@ -195,11 +196,11 @@ def get_run_resource_name(self, run_name: str) -> str:
195
196
Resource name of the run.
196
197
"""
197
198
if run_name not in self ._run_name_to_run_resource_name :
198
- tb_run = self ._get_or_create_run_resource (run_name )
199
+ tb_run = self ._create_or_get_run_resource (run_name )
199
200
self ._run_name_to_run_resource_name [run_name ] = tb_run .resource_name
200
201
return self ._run_name_to_run_resource_name [run_name ]
201
202
202
- def _get_or_create_run_resource (
203
+ def _create_or_get_run_resource (
203
204
self , run_name : str
204
205
) -> tensorboard_run .TensorboardRun :
205
206
"""Creates new experiment run and tensorboard run resources.
@@ -270,7 +271,7 @@ def get_time_series_resource_name(
270
271
Resource name of the time series
271
272
"""
272
273
if (run_name , tag_name ) not in self ._run_tag_name_to_time_series_name :
273
- time_series = self ._get_or_create_time_series (
274
+ time_series = self ._create_or_get_time_series (
274
275
self .get_run_resource_name (run_name ),
275
276
tag_name ,
276
277
time_series_resource_creator ,
@@ -280,7 +281,7 @@ def get_time_series_resource_name(
280
281
] = time_series .name
281
282
return self ._run_tag_name_to_time_series_name [(run_name , tag_name )]
282
283
283
- def _get_or_create_time_series (
284
+ def _create_or_get_time_series (
284
285
self ,
285
286
run_resource_name : str ,
286
287
tag_name : str ,
@@ -310,29 +311,45 @@ def _get_or_create_time_series(
310
311
ValueError:
311
312
More than one time series with the resource name was found.
312
313
"""
313
- time_series = None
314
- run_name = run_resource_name .split ("/" )[- 1 ]
315
- run = self ._get_or_create_run_resource (run_name )
316
- time_series_id = run .get_tensorboard_time_series_id (tag_name )
317
- if time_series_id :
318
- time_series = self ._api .get_tensorboard_time_series (
319
- request = tensorboard_service .GetTensorboardTimeSeriesRequest (
320
- name = run_resource_name + "/timeSeries/" + time_series_id
321
- )
314
+ time_series = time_series_resource_creator ()
315
+ time_series .display_name = tag_name
316
+ try :
317
+ time_series = self ._api .create_tensorboard_time_series (
318
+ parent = run_resource_name , tensorboard_time_series = time_series
322
319
)
323
- if not time_series :
324
- time_series = time_series_resource_creator ()
325
- time_series .display_name = tag_name
326
- try :
327
- time_series = self ._api .create_tensorboard_time_series (
328
- parent = run_resource_name , tensorboard_time_series = time_series
320
+ except exceptions .InvalidArgument as e :
321
+ # If the time series display name already exists then retrieve it
322
+ if "already exist" in e .message :
323
+ list_of_time_series = self ._api .list_tensorboard_time_series (
324
+ request = tensorboard_service .ListTensorboardTimeSeriesRequest (
325
+ parent = run_resource_name ,
326
+ filter = "display_name = {}" .format (json .dumps (str (tag_name ))),
327
+ )
329
328
)
330
- except exceptions .InvalidArgument as e :
331
- raise ValueError (
332
- "Could not find time series resource with display name: {}" .format (
333
- tag_name
329
+ num = 0
330
+ time_series = None
331
+
332
+ for ts in list_of_time_series :
333
+ num += 1
334
+ if num > 1 :
335
+ break
336
+ time_series = ts
337
+
338
+ if not time_series :
339
+ raise ExistingResourceNotFoundError (
340
+ "Could not find time series resource with display name: {}" .format (
341
+ tag_name
342
+ )
343
+ )
344
+
345
+ if num != 1 :
346
+ raise ValueError (
347
+ "More than one time series resource found with display_name: {}" .format (
348
+ tag_name
349
+ )
334
350
)
335
- ) from e
351
+ else :
352
+ raise
336
353
return time_series
337
354
338
355
@@ -355,45 +372,6 @@ def __init__(self, run_resource_id: str, api: TensorboardServiceClient):
355
372
str , tensorboard_time_series .TensorboardTimeSeries
356
373
] = {}
357
374
358
- def _get_run_resource (self ) -> tensorboard_run .TensorboardRun :
359
- """Gets or creates new experiment run and tensorboard run resources.
360
-
361
- The experiment run will be associated with the tensorboard run resource.
362
- This will link all tensorboard run data to the associated experiment.
363
-
364
- Returns:
365
- tb_run (tensorboard_run.TensorboardRun):
366
- The TensorboardRun given the run_name.
367
-
368
- Raises:
369
- ValueError:
370
- run_resource_id is invalid.
371
- """
372
- m = re .match (
373
- "projects/(.*)/locations/(.*)/tensorboards/(.*)/experiments/(.*)/runs/(.*)" ,
374
- self ._run_resource_id ,
375
- )
376
- project = m [1 ]
377
- location = m [2 ]
378
- tensorboard = m [3 ]
379
- experiment = m [4 ]
380
- run_name = m [5 ]
381
- experiment_run = experiment_run_resource .ExperimentRun .get (
382
- project = project , location = location , run_name = run_name
383
- )
384
- if not experiment_run :
385
- experiment_run = experiment_run_resource .ExperimentRun .create (
386
- project = project ,
387
- location = location ,
388
- run_name = run_name ,
389
- experiment = experiment ,
390
- tensorboard = tensorboard ,
391
- state = gca_execution .Execution .State .RUNNING ,
392
- )
393
- tb_run_artifact = experiment_run ._backing_tensorboard_run
394
- tb_run = tb_run_artifact .resource
395
- return tb_run
396
-
397
375
def get_or_create (
398
376
self ,
399
377
tag_name : str ,
@@ -416,36 +394,56 @@ def get_or_create(
416
394
A new or existing tensorboard_time_series.TensorboardTimeSeries.
417
395
418
396
Raises:
419
- ValueError :
397
+ exceptions.InvalidArgument :
420
398
The tag_name or time_series_resource_creator is an invalid argument
421
399
to create_tensorboard_time_series api call.
400
+ ExistingResourceNotFoundError:
401
+ Could not find the resource given the tag name.
402
+ ValueError:
403
+ More than one time series with the resource name was found.
422
404
"""
423
405
if tag_name in self ._tag_to_time_series_proto :
424
406
return self ._tag_to_time_series_proto [tag_name ]
425
407
426
- time_series = None
427
- tb_run = self ._get_run_resource ()
428
- time_series_id = tb_run .get_tensorboard_time_series_id (tag_name )
429
- if time_series_id :
430
- time_series = self ._api .get_tensorboard_time_series (
431
- request = tensorboard_service .GetTensorboardTimeSeriesRequest (
432
- name = self ._run_resource_id + "/timeSeries/" + time_series_id
433
- )
408
+ time_series = time_series_resource_creator ()
409
+ time_series .display_name = tag_name
410
+ try :
411
+ time_series = self ._api .create_tensorboard_time_series (
412
+ parent = self ._run_resource_id , tensorboard_time_series = time_series
434
413
)
435
- if not time_series :
436
- time_series = time_series_resource_creator ()
437
- time_series .display_name = tag_name
438
-
439
- try :
440
- time_series = self ._api .create_tensorboard_time_series (
441
- parent = self ._run_resource_id , tensorboard_time_series = time_series
414
+ except exceptions .InvalidArgument as e :
415
+ # If the time series display name already exists then retrieve it
416
+ if "already exist" in e .message :
417
+ list_of_time_series = self ._api .list_tensorboard_time_series (
418
+ request = tensorboard_service .ListTensorboardTimeSeriesRequest (
419
+ parent = self ._run_resource_id ,
420
+ filter = "display_name = {}" .format (json .dumps (str (tag_name ))),
421
+ )
442
422
)
443
- except exceptions .InvalidArgument as e :
444
- raise ValueError (
445
- "Could not find time series resource with display name: {}" .format (
446
- tag_name
423
+ num = 0
424
+ time_series = None
425
+
426
+ for ts in list_of_time_series :
427
+ num += 1
428
+ if num > 1 :
429
+ break
430
+ time_series = ts
431
+
432
+ if not time_series :
433
+ raise ExistingResourceNotFoundError (
434
+ "Could not find time series resource with display name: {}" .format (
435
+ tag_name
436
+ )
437
+ )
438
+
439
+ if num != 1 :
440
+ raise ValueError (
441
+ "More than one time series resource found with display_name: {}" .format (
442
+ tag_name
443
+ )
447
444
)
448
- ) from e
445
+ else :
446
+ raise
449
447
450
448
self ._tag_to_time_series_proto [tag_name ] = time_series
451
449
return time_series
0 commit comments