|
|
|
|
|
|
|
|
|
|
|
|
|
from abc import ABC, abstractmethod |
|
import time |
|
import typing as tp |
|
from dora import Explorer |
|
import treetable as tt |
|
|
|
|
|
def get_sheep_ping(sheep) -> tp.Optional[str]: |
|
"""Return the amount of time since the Sheep made some update |
|
to its log. Returns a str using the relevant time unit.""" |
|
ping = None |
|
if sheep.log is not None and sheep.log.exists(): |
|
delta = time.time() - sheep.log.stat().st_mtime |
|
if delta > 3600 * 24: |
|
ping = f'{delta / (3600 * 24):.1f}d' |
|
elif delta > 3600: |
|
ping = f'{delta / (3600):.1f}h' |
|
elif delta > 60: |
|
ping = f'{delta / 60:.1f}m' |
|
else: |
|
ping = f'{delta:.1f}s' |
|
return ping |
|
|
|
|
|
class BaseExplorer(ABC, Explorer): |
|
"""Base explorer for AudioCraft grids. |
|
|
|
All task specific solvers are expected to implement the `get_grid_metrics` |
|
method to specify logic about metrics to display for a given task. |
|
|
|
If additional stages are used, the child explorer must define how to handle |
|
these new stages in the `process_history` and `process_sheep` methods. |
|
""" |
|
def stages(self): |
|
return ["train", "valid", "evaluate"] |
|
|
|
def get_grid_meta(self): |
|
"""Returns the list of Meta information to display for each XP/job. |
|
""" |
|
return [ |
|
tt.leaf("index", align=">"), |
|
tt.leaf("name", wrap=140), |
|
tt.leaf("state"), |
|
tt.leaf("sig", align=">"), |
|
tt.leaf("sid", align="<"), |
|
] |
|
|
|
@abstractmethod |
|
def get_grid_metrics(self): |
|
"""Return the metrics that should be displayed in the tracking table. |
|
""" |
|
... |
|
|
|
def process_sheep(self, sheep, history): |
|
train = { |
|
"epoch": len(history), |
|
} |
|
parts = {"train": train} |
|
for metrics in history: |
|
for key, sub in metrics.items(): |
|
part = parts.get(key, {}) |
|
if 'duration' in sub: |
|
|
|
sub['duration'] = sub['duration'] / 60. |
|
part.update(sub) |
|
parts[key] = part |
|
ping = get_sheep_ping(sheep) |
|
if ping is not None: |
|
for name in self.stages(): |
|
if name not in parts: |
|
parts[name] = {} |
|
|
|
parts[name]['ping'] = ping |
|
return parts |
|
|