4
0
mirror of https://github.com/nerfstudio-project/nerfstudio.git synced 2026-11-11 18:44:21 +08:00

Eng/better benchmarking (#240)

* add print

* updated benchmark for more fine-grain options
This commit is contained in:
evonneng 2022-08-01 23:14:01 -07:00 committed by GitHub
parent d90d8add66
commit 2c40c1b2bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 66 additions and 27 deletions

View File

@ -5,18 +5,15 @@ import argparse
import json
import logging
import os
from typing import Any, Dict
from datetime import datetime
from typing import Any, Dict, Tuple
import numpy as np
from hydra import compose, initialize
from hydra.core.global_hydra import GlobalHydra
from omegaconf import DictConfig
from tqdm import tqdm
from scripts.run_eval import run_inference_from_config
OBJECT_LIST = ["mic", "ficus", "chair", "hotdog", "materials", "drums", "ship", "lego"]
def _load_best_ckpt(hydra_dir: str, config: DictConfig) -> str:
"""helper function to update config with latest checkpoint in specified hydra_dir
@ -43,7 +40,7 @@ def _load_best_ckpt(hydra_dir: str, config: DictConfig) -> str:
return os.path.join(model_dir, latest_ckpt)
def _load_hydra_config(hydra_dir: str) -> DictConfig:
def _load_hydra_config(hydra_dir: str, benchmark_time=None, benchmark_date=None) -> Tuple[DictConfig, str]:
"""helper function to load the specified hydra config from the specified directory
Args:
@ -52,11 +49,16 @@ def _load_hydra_config(hydra_dir: str) -> DictConfig:
Returns:
DictConfig: returns the loaded hydra dictionary config
"""
basename = sorted(os.listdir(hydra_dir))[-1]
if benchmark_time:
assert benchmark_date is not None
reformat_date = datetime.strptime(benchmark_date, "%m-%d-%Y").strftime("%Y-%m-%d")
basename = f"{reformat_date}_{benchmark_time}"
else:
basename = sorted(os.listdir(hydra_dir))[-1]
hydra_dir = f"{hydra_dir}/{basename}"
initialize(version_base="1.2", config_path=os.path.join("../../", hydra_dir, ".hydra/"))
config = compose("config.yaml")
return config
return config, basename
def _calc_avg(stat_name: str, benchmark: Dict[str, Any]):
@ -70,21 +72,18 @@ def _calc_avg(stat_name: str, benchmark: Dict[str, Any]):
def main(args):
"""Main function."""
benchmarks = {}
for dataset in tqdm(OBJECT_LIST):
# set up trainer, config, and checkpoint loading
hydra_dir = f"{args.hydra_base_dir}/blender_{dataset}_{args.benchmark_date}/{args.graph}/"
config = _load_hydra_config(hydra_dir)
config.data.dataloader_eval.image_indices = None
# set up trainer, config, and checkpoint loading
hydra_dir = f"{args.hydra_base_dir}/blender_{args.item_name}_{args.benchmark_date}/{args.graph}/"
config, basename = _load_hydra_config(
hydra_dir, benchmark_time=args.benchmark_time, benchmark_date=args.benchmark_date
)
# config.data.dataloader_eval.image_indices = None
ckpt = _load_best_ckpt(hydra_dir, config.trainer)
ckpt = _load_best_ckpt(hydra_dir, config.trainer)
# run evaluation
stats_dict = run_inference_from_config(config)
stats_dict["checkpoint"] = ckpt
benchmarks[dataset] = stats_dict
# reset hydra config
GlobalHydra.instance().clear()
# run evaluation
stats_dict = run_inference_from_config(config)
stats_dict["checkpoint"] = ckpt
benchmarks[args.item_name] = stats_dict
avg_rays_per_sec = _calc_avg("avg rays per sec", benchmarks)
avg_fps = _calc_avg("avg fps", benchmarks)
@ -96,7 +95,20 @@ def main(args):
"avg fps": avg_fps,
"results": benchmarks,
}
json_file = os.path.join(args.hydra_base_dir, f"{args.benchmark_date}.json")
json_dir = os.path.join(args.hydra_base_dir, args.graph)
if not os.path.exists(json_dir):
os.makedirs(json_dir)
json_file = os.path.join(json_dir, f"{basename}_{args.item_name}.json")
# if benchmark file already exists, update the results dictionary by overriding existing info or appending.
if os.path.exists(json_file):
with open(json_file, "r", encoding="utf8") as f:
existing_data = json.load(f)
existing_benchmarks = existing_data["results"]
existing_benchmarks.update(benchmarks)
existing_data["results"] = existing_benchmarks
benchmark_info = existing_data
with open(json_file, "w", encoding="utf8") as f:
json.dump(benchmark_info, f, indent=2)
logging.info("saved benchmark results to %s", json_file)
@ -104,8 +116,35 @@ def main(args):
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-g", "--graph", type=str, required=True, help="name of nerf graph to benchmark")
parser.add_argument("-d", "--benchmark_date", type=str, required=True, help="timestamp of run to benchmark")
parser.add_argument(
"-g",
"--graph",
type=str,
required=True,
help="name of nerf graph to benchmark. Note: name without the 'graph_' prefix",
)
parser.add_argument(
"-d",
"--benchmark_date",
type=str,
required=True,
help="date of run to benchmark provided in '%%m-%%d-%%Y' format.",
)
parser.add_argument(
"-i",
"--item_name",
type=str,
required=True,
choices=["mic", "ficus", "chair", "hotdog", "materials", "drums", "ship", "lego"],
help="name of item in blender dataset to benchmark",
)
parser.add_argument(
"-t",
"--benchmark_time",
type=str,
default=None,
help="timestamp of the run to benchmark; if None, will default to running most recent timestamp",
)
parser.add_argument("-o", "--hydra_base_dir", type=str, default="outputs/", help="hydra base output path")
parsed_args = parser.parse_args()
main(parsed_args)

View File

@ -3,7 +3,7 @@ run_eval.py
"""
import enum
import os
from typing import Dict, List, Optional
from typing import Any, Dict, List, Optional
import dcargs
import mediapy as media
@ -62,7 +62,7 @@ def _load_checkpoint(config: DictConfig, graph: Graph) -> None:
print(f"done loading checkpoint from {load_path}")
def run_inference_from_config(config: DictConfig) -> Dict[str, float]:
def run_inference_from_config(config: DictConfig) -> Dict[str, Any]:
"""helper function to run inference given config specifications (also used in benchmarking)
Args: