์ฐธ์กฐ ultralytics/utils/torch_utils.py
์ฐธ๊ณ
์ด ํ์ผ์ https://github.com/ultralytics/ ultralytics/blob/main/ ultralytics/utils/ torch_utils .py์์ ํ์ธํ ์ ์์ต๋๋ค. ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ํ ๋ฆฌํ์คํธ (๐ ๏ธ) ๋ฅผ ํตํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ก ๋์์ฃผ์ธ์. ๊ฐ์ฌํฉ๋๋ค ๐!
ultralytics.utils.torch_utils.ModelEMA
https://github.com/rwightman/pytorch-image-models์์ ์ง์ ์ด๋ ํ๊ท (EMA)์ ์
๋ฐ์ดํธํ์ต๋๋ค.
๋ชจ๋ธ state_dict(๋งค๊ฐ๋ณ์ ๋ฐ ๋ฒํผ)์ ๋ชจ๋ ํญ๋ชฉ์ ์ด๋ ํ๊ท ์ ์ ์งํฉ๋๋ค.
EMA์ ๋ํ ์์ธํ ๋ด์ฉ์ https://www.tensorflow.org/api_docs/python/tf/train/ExponentialMovingAverage๋ฅผ ์ฐธ์กฐํ์ธ์.
EMA๋ฅผ ๋นํ์ฑํํ๋ ค๋ฉด enabled
์์ฑ์ False
.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
__init__(model, decay=0.9999, tau=2000, updates=0)
EMA๋ฅผ ๋ง๋ญ๋๋ค.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
update(model)
EMA ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
update_attr(model, include=(), exclude=('process_group', 'reducer'))
์์ฑ์ ์ ๋ฐ์ดํธํ๊ณ ์ตํฐ๋ง์ด์ ๊ฐ ์ ๊ฑฐ๋ ์ํ์์ ์ ๊ฑฐ๋ ๋ชจ๋ธ์ ์ ์ฅํฉ๋๋ค.
ultralytics.utils.torch_utils.EarlyStopping
์ง์ ๋ ํ์์ ์ํฌํฌ๊ฐ ์ง๋๋ ๊ฐ์ ๋์ง ์์ผ๋ฉด ํ๋ จ์ ์ค๋จํ๋ ์กฐ๊ธฐ ์ค๋จ ํด๋์ค์ ๋๋ค.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
__call__(epoch, fitness)
๊ต์ก ์ค๋จ ์ฌ๋ถ๋ฅผ ํ์ธํฉ๋๋ค.
๋งค๊ฐ๋ณ์:
์ด๋ฆ | ์ ํ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
---|---|---|---|
epoch |
int
|
๊ต์ก์ ํ์ฌ ์๋ |
ํ์ |
fitness |
float
|
ํ์ฌ ์๋์ ํผํธ๋์ค ๊ฐ์น |
ํ์ |
๋ฐํํฉ๋๋ค:
์ ํ | ์ค๋ช |
---|---|
bool
|
ํ๋ จ์ ์ค๋จํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฐธ, ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฑฐ์ง |
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
__init__(patience=50)
์กฐ๊ธฐ ์ ์ง ์ค๋ธ์ ํธ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
๋งค๊ฐ๋ณ์:
์ด๋ฆ | ์ ํ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
---|---|---|---|
patience |
int
|
์ฒด๋ ฅ ๊ฐ์ ์ด ๋ฉ์ถ ํ ๋ฉ์ถ๊ธฐ๊น์ง ๊ธฐ๋ค๋ฆด ์ํฌํฌ ์์ ๋๋ค. |
50
|
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.torch_distributed_zero_first(local_rank)
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ์ฐ ํธ๋ ์ด๋์ ๋ชจ๋ ํ๋ก์ธ์ค๊ฐ ๊ฐ ๋ก์ปฌ ๋ง์คํฐ๊ฐ ๋ฌด์ธ๊ฐ๋ฅผ ํ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋๋ก ํฉ๋๋ค.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.smart_inference_mode()
torch>=1.9.0์ด๋ฉด torch.inference_mode() ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ฉํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด torch.no_grad() ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ ์ฉํฉ๋๋ค.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.get_cpu_info()
์์คํ CPU ์ ๋ณด๊ฐ ํฌํจ๋ ๋ฌธ์์ด(์: 'Apple M2')์ ๋ฐํํฉ๋๋ค.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.select_device(device='', batch=0, newline=False, verbose=True)
์ ๊ณต๋ ์ธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์ ํ PyTorch ์ฅ์น๋ฅผ ์ ํํฉ๋๋ค.
์ด ํจ์๋ ๋๋ฐ์ด์ค๋ฅผ ์ง์ ํ๋ ๋ฌธ์์ด ๋๋ torch.device ๊ฐ์ฒด๋ฅผ ๋ฐ์ ์ ํํ ๋๋ฐ์ด์ค๋ฅผ ๋ํ๋ด๋ torch.device ๊ฐ์ฒด( ๋ฅผ ๋ฐํํฉ๋๋ค. ๋ํ ์ด ํจ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๋๋ฐ์ด์ค ์๋ฅผ ๊ฒ์ฆํ๊ณ ์์ฒญ๋ ๋๋ฐ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค.
๋งค๊ฐ๋ณ์:
์ด๋ฆ | ์ ํ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
---|---|---|---|
device |
str | device
|
๋๋ฐ์ด์ค ๋ฌธ์์ด ๋๋ torch.device ๊ฐ์ฒด. ์ต์ ์ '์์', 'cpu', 'cuda' ๋๋ '0' ๋๋ '0,1,2,3'์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ ๋น ๋ฌธ์์ด๋ก, ์ฌ์ฉ ๊ฐ๋ฅํ ์ฒซ ๋ฒ์งธ GPU๋ฅผ ์๋ ์ ํํฉ๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ ์ฒซ ๋ฒ์งธ GPU, ์ฌ์ฉ ๊ฐ๋ฅํ GPU๊ฐ ์๋ ๊ฒฝ์ฐ CPU๋ฅผ ์๋์ผ๋ก ์ ํํฉ๋๋ค. |
''
|
batch |
int
|
๋ชจ๋ธ์์ ์ฌ์ฉ ์ค์ธ ๋ฐฐ์น ํฌ๊ธฐ์ ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 0์ ๋๋ค. |
0
|
newline |
bool
|
True์ด๋ฉด ๋ก๊ทธ ๋ฌธ์์ด ๋์ ์ ์ค์ ์ถ๊ฐํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ False์ ๋๋ค. |
False
|
verbose |
bool
|
True์ธ ๊ฒฝ์ฐ ์ฅ์น ์ ๋ณด๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ True์ ๋๋ค. |
True
|
๋ฐํํฉ๋๋ค:
์ ํ | ์ค๋ช |
---|---|
device
|
์ ํํ ์ฅ์น. |
์ฌ๋ฆฌ๋ค:
์ ํ | ์ค๋ช |
---|---|
ValueError
|
์ง์ ๋ ์ฅ์น๋ฅผ ์ฌ์ฉํ ์ ์๊ฑฐ๋ ๋ฐฐ์น ํฌ๊ธฐ๊ฐ ์ฅ์น ์์ ๋ฐฐ์๊ฐ ์๋ ๊ฒฝ์ฐ ๋๋ฐ์ด์ค ์์ ๋ฐฐ์๊ฐ ์๋ ๊ฒฝ์ฐ. |
์์:
์ฐธ๊ณ
์ฌ์ฉํ GPU๋ฅผ ์ง์ ํ๊ธฐ ์ํ 'CUDA_VISIBLE_DEVICES' ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํฉ๋๋ค.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
|
ultralytics.utils.torch_utils.time_sync()
ultralytics.utils.torch_utils.fuse_conv_and_bn(conv, bn)
Conv2d() ๋ฐ BatchNorm2d() ๋ ์ด์ด ์ตํฉ https://tehnokv.com/posts/fusing-batchnorm-and-conv/.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.fuse_deconv_and_bn(deconv, bn)
ConvTranspose2d() ๋ฐ BatchNorm2d() ๋ ์ด์ด๋ฅผ ์ตํฉํฉ๋๋ค.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.model_info(model, detailed=False, verbose=True, imgsz=640)
๋ชจ๋ธ ์ ๋ณด.
imgsz๋ int ๋๋ ๋ฆฌ์คํธ์ผ ์ ์์ต๋๋ค(์: imgsz=640 ๋๋ imgsz=[640, 320]).
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.get_num_params(model)
ultralytics.utils.torch_utils.get_num_gradients(model)
YOLO ๋ชจ๋ธ์์ ๊ทธ๋ผ๋ฐ์ด์ ์ด ์๋ ํ๋ผ๋ฏธํฐ์ ์ด ๊ฐ์๋ฅผ ๋ฐํํฉ๋๋ค.
ultralytics.utils.torch_utils.model_info_for_loggers(trainer)
์ ์ฉํ ๋ชจ๋ธ ์ ๋ณด๊ฐ ํฌํจ๋ ๋ชจ๋ธ ์ ๋ณด ๋์ ๋๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค.
์
YOLOv8n ๋ก๊ฑฐ๋ฅผ ์ํ ์ ๋ณด
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.get_flops(model, imgsz=640)
YOLO ๋ชจ๋ธ์ ํ๋กญ์ ๋ฐํํฉ๋๋ค.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.get_flops_with_torch_profiler(model, imgsz=640)
๋ชจ๋ธ ํ๋กญ์ ๊ณ์ฐํฉ๋๋ค(ํ ํจํค์ง ๋์์ด์ง๋ง ์ํ๊น๊ฒ๋ 2~10๋ฐฐ ๋๋ฆฝ๋๋ค).
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.initialize_weights(model)
๋ชจ๋ธ ๊ฐ์ค์น๋ฅผ ์์์ ๊ฐ์ผ๋ก ์ด๊ธฐํํฉ๋๋ค.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.scale_img(img, ratio=1.0, same_shape=False, gs=32)
์ฃผ์ด์ง ๋น์จ๊ณผ ๊ทธ๋ฆฌ๋ ํฌ๊ธฐ gs๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ฏธ์ง img(bs,3,y,x)์ ํฌ๊ธฐ์ ํจ๋๋ฅผ ์กฐ์ ํ์ฌ tensor ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํฉ๋๋ค(์ ํ ์ฌํญ). ์๋ ๋ชจ์์ ์ ์งํฉ๋๋ค.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.make_divisible(x, divisor)
์ ์๋ก ๋๋ ์ ์๋ ๊ฐ์ฅ ๊ฐ๊น์ด x๋ฅผ ๋ฐํํฉ๋๋ค.
ultralytics.utils.torch_utils.copy_attr(a, b, include=(), exclude=())
ํน์ ์์ฑ์ ํฌํจ/์ ์ธํ๋ ์ต์ ๊ณผ ํจ๊ป ๊ฐ์ฒด 'b'์์ ๊ฐ์ฒด 'a'๋ก ์์ฑ์ ๋ณต์ฌํฉ๋๋ค.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.get_latest_opset()
์ด ๋ฒ์ ์์ ์ง์ํ๋ ๋ ๋ฒ์งธ๋ก ์ต๊ทผ์ ONNX ์ด์ ์ค์ ๋ฒ์ ( PyTorch)์ ๋ฐํํ๋ฉฐ, ๋ง๊ธฐ์ ๋ง๊ฒ ์กฐ์ ํฉ๋๋ค.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.intersect_dicts(da, db, exclude=())
da ๊ฐ์ ์ฌ์ฉํ์ฌ '์ ์ธ' ํค๋ฅผ ์ ์ธํ๊ณ ์ผ์นํ๋ ๋ชจ์์ ๊ฐ์ง ๊ต์ฐจ ํค์ ์ฌ์ ์ ๋ฐํํฉ๋๋ค.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.is_parallel(model)
ultralytics.utils.torch_utils.de_parallel(model)
๋ชจ๋ธ ๋ณ๋ ฌํ ํด์ : ๋ชจ๋ธ์ด DP ๋๋ DDP ์ ํ์ธ ๊ฒฝ์ฐ ๋จ์ผ GPU ๋ชจ๋ธ์ ๋ฐํํฉ๋๋ค.
ultralytics.utils.torch_utils.one_cycle(y1=0.0, y2=1.0, steps=100)
y1์์ y2๊น์ง์ ์ฌ์ธ ๊ณก์ ๋จํ์ ๋ํ ๋๋ค ํจ์๋ฅผ ๋ฐํํฉ๋๋ค https://arxiv.org/pdf/1812.01187.pdf.
ultralytics.utils.torch_utils.init_seeds(seed=0, deterministic=False)
๋์ ์์ฑ๊ธฐ(RNG) ์๋ ์ด๊ธฐํ https://pytorch.org/docs/stable/notes/randomness.html.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.strip_optimizer(f='best.pt', s='')
'f'์์ ์ตํฐ๋ง์ด์ ๋ฅผ ์ ๊ฑฐํ์ฌ ๊ต์ก์ ์๋ฃํ๊ณ , ์ ํ์ ์ผ๋ก 's'๋ก ์ ์ฅํฉ๋๋ค.
๋งค๊ฐ๋ณ์:
์ด๋ฆ | ์ ํ | ์ค๋ช | ๊ธฐ๋ณธ๊ฐ |
---|---|---|---|
f |
str
|
ํ์ผ ๊ฒฝ๋ก์ ์ตํฐ๋ง์ด์ ๋ฅผ ์ ๊ฑฐํ ๋ชจ๋ธ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 'best.pt'์ ๋๋ค. |
'best.pt'
|
s |
str
|
ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ์ฌ ์ตํฐ๋ง์ด์ ๊ฐ ์ ๊ฑฐ๋ ๋ชจ๋ธ์ ์ ์ฅํฉ๋๋ค. ์ ๊ณตํ์ง ์์ผ๋ฉด 'f'๋ฅผ ๋ฎ์ด์๋๋ค. |
''
|
๋ฐํํฉ๋๋ค:
์ ํ | ์ค๋ช |
---|---|
None
|
์์ |
์
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.convert_optimizer_state_dict_to_fp16(state_dict)
์ฃผ์ด์ง ์ตํฐ๋ง์ด์ ์ state_dict๋ฅผ tensor ๋ณํ์ ์ํ 'state' ํค์ ์ด์ ์ ๋ง์ถฐ FP16์ผ๋ก ๋ณํํฉ๋๋ค.
์ด ๋ฐฉ๋ฒ์tensor ์ด์ธ์ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ๋ 'param_groups'๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ์ ์ฅ์ ํฌ๊ธฐ๋ฅผ ์ค์ด๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
ultralytics.utils.torch_utils.profile(input, ops, n=10, device=None)
Ultralytics ์๋, ๋ฉ๋ชจ๋ฆฌ ๋ฐ FLOPs ํ๋กํ์ผ๋ฌ.
์
์ ์์ค ์ฝ๋ ultralytics/utils/torch_utils.py
์์ฑ 2023-11-12, ์ ๋ฐ์ดํธ 2024-05-08
์์ฑ์: Burhan-Q (1), ๊ธ๋ -์กฐ์ฒ (4), ์๋-ํ (1)