Spaces:
Build error
Build error
| import os | |
| import time | |
| M4_DISABLE_RICH = False | |
| if os.environ.get("M4_DISABLE_RICH", "") == "1": | |
| M4_DISABLE_RICH = True | |
| else: | |
| try: | |
| import rich # noqa | |
| except ModuleNotFoundError: | |
| M4_DISABLE_RICH = True | |
| if not M4_DISABLE_RICH: | |
| from rich.progress import BarColumn, MofNCompleteColumn, Progress, TaskProgressColumn, TimeElapsedColumn | |
| else: | |
| # This is a simple equivalent of some of the `rich`'s classes we use but which doesn't use | |
| # `rich` or any formatting. We use it if there is no `rich` installed or during HPC training | |
| # where we don't use a live console and log to a file instead - so we want easy to read logs and | |
| # `rich`'s output mangling causes more trouble than it helps. | |
| class BarColumn: | |
| def render(self, task): | |
| return "" | |
| class MofNCompleteColumn: | |
| def render(self, task): | |
| if task.total_steps is not None: | |
| total_steps = task.total_steps | |
| else: | |
| total_steps = "UNK" | |
| return f"{task.completed}/{total_steps}" | |
| class TaskProgressColumn: | |
| def render(self, task): | |
| if task.total_steps is not None: | |
| percent = int(task.completed / task.total_steps * 100) | |
| return f"{percent:>3}%" | |
| else: | |
| return "UNK%" | |
| class TimeElapsedColumn: | |
| def render(self, task): | |
| time_diff = time.gmtime(time.time() - task.start_time) | |
| days = int(time.strftime("%j", time_diff)) - 1 | |
| time_str = time.strftime("%H:%M:%S", time_diff) | |
| return f"{days}:{time_str}" | |
| class Task: | |
| def __init__(self, description, total_steps, *args, **kwargs): | |
| self.description = description | |
| self.total_steps = total_steps | |
| self.completed = 0 | |
| self.start_time = time.time() | |
| def step(self, advance_steps): | |
| self.completed += advance_steps | |
| class Progress: | |
| def __init__(self, *args, **kwargs): | |
| self.tasks = [] | |
| self.description = "Progress" | |
| def __enter__(self): | |
| return self | |
| def __exit__(self, *args): | |
| pass | |
| def update(self, task, advance): | |
| task.step(advance) | |
| return self | |
| def add_task(self, description, total, *args, **kwargs): | |
| task = Task(description, total) | |
| self.tasks.append(task) | |
| return task | |