Skip to content

Commit 8980e0a

Browse files
committed
merge single-gpu and mutiple gpu infer
1 parent 2f36c1c commit 8980e0a

10 files changed

Lines changed: 39 additions & 45 deletions

File tree

det-yolov5-tmi/mypy.ini

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
ignore_missing_imports = True
33
disallow_untyped_defs = False
44
exclude = [utils/general.py, models/*.py, utils/*.py]
5-
files = mining/*.py, utils/ymir_yolov5.py, start.py, train.py
65

76
[mypy-torch.*]
87
ignore_errors = True

det-yolov5-tmi/ymir/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ docker build -t ymir/ymir-executor:ymir1.1.0-cuda111-yolov5-tmi --build-arg SERV
99

1010
## main change log
1111

12-
- add `start.py` and `utils/ymir_yolov5.py` for train/infer/mining
12+
- add `start.py` and `ymir/ymir_yolov5.py` for train/infer/mining
1313

14-
- add `utils/ymir_yolov5.py` for useful functions
14+
- add `ymir/ymir_yolov5.py` for useful functions
1515

1616
- `get_merged_config()` add ymir path config `cfg.yaml` and hyper-parameter `cfg.param`
1717

det-yolov5-tmi/ymir/mining/data_augment.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88
import cv2
99
import numpy as np
1010
from nptyping import NDArray
11-
12-
from utils.ymir_yolov5 import BBOX, CV_IMAGE
11+
from ymir.ymir_yolov5 import BBOX, CV_IMAGE
1312

1413

1514
def intersect(boxes1: BBOX, boxes2: BBOX) -> NDArray:

det-yolov5-tmi/ymir/mining/util.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@
1919
import cv2
2020
import numpy as np
2121
import torch.utils.data as td
22-
from mining.data_augment import cutout, horizontal_flip, intersect, resize, rotate
2322
from nptyping import NDArray
2423
from scipy.stats import entropy
2524
from torch.utils.data._utils.collate import default_collate
2625
from utils.augmentations import letterbox
27-
from utils.ymir_yolov5 import BBOX
26+
from ymir.mining.data_augment import cutout, horizontal_flip, intersect, resize, rotate
27+
from ymir.ymir_yolov5 import BBOX
2828

2929
LOCAL_RANK = int(os.getenv('LOCAL_RANK', -1)) # https://pytorch.org/docs/stable/elastic/run.html
3030
RANK = int(os.getenv('RANK', -1))

det-yolov5-tmi/ymir/mining/ymir_infer.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@
1212
import torch.distributed as dist
1313
import torch.utils.data as td
1414
from easydict import EasyDict as edict
15-
from mining.util import YmirDataset, load_image_file
1615
from tqdm import tqdm
1716
from utils.general import scale_coords
18-
from utils.ymir_yolov5 import YmirYolov5
17+
from ymir.mining.util import YmirDataset, load_image_file
18+
from ymir.ymir_yolov5 import YmirYolov5
1919
from ymir_exc import result_writer as rw
2020
from ymir_exc.util import YmirStage, get_merged_config
2121

@@ -44,7 +44,10 @@ def run(ymir_cfg: edict, ymir_yolov5: YmirYolov5):
4444

4545
max_barrier_times = len(images) // max(1, WORLD_SIZE) // batch_size_per_gpu
4646
# origin dataset
47-
images_rank = images[RANK::WORLD_SIZE]
47+
if RANK != -1:
48+
images_rank = images[RANK::WORLD_SIZE]
49+
else:
50+
images_rank = images
4851
origin_dataset = YmirDataset(images_rank, load_fn=load_fn)
4952
origin_dataset_loader = td.DataLoader(origin_dataset,
5053
batch_size=batch_size_per_gpu,
@@ -80,7 +83,7 @@ def run(ymir_cfg: edict, ymir_yolov5: YmirYolov5):
8083
result_per_image.append(det)
8184
results.append(dict(image_file=image_file, result=result_per_image))
8285

83-
torch.save(results, f'/out/infer_results_{RANK}.pt')
86+
torch.save(results, f'/out/infer_results_{max(0,RANK)}.pt')
8487

8588

8689
def main() -> int:

det-yolov5-tmi/ymir/mining/ymir_mining_aldd.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@
1717
import torch.nn.functional as F
1818
import torch.utils.data as td
1919
from easydict import EasyDict as edict
20-
from mining.util import YmirDataset, load_image_file
2120
from tqdm import tqdm
22-
from utils.ymir_yolov5 import YmirYolov5
21+
from ymir.mining.util import YmirDataset, load_image_file
22+
from ymir.ymir_yolov5 import YmirYolov5
2323
from ymir_exc import result_writer as rw
2424
from ymir_exc.util import YmirStage, get_merged_config
2525

det-yolov5-tmi/ymir/mining/ymir_mining_cald.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@
1414
import torch.distributed as dist
1515
import torch.utils.data as td
1616
from easydict import EasyDict as edict
17-
from mining.util import (YmirDataset, collate_fn_with_fake_ann, load_image_file, load_image_file_with_ann,
18-
update_consistency)
1917
from tqdm import tqdm
2018
from utils.general import scale_coords
21-
from utils.ymir_yolov5 import YmirYolov5
19+
from ymir.mining.util import (YmirDataset, collate_fn_with_fake_ann, load_image_file, load_image_file_with_ann,
20+
update_consistency)
21+
from ymir.ymir_yolov5 import YmirYolov5
2222
from ymir_exc import result_writer as rw
2323
from ymir_exc.util import YmirStage, get_merged_config
2424

@@ -47,7 +47,10 @@ def run(ymir_cfg: edict, ymir_yolov5: YmirYolov5):
4747

4848
max_barrier_times = (len(images) // max(1, WORLD_SIZE)) // batch_size_per_gpu
4949
# origin dataset
50-
images_rank = images[RANK::WORLD_SIZE]
50+
if RANK != -1:
51+
images_rank = images[RANK::WORLD_SIZE]
52+
else:
53+
images_rank = images
5154
origin_dataset = YmirDataset(images_rank, load_fn=load_fn)
5255
origin_dataset_loader = td.DataLoader(origin_dataset,
5356
batch_size=batch_size_per_gpu,

det-yolov5-tmi/ymir/mining/ymir_mining_entropy.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414
import torch.distributed as dist
1515
import torch.utils.data as td
1616
from easydict import EasyDict as edict
17-
from mining.util import YmirDataset, load_image_file
1817
from tqdm import tqdm
19-
from utils.ymir_yolov5 import YmirYolov5
18+
from ymir.mining.util import YmirDataset, load_image_file
19+
from ymir.ymir_yolov5 import YmirYolov5
2020
from ymir_exc import result_writer as rw
2121
from ymir_exc.util import YmirStage, get_merged_config
2222

@@ -45,7 +45,10 @@ def run(ymir_cfg: edict, ymir_yolov5: YmirYolov5):
4545

4646
max_barrier_times = (len(images) // max(1, WORLD_SIZE)) // batch_size_per_gpu
4747
# origin dataset
48-
images_rank = images[RANK::WORLD_SIZE]
48+
if RANK != -1:
49+
images_rank = images[RANK::WORLD_SIZE]
50+
else:
51+
images_rank = images
4952
origin_dataset = YmirDataset(images_rank, load_fn=load_fn)
5053
origin_dataset_loader = td.DataLoader(origin_dataset,
5154
batch_size=batch_size_per_gpu,

det-yolov5-tmi/ymir/mining/ymir_mining_random.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import torch.distributed as dist
1414
from easydict import EasyDict as edict
1515
from tqdm import tqdm
16-
from utils.ymir_yolov5 import YmirYolov5
16+
from ymir.ymir_yolov5 import YmirYolov5
1717
from ymir_exc import result_writer as rw
1818
from ymir_exc.util import YmirStage, get_merged_config
1919

@@ -31,7 +31,10 @@ def run(ymir_cfg: edict, ymir_yolov5: YmirYolov5):
3131
with open(ymir_cfg.ymir.input.candidate_index_file, 'r') as f:
3232
images = [line.strip() for line in f.readlines()]
3333

34-
images_rank = images[RANK::WORLD_SIZE]
34+
if RANK != -1:
35+
images_rank = images[RANK::WORLD_SIZE]
36+
else:
37+
images_rank = images
3538
mining_results = dict()
3639
dataset_size = len(images_rank)
3740
pbar = tqdm(images_rank) if RANK == 0 else images_rank

det-yolov5-tmi/ymir/start.py

Lines changed: 7 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import cv2
77
from easydict import EasyDict as edict
88
from models.experimental import attempt_download
9-
from utils.ymir_yolov5 import YmirYolov5, convert_ymir_to_yolov5, get_weight_file
9+
from ymir.ymir_yolov5 import YmirYolov5, convert_ymir_to_yolov5, get_weight_file
1010
from ymir_exc import dataset_reader as dr
1111
from ymir_exc import env, monitor
1212
from ymir_exc import result_writer as rw
@@ -124,10 +124,10 @@ def _run_mining(cfg: edict, task_idx: int = 0, task_num: int = 1) -> None:
124124
raise Exception(f'unknown mining algorithm {mining_algorithm}, not in {support_mining_algorithms}')
125125

126126
if gpu_count <= 1:
127-
command = f'python3 mining/ymir_mining_{mining_algorithm}.py'
127+
command = f'python3 ymir/mining/ymir_mining_{mining_algorithm}.py'
128128
else:
129129
port = find_free_port()
130-
command = f'python3 -m torch.distributed.launch --nproc_per_node {gpu_count} --master_port {port} mining/ymir_mining_{mining_algorithm}.py' # noqa
130+
command = f'python3 -m torch.distributed.launch --nproc_per_node {gpu_count} --master_port {port} ymir/mining/ymir_mining_{mining_algorithm}.py' # noqa
131131

132132
logging.info(f'mining: {command}')
133133
subprocess.run(command.split(), check=True)
@@ -147,29 +147,13 @@ def _run_infer(cfg: edict, task_idx: int = 0, task_num: int = 1) -> None:
147147
gpu_count: int = len(gpu_id.split(',')) if gpu_id else 0
148148

149149
if gpu_count <= 1:
150-
N = dr.items_count(env.DatasetType.CANDIDATE)
151-
infer_result = dict()
152-
model = YmirYolov5(cfg)
153-
idx = -1
154-
155-
monitor_gap = max(1, N // 100)
156-
for asset_path, _ in dr.item_paths(dataset_type=env.DatasetType.CANDIDATE):
157-
img = cv2.imread(asset_path)
158-
result = model.infer(img)
159-
infer_result[asset_path] = result
160-
idx += 1
161-
162-
if idx % monitor_gap == 0:
163-
percent = get_ymir_process(stage=YmirStage.TASK, p=idx / N, task_idx=task_idx, task_num=task_num)
164-
monitor.write_monitor_logger(percent=percent)
165-
166-
rw.write_infer_result(infer_result=infer_result)
150+
command = 'python3 ymir/mining/ymir_infer.py'
167151
else:
168152
port = find_free_port()
169-
command = f'python3 -m torch.distributed.launch --nproc_per_node {gpu_count} --master_port {port} mining/ymir_infer.py' # noqa
153+
command = f'python3 -m torch.distributed.launch --nproc_per_node {gpu_count} --master_port {port} ymir/mining/ymir_infer.py' # noqa
170154

171-
logging.info(f'infer: {command}')
172-
subprocess.run(command.split(), check=True)
155+
logging.info(f'infer: {command}')
156+
subprocess.run(command.split(), check=True)
173157

174158
monitor.write_monitor_logger(
175159
percent=get_ymir_process(stage=YmirStage.POSTPROCESS, p=1.0, task_idx=task_idx, task_num=task_num))

0 commit comments

Comments
 (0)