Source code for otx.cli.utils.report
"""Report Generating for OTX CLI."""
# Copyright (C) 2023 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
import sys
from collections import defaultdict
from pathlib import Path
from pprint import pformat
from typing import Any, Dict, Union
import torch
import otx
from otx.algorithms.common.utils import is_xpu_available
from otx.api.entities.model_template import ModelTemplate
[docs]
def get_otx_report(
model_template: ModelTemplate,
task_config: Dict[str, Any],
data_config: Dict[str, Dict[str, str]],
results: Dict[str, Any],
output_path: Union[str, Path],
):
"""Generate CLI reports."""
dash_line = "-" * 60 + "\n\n"
# Header
report_str = get_otx_cli_ascii_banner()
report_str += dash_line
report_str += f"Current path: {Path.cwd()}\n"
report_str += f"sys.argv: {sys.argv}\n"
report_str += f"OTX: {otx.__version__}\n"
# 1. Machine Environment
report_str += sub_title_to_str("Running Environments")
report_str += env_info_to_str()
# 2. Task Information (Task, Train-type, Etc.)
if model_template and task_config:
report_str += sub_title_to_str("Template Information")
report_str += template_info_to_str(model_template)
# 3. Dataset Configuration
if data_config:
report_str += sub_title_to_str("Dataset Information")
report_str += data_config_to_str(data_config)
# 4. Configurations
report_str += sub_title_to_str("Configurations")
report_str += task_config_to_str(task_config)
# 5. Result Summary
report_str += sub_title_to_str("Results")
for key, value in results.items():
report_str += f"\t{key}: {pformat(value)}\n"
Path(output_path).write_text(report_str, encoding="UTF-8")
[docs]
def sub_title_to_str(title: str):
"""Add sub title for report."""
dash_line = "-" * 60
report_str = ""
report_str += dash_line + "\n\n"
report_str += title + "\n\n"
report_str += dash_line + "\n"
return report_str
[docs]
def env_info_to_str():
"""Get Environments."""
report_str = ""
env_info = {}
try:
from mmcv.utils.env import collect_env
env_info = collect_env()
if "PyTorch compiling details" in env_info:
env_info.pop("PyTorch compiling details")
except ModuleNotFoundError:
env_info["sys.platform"] = sys.platform
env_info["Python"] = sys.version.replace("\n", "")
cuda_available = torch.cuda.is_available()
env_info["CUDA available"] = cuda_available
if cuda_available:
devices = defaultdict(list)
for k in range(torch.cuda.device_count()):
devices[torch.cuda.get_device_name(k)].append(str(k))
for name, device_ids in devices.items():
env_info["GPU " + ",".join(device_ids)] = name
env_info["PyTorch"] = torch.__version__
if is_xpu_available():
devices = defaultdict(list)
for k in range(torch.xpu.device_count()):
devices[torch.xpu.get_device_name(k)].append(str(k))
for name, device_ids in devices.items():
env_info["GPU " + ",".join(device_ids)] = name
for key, value in env_info.items():
report_str += f"\t{key}: {value}\n"
return report_str
[docs]
def template_info_to_str(model_template: ModelTemplate):
"""Get Template information."""
report_str = ""
for key, value in model_template.__dict__.items():
report_str += f"\t{key}: {pformat(value)}\n"
return report_str
[docs]
def data_config_to_str(data_config: Dict[str, Dict[str, str]]):
"""Get Dataset configuration."""
report_str = ""
for subset_key, subset_value in data_config.items():
report_str += f"{subset_key}:\n"
for key, value in subset_value.items():
report_str += f"\t{key}: {value}\n"
return report_str
[docs]
def task_config_to_str(task_config: Dict[str, Any]):
"""Get Task configuration."""
report_str = ""
not_target = ["log_config"]
for target, value in task_config.items():
# Remove otx_dataset from the report as it is unnecessary.
if target == "data" and isinstance(value, dict):
for item in value.values():
if isinstance(item, dict) and "otx_dataset" in item:
del item["otx_dataset"]
if target not in not_target:
report_str += target + ": "
model_str = pformat(value)
report_str += model_str + "\n"
return report_str
[docs]
def get_otx_cli_ascii_banner():
"""Get OTX ASCII banner."""
return """
██████╗ ████████╗ ██╗ ██╗
██╔═══██╗ ╚══██╔══╝ ╚██╗██╔╝
██║ ██║ ██║ ╚███╔╝
██║ ██║ ██║ ██╔██╗
╚██████╔╝ ██║ ██╔╝ ██╗
╚═════╝ ╚═╝ ╚═╝ ╚═╝
"""