| 299 | |
| 300 | @classmethod |
| 301 | def test(cls, cfg, model, evaluators=None): |
| 302 | from utils.misc import hook_metadata, hook_switcher, hook_opt |
| 303 | from detectron2.utils.logger import log_every_n_seconds |
| 304 | import datetime |
| 305 | # build dataloade |
| 306 | dataloaders = cls.build_test_loader(cfg, dataset_name=None) |
| 307 | dataset_names = cfg['DATASETS']['TEST'] |
| 308 | model = model.eval().cuda() |
| 309 | model_without_ddp = model |
| 310 | if not type(model) == BaseModel: |
| 311 | model_without_ddp = model.module |
| 312 | |
| 313 | for dataloader, dataset_name in zip(dataloaders, dataset_names): |
| 314 | # build evaluator |
| 315 | evaluator = build_evaluator(cfg, dataset_name, cfg['OUTPUT_DIR']) |
| 316 | evaluator.reset() |
| 317 | with torch.no_grad(): |
| 318 | # setup task |
| 319 | if 'sam' in dataset_names: |
| 320 | task = 'multi_granularity' |
| 321 | else: |
| 322 | task = 'interactive' |
| 323 | |
| 324 | hook_switcher(model_without_ddp, dataset_name) |
| 325 | # setup timer |
| 326 | total = len(dataloader) |
| 327 | num_warmup = min(5, total - 1) |
| 328 | start_time = time.perf_counter() |
| 329 | total_data_time = 0 |
| 330 | total_compute_time = 0 |
| 331 | total_eval_time = 0 |
| 332 | start_data_time = time.perf_counter() |
| 333 | |
| 334 | for idx, batch in enumerate(dataloader): |
| 335 | total_data_time += time.perf_counter() - start_data_time |
| 336 | if idx == num_warmup: |
| 337 | start_time = time.perf_counter() |
| 338 | total_data_time = 0 |
| 339 | total_compute_time = 0 |
| 340 | total_eval_time = 0 |
| 341 | start_compute_time = time.perf_counter() |
| 342 | |
| 343 | # forward |
| 344 | with torch.autocast(device_type='cuda', dtype=torch.float16): |
| 345 | # import ipdb; ipdb.set_trace() |
| 346 | outputs = model(batch, inference_task=task) |
| 347 | |
| 348 | total_compute_time += time.perf_counter() - start_compute_time |
| 349 | start_eval_time = time.perf_counter() |
| 350 | |
| 351 | evaluator.process(batch, outputs) |
| 352 | total_eval_time += time.perf_counter() - start_eval_time |
| 353 | |
| 354 | iters_after_start = idx + 1 - num_warmup * int(idx >= num_warmup) |
| 355 | data_seconds_per_iter = total_data_time / iters_after_start |
| 356 | compute_seconds_per_iter = total_compute_time / iters_after_start |
| 357 | eval_seconds_per_iter = total_eval_time / iters_after_start |
| 358 | total_seconds_per_iter = (time.perf_counter() - start_time) / iters_after_start |