TwT-6's picture
Upload 2667 files
256a159 verified
raw
history blame
2.91 kB
import getpass
from abc import abstractmethod
from typing import Any, Dict, List, Tuple
from mmengine.config import Config, ConfigDict
from opencompass.utils import LarkReporter, get_logger
class BaseRunner:
"""Base class for all runners. A runner is responsible for launching
multiple tasks.
Args:
task (ConfigDict): Task type config.
debug (bool): Whether to run in debug mode.
lark_bot_url (str): Lark bot url.
"""
def __init__(self,
task: ConfigDict,
debug: bool = False,
lark_bot_url: str = None):
self.task_cfg = Config(task)
self.debug = debug
if lark_bot_url:
self.lark_reporter = LarkReporter(lark_bot_url)
else:
self.lark_reporter = None
def __call__(self, tasks: List[Dict[str, Any]]):
"""Launch multiple tasks and summarize the results.
Args:
tasks (list[dict]): A list of task configs, usually generated by
Partitioner.
"""
status = self.launch(tasks)
self.summarize(status)
@abstractmethod
def launch(self, tasks: List[Dict[str, Any]]) -> List[Tuple[str, int]]:
"""Launch multiple tasks.
Args:
tasks (list[dict]): A list of task configs, usually generated by
Partitioner.
Returns:
list[tuple[str, int]]: A list of (task name, exit code).
"""
def summarize(self, status: List[Tuple[str, int]]) -> None:
"""Summarize the results of the tasks.
Args:
status (list[tuple[str, int]]): A list of (task name, exit code).
"""
failed_logs = []
for _task, code in status:
if code != 0:
get_logger().error(f'{_task} failed with code {code}')
failed_logs.append(_task)
if self.lark_reporter:
num_succeeded = len(status) - len(failed_logs)
if len(failed_logs) > 0:
content = f'{getpass.getuser()} \'s '
content += f'{self.task_cfg.type} tasks finished. '
content += f'{num_succeeded} tasks succeeded, '
content += f'{len(failed_logs)} tasks failed. Failed tasks are'
content += ':\n' + '\n'.join(failed_logs)
self.lark_reporter.post(title=f'Bad news: {len(failed_logs)} '
'failed.',
content=content)
else:
content = f'{getpass.getuser()}\'s '
content += f'{self.task_cfg.type} tasks finished. '
content += f'{num_succeeded} tasks succeeded.'
self.lark_reporter.post(title='Great news: all tasks '
'finished!',
content=content)