๋ฒ๊ทธ๋ pytorch/examples#148์ ์ค๋ช ๋์ด ์์ต๋๋ค. ์์ ์ฝ๋๊ฐ ๊นจ๋ํด ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด PyTorch ์์ฒด์ ๋ฒ๊ทธ์ธ์ง ๊ถ๊ธํฉ๋๋ค. ๋ํ ์ด๊ฒ์ด #1120๊ณผ ๊ด๋ จ์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค.
๋ก๋๊ฐ ์ค์ง๋๋ฉด ์ผ๋ง๋ ๋ง์ ์ฌ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ต๋๊น?
@apaszke top
๋ฅผ ํ์ธํ๋ฉด ๋๋จธ์ง ๋ฉ๋ชจ๋ฆฌ(์บ์๋ ๋ฉ๋ชจ๋ฆฌ๋ ์ฌ์ฉ๋ ๊ฒ์ผ๋ก ๊ณ์ฐ๋จ)๋ ์ผ๋ฐ์ ์ผ๋ก 2GB์
๋๋ค. ๊ทธ๋ฌ๋ ์บ์๋ ๊ฒ์ ์ฌ์ฉํ ๊ฒ์ผ๋ก ๊ณ์ฐํ์ง ์์ผ๋ฉด ํญ์ 30GB ์ด์์
๋๋ค.
๋ํ ์ ํจ์ฑ ๊ฒ์ฌ ์์ ์ ํญ์ ์ค์ง๋์ง๋ง ๋ค๋ฅธ ๊ณณ์์๋ ์ค์ง๋์ง ์๋ ์ด์ ๋ฅผ ์ดํดํ ์ ์์ต๋๋ค.
์๋ง๋ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํด ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ ํ์ ์ด๊ณผํ๋ ๋ณ๋์ ๋ก๋๊ฐ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ผ ์ ์์ต๋๋ค.
@ngimel
๋ฐฉ๊ธ ํ๋ก๊ทธ๋จ์ ๋ค์ ์คํํ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋งํ์ต๋๋ค.
top
์ถ๋ ฅ:
~~~
์๋จ - 17:51:18 ์ต๋ 2์ผ, 21:05, 2๋ช
์ ์ฌ์ฉ์, ๋ก๋ ํ๊ท : 0.49, 3.00, 5.41
์์
: ์ด 357๊ฐ, ์คํ 2๊ฐ, ์ ์๊ธฐ 355๊ฐ, ์ค์ง 0๊ฐ, ์ข๋น 0๊ฐ
%Cpu(s): 1.9 us, 0.1 sy, 0.7 ni, 97.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: ์ด 65863816๊ฐ, 60115084๊ฐ ์ฌ์ฉ๋จ, 5748732๊ฐ ์ฌ์ฉ ๊ฐ๋ฅ, 1372688๊ฐ ๋ฒํผ
KiB ์ค์: ์ด 5917692, 620 ์ฌ์ฉ, 5917072 ๋ฌด๋ฃ. 51154784 ์บ์๋ ๋ฉ๋ชจ๋ฆฌ
PID ์ฌ์ฉ์ PR NI VIRT RES SHR S %CPU %MEM TIME+ ๋ช
๋ น 3067 aalreja 20 0 143332 101816 21300 R 46.1 0.2 1631:44 Xvnc
16613 ์๋ ์ 30 10 32836 4880 3912 S 16.9 0.0 1:06.92 fiberlamp 3221 ์๋ ์ 20 0 8882348 1.017g 110120 S 1.579 1.6 MATLAB
1285 ๋ฃจํธ 20 0 1404848 48252 25580 S 0.3 0.1 6:00.12 dockerd 16597 ymengz+ 20 0 25084 3252 2572 R 0.3 0.5 6 0:0
1 ๋ฃจํธ 20 0 33616 4008 2624 S 0.0 0.0 0:01.43 ์ด๊ธฐํ
~~~
free
์ถ๋ ฅ
~yimengzh_everyday@yimengzh :~$ ๋ฌด๋ฃ์ฌ์ฉ๋ ์ด ์ฌ์ฉ ๊ฐ๋ฅํ ๊ณต์ ๋ฒํผ ์บ์๋ฉ๋ชจ: 65863816 60122060 5741756 9954628 1372688 51154916-/+ ๋ฒํผ/์บ์: 7594456 58269360์ค์: 5917692 620 5917072~
nvidia-smi
์ถ๋ ฅ
~~~
yimengzh_everyday@yimengzh :~$ nvidia-smi
2017๋
4์ 25์ผ ํ 17:52:38
+---------------------------------------------------------------- --------------------------+
| NVIDIA-SMI 375.39 ๋๋ผ์ด๋ฒ ๋ฒ์ : 375.39 |
|------------------------------+-------------------- --+----------------------+
| GPU ์ด๋ฆ ์ง์์ฑ-M| ๋ฒ์ค ID Disp.A | ํ๋ฐ์ฑ ๋ถ์ ํ. ECC |
| ํฌ ์จ๋ ์ฑ๋ฅ Pwr: ์ฌ์ฉ๋/์บก | ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ | GPU ํ์ฉ ์ปดํจํ
M. |
|====================================================== =====+========================|
| 0 GeForce GTX TIT... ๋๊ธฐ | 0000:03:00.0 ๋๊ธฐ | ํด๋น ์์ |
| 30% 42C P8 14W / 250W | 3986MiB / 6082MiB | 0% ๊ธฐ๋ณธ๊ฐ |
+-------------------------------+-------------------- --+----------------------+
| 1 Tesla K40c ๋๊ธฐ | 0000:81:00.0 ๋๊ธฐ | ๋๊ธฐ |
| 0% 46C P0 57W / 235W | 0MiB / 12205MiB | 0% ๊ธฐ๋ณธ๊ฐ |
+-------------------------------+-------------------- --+----------------------+
+---------------------------------------------------------------- --------------------------+
| ํ๋ก์ธ์ค: GPU ๋ฉ๋ชจ๋ฆฌ |
| GPU PID ์ ํ ํ๋ก์ธ์ค ์ด๋ฆ ์ฌ์ฉ๋ฒ |
|==================================================== ==============================|
| 0 16509 C ํ์ด์ฌ 3970MiB |
+---------------------------------------------------------------- --------------------------+
~~~
๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ ์๋ ๊ฒ ๊ฐ์์.
๊ณต์ ๋ฉ๋ชจ๋ฆฌ์๋ ๋ณ๋์ ์ ํ์ด ์์ต๋๋ค. ipcs -lm
๋๋ cat /proc/sys/kernel/shmall
๋ฐ cat /proc/sys/kernel/shmmax
๋ฅผ) ์๋ํ ์ ์์ต๋๊น? ๋ํ ๋ ์ ์ ์์ ์์
์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํฉ๋๊น(์: ์์
์ 1๋ช
์ ๊ทน๋จ์ ์ธ ๊ฒฝ์ฐ๋ก ํ
์คํธ)?
@apaszke
~~~
yimengzh_everyday@yimengzh :~$ ipcs -lm
------ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ ํ --------
์ต๋ ์ธ๊ทธ๋จผํธ ์ = 4096
์ต๋ ์ธ๊ทธ๋จผํธ ํฌ๊ธฐ(KB) = 18014398509465599
์ต๋ ์ด ๊ณต์ ๋ฉ๋ชจ๋ฆฌ(KB) = 18446744073642442748
์ต์ ์ธ๊ทธ๋จผํธ ํฌ๊ธฐ(๋ฐ์ดํธ) = 1
yimengzh_everyday@yimengzh :~$ ๊ณ ์์ด /proc/sys/kernel/shmall
18446744073692774399
yimengzh_everyday@yimengzh :~$ ๊ณ ์์ด /proc/sys/kernel/shmmax
18446744073692774399
~~~
๊ทธ๋ค์ ๋น์ ์ ์ด๋ป๊ฒ ์ฐพ๋์?
๋ ์ ์ ์์ ๋ ธ๋์์ ๊ดํด์๋, ๋๋ ๊ทธ๊ฒ์ด ์์ฃผ ์ผ์ด๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค. (์ง๊ธ ์๋ํ ์ ์์ต๋๋ค). ํ์ง๋ง ์ค์ ๋ก๋ ๊ทธ๋ ๊ฒ ๋ง์ ์ผ๊พผ์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ต๋ 4096๊ฐ์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ๊ฐ ํ์ฉ๋ฉ๋๋ค. ๋ฌธ์ ์ผ ์ ์์ต๋๋ค. /proc/sys/kernel/shmmni
(8192๋ฅผ ์๋ํ ์ ์์)์ ์์ฑํ์ฌ ๊ฐ์ ๋๋ฆด ์ ์์ต๋๋ค. ์ํผ์ ์ ๊ถํ์ด ํ์ํ ์ ์์ต๋๋ค.
@apaszke ๊ธ์ ์ด๊ฒ๋ค์ Ubuntu์ CentOS 6์ ๊ธฐ๋ณธ๊ฐ์ ๋๋ค... ๊ทธ๊ฒ ์ ๋ง ๋ฌธ์ ์ ๋๊น?
@apaszke ํ๋ จ ํ๋ก๊ทธ๋จ์ ์คํํ ๋ ipcs -a
์ค์ ๋ก ์ฌ์ฉ ์ค์ธ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ์๋์ง ์์ต๋๋ค. ์์์ธ๊ฐ์?
@apaszke ๋
~~~
yimengzh_everyday@yimengzh :~$ ipcs -lm
------ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ ํ --------
์ต๋ ์ธ๊ทธ๋จผํธ ์ = 8192
์ต๋ ์ธ๊ทธ๋จผํธ ํฌ๊ธฐ(KB) = 18014398509465599
์ต๋ ์ด ๊ณต์ ๋ฉ๋ชจ๋ฆฌ(KB) = 18446744073642442748
์ต์ ์ธ๊ทธ๋จผํธ ํฌ๊ธฐ(๋ฐ์ดํธ) = 1
~~~
ํ ๋ช ์ ์์ ์๋ฅผ ์๋ํ์ง ์์์ต๋๋ค. ์ฒซ์งธ, ๋๋ฆด ๊ฒ์ ๋๋ค. ๋์งธ, ๋ฌธ์ ๊ฐ ์ค์ ๋ก ๋ฐ๋ ๋ฝํน์ด๋ผ๋ฉด ํ์คํ ์ฌ๋ผ์ง ๊ฒ์ ๋๋ค.
@zym1010 ๊ธฐ๋ณธ ์ค์ ์ ์ด๋ฌํ ์์
๋ถํ๋ฅผ ์ผ๋์ ๋๊ณ ๋ง๋ค ํ์๊ฐ ์์ผ๋ฏ๋ก ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ipcs
๋ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ์ง ์๋ System V ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ฉ์ด์ง๋ง POSIX ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์๋ ๋์ผํ ์ ํ์ด ์ ์ฉ๋์ง ์๋๋ก ํ๊ณ ์ถ์์ต๋๋ค.
๋ฌธ์ ๊ฐ ์ค์ ๋ก ์กด์ฌํ๋ ๊ฒฝ์ฐ ์์
์์ ๊ธฐ๋ณธ ํ๋ก์ธ์ค ์ฌ์ด์ ๊ต์ฐฉ ์ํ์ผ ๊ฐ๋ฅ์ฑ์ด ์์ผ๋ฉฐ ์์
์ ํ ๋ช
์ด ์ด๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ธฐ์ ์ถฉ๋ถํ ์ ์๊ธฐ ๋๋ฌธ์ ํ์คํ ์ฌ๋ผ์ง์ง๋ ์์ torch.__version__
์ ๊ฐ์ ์ผ๋ง์
๋๊น? ๋์ปค์์ ์คํ ์ค์ด์ ๊ฐ์?
@apaszke ๊ฐ์ฌํฉ๋๋ค. ๋๋ ์ด์ ๋น์ ์ ๋ถ์์ ํจ์ฌ ๋ ์ ์ดํดํฉ๋๋ค.
64GB RAM, ๋์ผ Xeon ๋ฐ Titan Black(K40๋ ์์ง๋ง ์ฌ์ฉํ์ง ์์)์ด ์๋ Ubuntu 14.04 ์์คํ ์์ ์ํ๋๋ ๋ฐฉ๋ฒ๊น์ง ํ์๋๋ ๋ค๋ฅธ ๋ชจ๋ ๊ฒฐ๊ณผ์ ๋๋ค.
๋ฌธ์ ๋ฅผ ์์ฑํ๋ ๋ช
๋ น์ CUDA_VISIBLE_DEVICES=0 PYTHONUNBUFFERED=1 python main.py -a alexnet --print-freq 20 --lr 0.01 --workers 22 --batch-size 256 /mnt/temp_drive_3/cv_datasets/ILSVRC2015/Data/CLS-LOC
์
๋๋ค. ์ฝ๋๋ฅผ ์ ํ ์์ ํ์ง ์์์ต๋๋ค.
Python 3.5์์ pip๋ฅผ ํตํด pytorch๋ฅผ ์ค์นํ์ต๋๋ค. pytorch ๋ฒ์ ์ 0.1.11_5
์
๋๋ค. Docker์์ ์คํ๋์ง ์์ต๋๋ค.
BTW, ๋๋ ๋ํ 1 ๋ช
์ ์์
์๋ฅผ ์ฌ์ฉํด ๋ณด์์ต๋๋ค. ํ์ง๋ง ๋ค๋ฅธ ๋จธ์ (128GB RAM, ๋์ผ Xeon, 4 Pascal Titan X, CentOS 6)์์ ์ํํ์ต๋๋ค. CUDA_VISIBLE_DEVICES=0 PYTHONUNBUFFERED=1 python main.py -a alexnet --print-freq 1 --lr 0.01 --workers 1 --batch-size 256 /ssd/cv_datasets/ILSVRC2015/Data/CLS-LOC
์ฌ์ฉํ์ฌ ์คํํ๋๋ฐ ์ค๋ฅ ๋ก๊ทธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Epoch: [0][5003/5005] Time 2.463 (2.955) Data 2.414 (2.903) Loss 5.9677 (6.6311) Prec<strong i="14">@1</strong> 3.516 (0.545) Prec<strong i="15">@5</strong> 8.594 (2.262)
Epoch: [0][5004/5005] Time 1.977 (2.955) Data 1.303 (2.903) Loss 5.9529 (6.6310) Prec<strong i="16">@1</strong> 1.399 (0.545) Prec<strong i="17">@5</strong> 7.692 (2.262)
^CTraceback (most recent call last):
File "main.py", line 292, in <module>
main()
File "main.py", line 137, in main
prec1 = validate(val_loader, model, criterion)
File "main.py", line 210, in validate
for i, (input, target) in enumerate(val_loader):
File "/home/yimengzh/miniconda2/envs/pytorch/lib/python3.5/site-packages/torch/utils/data/dataloader.py", line 168, in __next__
idx, batch = self.data_queue.get()
File "/home/yimengzh/miniconda2/envs/pytorch/lib/python3.5/queue.py", line 164, in get
self.not_empty.wait()
File "/home/yimengzh/miniconda2/envs/pytorch/lib/python3.5/threading.py", line 293, in wait
waiter.acquire()
top
๋ ์์
์ 1๋ช
๊ณผ ๋ถ์ด์์ ๋ ๋ค์์ ๋ณด์ฌ์ค๋๋ค.
~์๋จ - 08:34:33 ์ต๋ 15์ผ, 20:03, 0๋ช
์ ์ฌ์ฉ์, ๋ก๋ ํ๊ท : 0.37, 0.39, 0.36์์
: ์ด 894๊ฐ, ์คํ 1๊ฐ, ์ ์๊ธฐ 892๊ฐ, ์ค์ง 0๊ฐ, ์ข๋น 1๊ฐCPU: 7.2%us, 2.8%sy, 0.0%ni, 89.7%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st๋ฉ๋ชจ๋ฆฌ: ์ด 132196824k, 131461528k ์ฌ์ฉ, 735296k ์ฌ์ , 347448k ๋ฒํผ์ค์: ์ด 2047996k, ์ฌ์ฉ 22656k, ์ฌ์ ๊ณต๊ฐ 2025340k, ์บ์๋ 125226796k~
๋ด๊ฐ ์ฐพ์ ๋ ๋ค๋ฅธ ์ฌ์ค์ ํ๋ จ ์ฝ๋๋ฅผ ์์ ํ์ฌ ๋ชจ๋ ๋ฐฐ์น๋ฅผ ๊ฑฐ์น์ง ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด 50๊ฐ์ ๋ฐฐ์น๋ง ํ๋ จ์ํต๋๋ค.
if i >= 50:
break
๊ทธ๋ฌ๋ฉด ๊ต์ฐฉ ์ํ๊ฐ ์ฌ๋ผ์ง๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ถ๊ฐ ํ ์คํธ์ ๋ฐ๋ฅด๋ฉด ์ปดํจํฐ๋ฅผ ์ฌ๋ถํ ํ ์งํ์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ์ด๋ฌํ ์ ์ง๊ฐ ํจ์ฌ ๋ ์์ฃผ ๋ฐ์ํฉ๋๋ค. ์ปดํจํฐ์ ์ฝ๊ฐ์ ์บ์๊ฐ ์๋ ํ์๋ ์ด ๋ฉ์ถค ํ์์ด ๋ ๋ฐ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์๋ํ์ง๋ง ์ด ๋ฒ๊ทธ๋ฅผ ์ด๋ค ์์ผ๋ก๋ ์ฌํํ ์ ์์ต๋๋ค.
๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ํ ์ํฌํฌ๋ฅผ ๋ง์น๋ฉด ๋ฐ์ดํฐ ๋ก๋๊ฐ ์ค์ง๋๊ณ ์ ์ํฌํฌ๊ฐ ์์๋ฉ๋๋ค.
num_workers = 0์ผ๋ก ์ค์ ํ๋ฉด ์๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ํ๋ก๊ทธ๋จ์ด ๋๋ ค์ง๋๋ค.
@apaszke ๋จผ์ ์ปดํจํฐ๋ฅผ ์ฌ๋ถํ ํ ๋ค์ ํ๋ก๊ทธ๋จ์ ์คํํด
ํ ๊ฐ์ง ์ง์ ํ๊ณ ์ถ์ ๊ฒ์ OpenBLAS ์ฐ๊ฒฐ numpy๊ฐ ์ค์น๋์ด ์๊ณ @soumith ์ anaconda ํด๋ผ์ฐ๋์ MKL์ด ์ ๋๋ก ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์ pip
์ฌ์ฉํ์ฌ pytorch๋ฅผ ์ค์น ํ๋ค๋ ๊ฒ์
๋๋ค.
๋ฐ๋ผ์ ๋ณธ์ง์ ์ผ๋ก pytorch๋ MKL์ ์ฌ์ฉํ๊ณ numpy๋ OpenBLAS๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๊ฒ์ ์ด์์ ์ด์ง ์์ ์ ์์ง๋ง ์ด๊ฒ์ด ์ฌ๊ธฐ์ ๋ฌธ์ ์ ๊ด๋ จ์ด ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ ์กฐ์ฌํ์ง๋ง ๊ฒฐ์ฝ ๊ทธ๊ฒ์ ์ฌํ ํ ์ ์์์ต๋๋ค. MKL/OpenBLAS๋ ์ด ๋ฌธ์ ์ ๊ด๋ จ์ด ์์ด์ผ ํฉ๋๋ค. ์์คํ ๊ตฌ์ฑ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
@apaszke ๊ฐ์ฌํฉ๋๋ค. ๋ฐฉ๊ธ aaconda ๊ณต์ repo์ MKL ๊ธฐ๋ฐ pytorch์์ python์ ์๋ํ์ต๋๋ค. ์ฌ์ ํ ๊ฐ์ ๋ฌธ์ ์ ๋๋ค.
Docker์์ ์ฝ๋๋ฅผ ์คํํด ๋ณด์์ต๋๋ค. ์ฌ์ ํ ๋ถ์ด ์์ต๋๋ค.
4๊ฐ ์ค 1๊ฐ์ GPU๋ฅผ ์ฌ์ฉํ์ฌ nvidia-docker ๋ด๋ถ์์ pytorch/examples imagenet ๊ต์ก ์์ (resnet18, 4๊ฐ์ ์์ ์)๋ฅผ ์คํํ๋ ๊ฒ๊ณผ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ํ๋ก์ธ์ค์ ๋๋ฌํ ์ ์๋ค๋ฉด gdb ์ญ์ถ์ ์ ์์งํ๋ ค๊ณ ๋ ธ๋ ฅํ ๊ฒ์ ๋๋ค. .
์ต์ํ OpenBLAS๋ ํ๋ ฌ ๊ณฑ์ ์์ ๊ต์ฐฉ ์ํ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์์ผ๋ฉฐ, ์ด๋ ๋น๊ต์ ๋๋ฌผ๊ฒ ๋ฐ์ํฉ๋๋ค( https://github.com/xiani/OpenBLAS/issues/937). ์ด ๋ฒ๊ทธ๋ ์ ์ด๋ numpy 1.12.0์ ํจํค์ง๋ OpenBLAS์ ์กด์ฌํ์ต๋๋ค.
@jsainio ๋ํ ์์ MKL ๊ธฐ๋ฐ PyTorch(numpy๋ MKL๊ณผ ์ฐ๊ฒฐ๋จ)๋ฅผ ์๋ํ์ง๋ง ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.
๋ํ ์ด ๋ฌธ์ ๋ ๋ฐ์ดํฐ ๋ก๋์ ๋ํด pin_memory
๋ฅผ ์ผ๋ฉด (์ ์ด๋ ์ ์๊ฒ๋) ํด๊ฒฐ๋ฉ๋๋ค.
2๋ช ์ ์์ ์๊ฐ ์ฌ๋งํ ๊ฒ ๊ฐ์ต๋๋ค.
์ ์ ์๋ ์ค:
root<strong i="7">@b06f896d5c1d</strong>:~/mnt# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
user+ 1 33.2 4.7 91492324 3098288 ? Ssl 10:51 1:10 python -m runne
user+ 58 76.8 2.3 91079060 1547512 ? Rl 10:54 1:03 python -m runne
user+ 59 76.0 2.2 91006896 1484536 ? Rl 10:54 1:02 python -m runne
user+ 60 76.4 2.3 91099448 1559992 ? Rl 10:54 1:02 python -m runne
user+ 61 79.4 2.2 91008344 1465292 ? Rl 10:54 1:05 python -m runne
์ ๊ธ ํ:
root<strong i="11">@b06f896d5c1d</strong>:~/mnt# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
user+ 1 24.8 4.4 91509728 2919744 ? Ssl 14:25 13:01 python -m runne
user+ 58 51.7 0.0 0 0 ? Z 14:27 26:20 [python] <defun
user+ 59 52.1 0.0 0 0 ? Z 14:27 26:34 [python] <defun
user+ 60 52.0 2.4 91147008 1604628 ? Sl 14:27 26:31 python -m runne
user+ 61 52.0 2.3 91128424 1532088 ? Sl 14:27 26:29 python -m runne
์์ง ๋จ์ ์๋ ์์ ์ ์ค ํ๋์ ๊ฒฝ์ฐ gdb ์คํ ์ถ์ ์ ์์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
root<strong i="15">@b06f896d5c1d</strong>:~/mnt# gdb --pid 60
GNU gdb (GDB) 8.0
Attaching to process 60
[New LWP 65]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
0x00007f36f52af827 in do_futex_wait.constprop ()
from /lib/x86_64-linux-gnu/libpthread.so.0
(gdb) bt
#0 0x00007f36f52af827 in do_futex_wait.constprop ()
from /lib/x86_64-linux-gnu/libpthread.so.0
#1 0x00007f36f52af8d4 in __new_sem_wait_slow.constprop.0 ()
from /lib/x86_64-linux-gnu/libpthread.so.0
#2 0x00007f36f52af97a in sem_wait@@GLIBC_2.2.5 ()
from /lib/x86_64-linux-gnu/libpthread.so.0
#3 0x00007f36f157efb1 in semlock_acquire (self=0x7f3656296458,
args=<optimized out>, kwds=<optimized out>)
at /home/ilan/minonda/conda-bld/work/Python-3.5.2/Modules/_multiprocessing/semaphore.c:307
#4 0x00007f36f5579621 in PyCFunction_Call (func=
<built-in method __enter__ of _multiprocessing.SemLock object at remote 0x7f3656296458>, args=(), kwds=<optimized out>) at Objects/methodobject.c:98
#5 0x00007f36f5600bd5 in call_function (oparg=<optimized out>,
pp_stack=0x7f36c7ffbdb8) at Python/ceval.c:4705
#6 PyEval_EvalFrameEx (f=<optimized out>, throwflag=<optimized out>)
at Python/ceval.c:3236
#7 0x00007f36f5601b49 in _PyEval_EvalCodeWithName (_co=<optimized out>,
globals=<optimized out>, locals=<optimized out>, args=<optimized out>,
argcount=1, kws=0x0, kwcount=0, defs=0x0, defcount=0, kwdefs=0x0,
closure=0x0, name=0x0, qualname=0x0) at Python/ceval.c:4018
#8 0x00007f36f5601cd8 in PyEval_EvalCodeEx (_co=<optimized out>,
globals=<optimized out>, locals=<optimized out>, args=<optimized out>,
argcount=<optimized out>, kws=<optimized out>, kwcount=0, defs=0x0,
defcount=0, kwdefs=0x0, closure=0x0) at Python/ceval.c:4039
#9 0x00007f36f5557542 in function_call (
func=<function at remote 0x7f36561c7d08>,
arg=(<Lock(release=<built-in method release of _multiprocessing.SemLock object at remote 0x7f3656296458>, acquire=<built-in method acquire of _multiprocessing.SemLock object at remote 0x7f3656296458>, _semlock=<_multiprocessing.SemLock at remote 0x7f3656296458>) at remote 0x7f3656296438>,), kw=0x0)
at Objects/funcobject.c:627
#10 0x00007f36f5524236 in PyObject_Call (
func=<function at remote 0x7f36561c7d08>, arg=<optimized out>,
kw=<optimized out>) at Objects/abstract.c:2165
#11 0x00007f36f554077c in method_call (
func=<function at remote 0x7f36561c7d08>,
arg=(<Lock(release=<built-in method release of _multiprocessing.SemLock object at remote 0x7f3656296458>, acquire=<built-in method acquire of _multiprocessing.SemLock object at remote 0x7f3656296458>, _semlock=<_multiprocessing.SemLock at remote 0x7f3656296458>) at remote 0x7f3656296438>,), kw=0x0)
at Objects/classobject.c:330
#12 0x00007f36f5524236 in PyObject_Call (
func=<method at remote 0x7f36556f9248>, arg=<optimized out>,
kw=<optimized out>) at Objects/abstract.c:2165
#13 0x00007f36f55277d9 in PyObject_CallFunctionObjArgs (
callable=<method at remote 0x7f36556f9248>) at Objects/abstract.c:2445
#14 0x00007f36f55fc3a9 in PyEval_EvalFrameEx (f=<optimized out>,
throwflag=<optimized out>) at Python/ceval.c:3107
#15 0x00007f36f5601166 in fast_function (nk=<optimized out>, na=1,
n=<optimized out>, pp_stack=0x7f36c7ffc418,
func=<function at remote 0x7f36561c78c8>) at Python/ceval.c:4803
#16 call_function (oparg=<optimized out>, pp_stack=0x7f36c7ffc418)
at Python/ceval.c:4730
#17 PyEval_EvalFrameEx (f=<optimized out>, throwflag=<optimized out>)
at Python/ceval.c:3236
#18 0x00007f36f5601b49 in _PyEval_EvalCodeWithName (_co=<optimized out>,
globals=<optimized out>, locals=<optimized out>, args=<optimized out>,
argcount=4, kws=0x7f36f5b85060, kwcount=0, defs=0x0, defcount=0,
kwdefs=0x0, closure=0x0, name=0x0, qualname=0x0) at Python/ceval.c:4018
#19 0x00007f36f5601cd8 in PyEval_EvalCodeEx (_co=<optimized out>,
globals=<optimized out>, locals=<optimized out>, args=<optimized out>,
argcount=<optimized out>, kws=<optimized out>, kwcount=0, defs=0x0,
defcount=0, kwdefs=0x0, closure=0x0) at Python/ceval.c:4039
#20 0x00007f36f5557661 in function_call (
func=<function at remote 0x7f36e14170d0>,
arg=(<ImageFolder(class_to_idx={'n04153751': 783, 'n02051845': 144, 'n03461385': 582, 'n04350905': 834, 'n02105056': 224, 'n02112137': 260, 'n03938244': 721, 'n01739381': 59, 'n01797886': 82, 'n04286575': 818, 'n02113978': 268, 'n03998194': 741, 'n15075141': 999, 'n03594945': 609, 'n04099969': 765, 'n02002724': 128, 'n03131574': 520, 'n07697537': 934, 'n04380533': 846, 'n02114712': 271, 'n01631663': 27, 'n04259630': 808, 'n04326547': 825, 'n02480855': 366, 'n02099429': 206, 'n03590841': 607, 'n02497673': 383, 'n09332890': 975, 'n02643566': 396, 'n03658185': 623, 'n04090263': 764, 'n03404251': 568, 'n03627232': 616, 'n01534433': 13, 'n04476259': 868, 'n03495258': 594, 'n04579145': 901, 'n04266014': 812, 'n01665541': 34, 'n09472597': 980, 'n02095570': 189, 'n02089867': 166, 'n02009229': 131, 'n02094433': 187, 'n04154565': 784, 'n02107312': 237, 'n04372370': 844, 'n02489166': 376, 'n03482405': 588, 'n04040759': 753, 'n01774750': 76, 'n01614925': 22, 'n01855032': 98, 'n03903868': 708, 'n02422699': 352, 'n01560419': 1...(truncated), kw={}) at Objects/funcobject.c:627
#21 0x00007f36f5524236 in PyObject_Call (
func=<function at remote 0x7f36e14170d0>, arg=<optimized out>,
kw=<optimized out>) at Objects/abstract.c:2165
#22 0x00007f36f55fe234 in ext_do_call (nk=1444355432, na=0,
flags=<optimized out>, pp_stack=0x7f36c7ffc768,
func=<function at remote 0x7f36e14170d0>) at Python/ceval.c:5034
#23 PyEval_EvalFrameEx (f=<optimized out>, throwflag=<optimized out>)
at Python/ceval.c:3275
--snip--
๋ฉ์ธ ํ๋ก์ธ์ค๊ฐ ๋ฉ์ถ ์ํ์์ ๋น์ทํ ์ค๋ฅ ๋ก๊ทธ๊ฐ ์์์ต๋๋ค. self.data_queue.get()
๋์๊ฒ ๋ฌธ์ ๋ opencv๋ฅผ ์ด๋ฏธ์ง ๋ก๋๋ก ์ฌ์ฉํ๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ cv2.imread ํจ์๋ imagenet์ ํน์ ์ด๋ฏธ์ง์์ ์ค๋ฅ ์์ด ๋ฌด๊ธฐํ ์ค๋จ๋์์ต๋๋ค("n01630670/n01630670_1010.jpeg").
num_workers = 0์ผ๋ก ์๋ํ๋ค๊ณ ๋งํ๋ฉด ๊ทธ๊ฒ ์๋๋๋ค. ๊ทธ๋ฌ๋ ์ ์ฌํ ์ค๋ฅ ์ถ์ ์ ๊ฐ์ง ์ผ๋ถ ์ฌ๋๋ค์๊ฒ ๋์์ด ๋ ์ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
ํ์ฌ num_workers = 0
๋ก ํ
์คํธ๋ฅผ ์คํ ์ค์ด๋ฉฐ ์์ง ์ค๋จ๋์ง ์์์ต๋๋ค. https://github.com/pytorch/examples/blob/master/imagenet/main.py ์์ ์์ ์ฝ๋๋ฅผ ์คํํ๊ณ pytorch/vision
ImageFolder๋ ๋ด๋ถ์ ์ผ๋ก PIL
๋๋ pytorch/accimage
๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋ก๋ํ๋ ๊ฒ์ผ๋ก ๋ณด์ด๋ฏ๋ก OpenCV๊ฐ ๊ด๋ จ๋์ง ์์ต๋๋ค.
num_workers = 4
๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋๋ก ์ฒซ ๋ฒ์งธ epoch ๊ธฐ์ฐจ๋ฅผ ์ป๊ณ ์์ ํ ๊ฒ์ฆํ ์ ์์ผ๋ฉฐ ๋ ๋ฒ์งธ epoch ์ค๊ฐ์ ์ ๊น๋๋ค. ๋ฐ๋ผ์ ๋ฐ์ดํฐ์
/๋ก๋ฉ ๊ธฐ๋ฅ์ ๋ฌธ์ ๊ฐ ์์ ๊ฐ๋ฅ์ฑ์ ๋ฎ์ต๋๋ค.
ํน์ ํ๋์จ์ด/์ํํธ์จ์ด ์กฐํฉ์ ์ํด ๋น๊ต์ ๋๋ฌผ๊ฒ ํธ๋ฆฌ๊ฑฐ๋ ์ ์๋ ImageLoader์ ๊ฒฝ์ ์กฐ๊ฑด์ฒ๋ผ ๋ณด์ ๋๋ค.
@zym1010 ํฌ์ธํฐ ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. DataLoader์๋ pin_memory = False
์ค์ ํด ๋ณด๊ฒ ์ต๋๋ค.
ํฅ๋ฏธ๋ก์ด. ๋ด ์ค์ ์์ pin_memory = False
๋ฐ num_workers = 4
imagenet ์์ ๋ ๊ฑฐ์ ์ฆ์ ์ค๋จ๋๊ณ ์์
์ ์ค 3๋ช
์ ์ข๋น ํ๋ก์ธ์ค๋ก ๋๋ฉ๋๋ค.
root<strong i="8">@034c4212d022</strong>:~/mnt# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
user+ 1 6.7 2.8 92167056 1876612 ? Ssl 13:50 0:36 python -m runner
user+ 38 1.9 0.0 0 0 ? Z 13:51 0:08 [python] <defunct>
user+ 39 4.3 2.3 91069804 1550736 ? Sl 13:51 0:19 python -m runner
user+ 40 2.0 0.0 0 0 ? Z 13:51 0:09 [python] <defunct>
user+ 41 4.1 0.0 0 0 ? Z 13:51 0:18 [python] <defunct>
๋ด ์ค์ ์์ ๋ฐ์ดํฐ ์ธํธ๋ NFS๋ฅผ ํตํด ์ฝ๋ ๋คํธ์ํฌ ๋์คํฌ์ ์์ต๋๋ค. pin_memory = False
๋ฐ num_workers = 4
ํ๋ฉด ์์คํ
์ด ์๋นํ ๋นจ๋ฆฌ ์คํจํ ์ ์์ต๋๋ค.
=> creating model 'resnet18'
- training epoch 0
Epoch: [0][0/5005] Time 10.713 (10.713) Data 4.619 (4.619) Loss 6.9555 (6.9555) Prec<strong i="8">@1</strong> 0.000 (0.000) Prec<strong i="9">@5</strong> 0.000 (0.000)
Traceback (most recent call last):
--snip--
imagenet_pytorch.main.main([data_dir, "--transient_dir", context.transient_dir])
File "/home/user/mnt/imagenet_pytorch/main.py", line 140, in main
train(train_loader, model, criterion, optimizer, epoch, args)
File "/home/user/mnt/imagenet_pytorch/main.py", line 168, in train
for i, (input, target) in enumerate(train_loader):
File "/home/user/anaconda/lib/python3.5/site-packages/torch/utils/data/dataloader.py", line 206, in __next__
idx, batch = self.data_queue.get()
File "/home/user/anaconda/lib/python3.5/multiprocessing/queues.py", line 345, in get
return ForkingPickler.loads(res)
File "/home/user/anaconda/lib/python3.5/site-packages/torch/multiprocessing/reductions.py", line 70, in rebuild_storage_fd
fd = df.detach()
File "/home/user/anaconda/lib/python3.5/multiprocessing/resource_sharer.py", line 57, in detach
with _resource_sharer.get_connection(self._id) as conn:
File "/home/user/anaconda/lib/python3.5/multiprocessing/resource_sharer.py", line 87, in get_connection
c = Client(address, authkey=process.current_process().authkey)
File "/home/user/anaconda/lib/python3.5/multiprocessing/connection.py", line 493, in Client
answer_challenge(c, authkey)
File "/home/user/anaconda/lib/python3.5/multiprocessing/connection.py", line 732, in answer_challenge
message = connection.recv_bytes(256) # reject large message
File "/home/user/anaconda/lib/python3.5/multiprocessing/connection.py", line 216, in recv_bytes
buf = self._recv_bytes(maxlength)
File "/home/user/anaconda/lib/python3.5/multiprocessing/connection.py", line 407, in _recv_bytes
buf = self._recv(4)
File "/home/user/anaconda/lib/python3.5/multiprocessing/connection.py", line 379, in _recv
chunk = read(handle, remaining)
ConnectionResetError
:
[Errno 104] Connection reset by peer
@zym1010 ๋คํธ์ํฌ ๋์คํฌ๋ ๊ธฐ์กด ํ์ ๋์คํฌ ์ค ์ง์ฐ ์๊ฐ ๋ฑ์ด ๋ ๋๋ฆด ์ ์์ต๋๊น?
@jsainio
ํด๋ฌ์คํฐ์ ์ปดํจํ ๋ ธ๋์์ ๋ก์ปฌ SSD๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ฝ๋๋ NFS ๋๋ผ์ด๋ธ์ ์์ง๋ง ๋ฐ์ดํฐ๋ ์ต๋ ๋ก๋ฉ ์๋๋ฅผ ์ํด ๋ก์ปฌ SSD์ ์์ต๋๋ค. NFS ๋๋ผ์ด๋ธ์ ๋ฐ์ดํฐ ๋ก๋๋ฅผ ์๋ํ ์ ์ด ์์ต๋๋ค.
@zym1010 ์ ๋ณด ๊ฐ์ฌํฉ๋๋ค. ํด๋ฌ์คํฐ์ ์ปดํจํ ๋ ธ๋์์๋ ์ด๊ฒ์ ์คํํ๊ณ ์์ต๋๋ค.
์ค์ ๋ก num_workers = 4
๋ณํ์ ์๋ํ๋ฉด์ ๋์์ ๋์ผํ ๋
ธ๋์์ num_workers = 0
์คํ์ ์คํํ๊ณ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์คํ์ ๊ฐ๋ฅํ ๊ฒฝ์ ์กฐ๊ฑด์ด ํ์์์ ๋ ๋นจ๋ฆฌ ๋ํ๋๋๋ก ์ถฉ๋ถํ ๋ถํ๋ฅผ ์์ฑํ๊ณ ์์ ์ ์์ต๋๋ค.
@apaszke ์ด์ ์ ์ด๊ฒ์ ์ฌํํ๋ ค๊ณ ํ ๋ ๋ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ๋๋ํ ์คํํ๊ฑฐ๋ ์์คํ ์ ์๋นํ ๋ค๋ฅธ ๋ถํ๋ฅผ
@jsainio ์กฐ์ฌํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค! ์ด์ํ๊ฒ๋ ์์
์๋ ํจ๊ป ์ข
๋ฃ๋์ด์ผ ํ๋ฉฐ ๊ธฐ๋ณธ ํ๋ก์ธ์ค๊ฐ ๋ฐ์ดํฐ ์ฝ๊ธฐ๋ฅผ ์๋ฃํ ํ์๋ง ์ข
๋ฃํด์ผ ํฉ๋๋ค. ์ ์กฐ๊ธฐ ์ข
๋ฃ๋๋์ง ์กฐ์ฌํด ๋ณผ ์ ์์ต๋๊น? ์ปค๋ ๋ก๊ทธ( dmesg
)๋ฅผ ํ์ธํ์๊ฒ ์ต๋๊น?
์๋จ ์์จ๋ดค๋๋ฐ ์๊ทธ๋ด๋๋ ๋์ค๋๊ฑฐ๊ฐ์๋ฐ IIRC
@apaszke ์๊ฒ ์ต๋๋ค . ์์ ์๊ฐ ๊ธฐ์ฉ๋๋ค .
์๋ํ์ง๋ง ์ข
๋ฃ ์ด์ ๋ฅผ ํ์ธํ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. dmesg
์๋ ๊ด๋ จ ํญ๋ชฉ์ด ํ์๋์ง ์์ต๋๋ค. (์ ๋ Anaconda ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ Ubuntu 16.04 ํ์ Docker์์ ์คํ ์ค์
๋๋ค.)
ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์์ ์ ๋ฃจํ ๋ด๋ถ์ ์ฌ๋ฌ ์ธ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ๋๋ ๊ทธ๋ค์ด ์ ์กฐ์ฉํ ํด์ฅํ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค. stderr์ ์ธ์๋์์ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์์ธ๋ ์๋ ๊ฒ์ ๋๋ค. ๊ทธ๋์ ๋ฃจํ๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ OS์ ์ํด ์ฃฝ์ต๋๋ค(์๋ง๋ ์ ํธ์ ์ํด?)
@jsainio , ํ์ธํ๊ธฐ ์ํด --ipc=host ์ ํจ๊ป docker๋ฅผ ์คํํ๊ณ ์์ต๋๊น(์ด๊ฒ์ ์ธ๊ธํ์ง ์์์ต๋๊น)? ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ์ ํฌ๊ธฐ๋ฅผ ํ์ธํ ์ ์์ต๋๊น(df -h | grep shm)?
@ngimel ์ ๋ --shm-size=1024m
์์ต๋๋ค. df -h | grep shm
๋ณด๊ณ :
root<strong i="9">@db92462e8c19</strong>:~/mnt# df -h | grep shm
shm 1.0G 883M 142M 87% /dev/shm
๊ทธ ์ฌ์ฉ๋ฒ์ ๋ค์ ๋์ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๊ฒ์ ๋ ๋ช ์ ์ข๋น ์์ ์๊ฐ ์๋ ๋์ปค์ ์์ต๋๋ค.
shm ํฌ๊ธฐ๋ฅผ ๋๋ฆด ์ ์์ต๋๊น? ๋ฐฉ๊ธ ํ์ธํ๊ณ ๋ฌธ์ ๋ฅผ ์ฌํํ๋ ค๊ณ ์๋ํ ์๋ฒ์์ 16GB์์ต๋๋ค. ๋์ปค ํ๋๊ทธ๋ฅผ ๋ณ๊ฒฝํ๊ฑฐ๋
mount -o remount,size=8G /dev/shm
๋ฐฉ๊ธ ํฌ๊ธฐ๋ฅผ 512MB๋ก ์ค์ด๋ ค๊ณ ์๋ํ์ง๋ง ๊ต์ฐฉ ์ํ๊ฐ ์๋ ๋ช ํํ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๐ ์์ง๋ ์ฌํ์ด ์๋๋ค์
docker๋ฅผ ์ฌ์ฉํ๋ฉด shm์ด ์ถฉ๋ถํ์ง ์์ ๋ ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์ด์ ๋ฅผ ๋ชจ๋ฅด๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ง์ฐ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก shm์ ๋๋ฆฌ๋ฉด ํด๊ฒฐ๋ฉ๋๋ค(1G์์ ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ์ต๋๋ค).
์ข์, 10๊ฐ์ ์์ ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ ๊ฐ์ง๋ง 4๊ฐ์ โโ์์ ์๋ฅผ ์ฌ์ฉํ๋ฉด /dev/shm ์ฌ์ฉ๋์ 58%์์ ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํฉ๋๋ค! ๋๋์ด ์ฌํํ๋ค
์ด ๋ฌธ์ ์ ํ์์ ์ฌํํ ์ ์๋ค๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋๋ #1579์ ์ค๋จ์ ์ ๋ฐํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๊ฒ์ํ๋๋ฐ ๋น์ ์ ๊ทธ๊ฒ์ด ๋น์ ์ ์์คํ ์ ์ค๋จ๋์ง ์๋๋ค๊ณ ๋๋ตํ์ต๋๋ค. ์ค์ ๋ก MacBook์์๋ง ํ ์คํธํ์ต๋๋ค. ๋ฐฉ๊ธ Linux์์ ์๋ํ์ง๋ง ์ค๋จ๋์ง ์์์ต๋๋ค. ๋ฐ๋ผ์ Linux์์๋ง ์๋ํ๋ค๋ฉด Mac์์๋ ์๋ํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์๊ฒ ์ต๋๋ค. ๋ฌธ์ ๋ฅผ ์กฐ์ฌํ ํ ์ด์ํ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. /dev/shm
๋ฅผ 128MB๋ก ์ ํํ๋๋ผ๋ Linux๋ 147MB ํ์ผ์ ์์ฑํ๊ณ ๋ฉ๋ชจ๋ฆฌ์ ์์ ํ mmapํ๋๋ก ํ์ฉํ์ง๋ง ์ค์ ๋ก ํ์ด์ง์ ์ก์ธ์คํ๋ ค๊ณ ์๋ํ๋ฉด ์์
์์๊ฒ ์น๋ช
์ ์ธ SIGBUS๋ฅผ ๋ณด๋
๋๋ค. ... ๋ฑ๋ก๋ SIGBUS ํธ๋ค๋ฌ๋ก ํ์ด์ง๋ฅผ ๋ฐ๋ณตํ๊ณ ๊ฐ ํ์ด์ง๋ฅผ ๋ง์ง๋ ๊ฒ์ ์ ์ธํ๊ณ ๋ ํ์ด์ง์ ์ ํจ์ฑ์ ํ์ธํ ์ ์๋ ๋ฉ์ปค๋์ฆ์ด ์๊ฐ๋์ง ์์ต๋๋ค...
ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์์ ํ์๋ ๋๋ก mount
๋ช
๋ น์ผ๋ก /dev/shm
๋ฅผ ํ์ฅํ๋ ๊ฒ์
๋๋ค. 16GB๋ก ์๋ํ์ญ์์ค(RAM์ด ์ถฉ๋ถํ ๊ฒฝ์ฐ).
์ด๊ฒ์ ๋ํ ์ธ๊ธ์ ์ฐพ๊ธฐ๊ฐ ์ด๋ ต์ง๋ง ์ฌ๊ธฐ์ ํ๋๊ฐ ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ๋ํด ์๊ฐ์ ๋ด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. ์ด ๋ฌธ์ ๋ ์ค๋ซ๋์ ์ ๋ฅผ ๋ฏธ์น๊ฒ ํ์ต๋๋ค! ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๋ค๋ฉด /dev/shm
๋ฅผ 8G ๋์ 16G๋ก ํ์ฅํด์ผ ํฉ๋๋ค. ์๋ฏธ๊ฐ ์์ง๋ง df -h
์๋ํ ๋ ๋ชจ๋ ๋จ์ด ์ค์ ๋ก ํ ๋น๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. (16G๊ฐ ์์ต๋๋ค)
tmpfs 7,8G 393M 7,4G 5% /dev/shm
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
tmpfs 7,8G 0 7,8G 0% /sys/fs/cgroup
tmpfs 1,6G 60K 1,6G 1% /run/user/1001
์ด๊ฒ์ ๊ต์ฐฉ ์ํ ๋์ df -h
์ ์ถ๋ ฅ์
๋๋ค. ๋ด๊ฐ ์๋ ํ, 16G์ SWAP ํํฐ์
์ด ์์ผ๋ฉด tmpfs๋ฅผ 32G๊น์ง ๋ง์ดํธํ ์ ์์ผ๋ฏ๋ก /dev/shm
ํ์ฅํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ๋์ง ์๊ฒ ์ฃ ?
๋ ์ค์ํ ๊ฒ์ ๋ด RAM์ ๊ฑฐ์ ์ ๋ฐ์ ์ฐจ์งํ๊ธฐ ๋๋ฌธ์ cgroup ํํฐ์ ๊ณผ ๊ทธ ๋ชฉ์ ์ ๋ํด ์์ํดํฉ๋๋ค. ๋ถ๋ช ํ ๋ค์ค ํ๋ก์ธ์ ์์ ์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋๋ก ์ค๊ณ๋์์ง๋ง ๊ทธ๊ฒ์ด ํ๋ ์ผ๊ณผ ์ ํ์ํ์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ชจ๋ ๋ฌผ๋ฆฌ์ RAM์ shm์ ํ ๋นํ๊ธฐ ์ํด ๋ฌด์ธ๊ฐ๋ฅผ ๋ณ๊ฒฝํ ๊น์? (ํฌ๊ธฐ๋ฅผ 16G๋ก ์ค์ ํ๊ธฐ ๋๋ฌธ์) SWAP์ ๋ฃ์ผ์ญ์์ค (๋ ๋ค ๋ถ๋ถ์ ์ผ๋ก RAM๊ณผ SWAP์ ๋์์ ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง)
@apaszke ๊ฐ์ฌํฉ๋๋ค! ๊ทผ๋ณธ์ ์ธ ์์ธ์ ์ฐพ์ผ์
จ๋ค๋ ๋๋จํฉ๋๋ค. ๋๋ ๋๋๋ก ํ ์ปดํจํฐ์ ๋ค๋ฅธ ๋ถํ๊ฐ ๋ฌด์์ธ์ง์ ๋ฐ๋ผ ๋ค์ํ "ConnectionReset" ์ค๋ฅ์ ๋์ปค --shm-size=1024m
๊ต์ฐฉ ์ํ๊ฐ ๋ชจ๋ ๋ฐ์ํ์ต๋๋ค. --shm-size=16384m
๋ฐ 4๋ช
์ ์์
์์ ํจ๊ป ์ง๊ธ ํ
์คํธ ์ค์
๋๋ค.
@jsainio ConnectionReset์ด ๊ฐ์ ๋ฌธ์ ๋ก ์ธํด ๋ฐ์ํ์ ์ ์์ต๋๋ค. ํ๋ก์ธ์ค๊ฐ ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๊ธฐ ์์ํ์ง๋ง shm ๊ณต๊ฐ์ด ๋ถ์กฑํ๋ฉด SIGBUS๊ฐ ์์ ์์๊ฒ ์ ์ก๋์ด ์ข ๋ฃ๋์์ต๋๋ค.
@ClementPinard ๋ด๊ฐ ์ดํดํ๋ ํ ์ํ๋ ๋งํผ ํฌ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๋จ, RAM์ด ๋ถ์กฑํ๋ฉด ์์คํ
์ด ์ ์ง๋ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค(์ปค๋๋ ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ์ ์๊ธฐ ๋๋ฌธ์). /sys/fs/cgroup
๋ํด ์ ๊ฒฝ์ฐ์ง ์์๋ ๋ฉ๋๋ค. tmpfs
ํํฐ์
์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ฆฌ๊ฒ ํ ๋นํ๋ฏ๋ก ์ฌ์ฉ๋์ด 0B๋ก ์ ์ง๋๋ ํ ๋น์ฉ์ด ๋ค์ง ์์ต๋๋ค(์ ํ ํฌํจ). ์ค์์ ์ฌ์ฉํ๋ ๊ฒ์ ์ข์ ์๊ฐ์ด ์๋๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ์ดํฐ ๋ก๋๊ฐ ํจ์ฌ ๋๋ ค์ง๋ฏ๋ก shm
ํฌ๊ธฐ๋ฅผ 12GB๋ก ๋๋ฆฌ๊ณ ์์
์ ์๋ฅผ ์ ํํ ์ ์์ต๋๋ค(๋ด๊ฐ ๋งํ๋ฏ์ด, shm์ ๋ชจ๋ RAM์ ์ฌ์ฉํ์ง ๋ง์ญ์์ค!). ๋ค์ ์ ์ปค๋ ๋ฌธ์
/dev/shm
์ฌ์ฉ๋์ด ๋งค์ฐ ์ ์ ๊ฒฝ์ฐ์๋ ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค(๋ด ์ปดํจํฐ์์ 20kB ๋ฐ์). ์๋ง๋ ์ปค๋์ ์ง๋์น๊ฒ ๋๊ด์ ์ด์ง๋ง ๋ชจ๋ ๊ฒ์ ์ฑ์ธ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ์ด ์์ญ์ ๋ชจ๋ ๊ฒ์ ์ฌ์ฉํ๊ธฐ ์์ํ๋ฉด ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํฉ๋๋ค.
์ง๊ธ 12G์ ๋ด๊ฐ ๊ฐ์ง ์ ๋ฐ์ ์์
์๋ก ํ
์คํธํ์ง๋ง ์คํจํ์ต๋๋ค.
๊ทธ๊ฒ์ ๋ฃจ์ ํ ์น ๋ฒ์ (๋์ผํ ์๋, ๋์ผํ ์์ ์์
์)์์ ๋งค๋ ฅ์ฒ๋ผ ์๋ํ์ฌ ๋ฌธ์ ๊ฐ ๋จ์ง /dev/shm
๊ด๋ จ์ด ์๊ณ python ๋ค์ค ์ฒ๋ฆฌ์ ๋ ๊ฐ๊น์ง ์์์ง ๊ถ๊ธํ๊ฒ ๋ง๋ญ๋๋ค...
๊ทธ๊ฒ์ ๋ํด ์ด์ํ ์ ์ (๋น์ ์ด ์ธ๊ธํ๋ฏ์ด) /dev/shm
๊ฐ ๊ฒฐ์ฝ ๊ฐ๋ /dev/shm
์ถ์ ํด์ผ ํฉ๋๋ค. ์๋ง๋ ๋ฐ์ดํฐ ๋ก๋๊ฐ ๋ณ๊ฒฝ๋๋ ๋์ ์ต๋ ์ฌ์ฉ๋์ด ์์ ์ ์์ต๋๋ค.
@ClementPinard ๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ๋๊ณ Docker๊ฐ ์์ผ๋ฉด ์ฌ์ ํ ์คํจํ ์ ์์ต๋๋ค.
ํ ์น ๋ฒ์ == Lua Torch์ธ ๊ฒฝ์ฐ ์ฌ์ ํ /dev/shm
๊ด๋ จ๋ ์ ์์ต๋๋ค. Lua Torch๋ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก(GIL์ด ์์) ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํต๊ณผํ ํ์๊ฐ ์์ต๋๋ค(๋ชจ๋ ๋จ์ผ ์ฃผ์ ๊ณต๊ฐ์ ๊ณต์ ํจ).
์๋ก์ด ํ๋ จ ๋๋ ๊ฒ์ฆ ์ํฌํฌ์ ์์ ๋ถ๋ถ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์๋ค๊ณ ๋ถํํ ํ ๋ฐ์ดํฐ ๋ก๋๊ฐ ์ถฉ๋ํ๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์์ ์๋ฃจ์
์ (i) /dev/shm
๊ฐ 32GB์ด๊ณ 2.5GB ์ด์ ์ฌ์ฉ๋ ์ ์ด ์์ผ๋ฉฐ (ii) pin_memory=False ์ค์ ์ด ์๋ํ์ง ์์์ต๋๋ค.
์ด๊ฒ์ ์๋ง๋ ๊ฐ๋น์ง ์์ง๊ณผ ๊ด๋ จ์ด ์์ต๋๊น? ๋ด ์ฝ๋๋ ๋๋ต ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ฌดํ ๋ฐ๋ณต์๊ฐ ํ์ํ๋ฏ๋ก ์๋ next()
์ฃผ์๋ฅผ ์ ์ธํ๊ณ ์๋ํฉ๋๋ค :-)
def train():
train_iter = train_loader.__iter__()
for i in xrange(max_batches):
try:
x, y = next(train_iter)
except StopIteration:
train_iter = train_loader.__iter__()
...
del train_iter
train_loader
๋ DataLoader
๊ฐ์ฒด์
๋๋ค. ํจ์ ๋์ ๋ช
์์ ์ธ del train_iter
์ค์ด ์์ผ๋ฉด ํ๋ก์ธ์ค๋ ํญ์ 2-3 ์ํฌํฌ ํ์ ์ถฉ๋ํฉ๋๋ค( /dev/shm
์ฌ์ ํ 2.5GB๋ฅผ ํ์ํจ). ๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
4
์์
์(Ubuntu 16.04์ CUDA 8.0 ๋ฒ์ 0.1.12_2
)๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
ํนํ work_number๊ฐ ํด ๋ ๊ต์ฐฉ ์ํ๋ฅผ ๋ง๋ฌ์ต๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ๊ฐ๋ฅํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น? ๋ด /dev/shm ํฌ๊ธฐ๋ 32GB์ด๊ณ cuda 7.5, pytorch 0.1.12 ๋ฐ python 2.7.13์ ๋๋ค. ๋ค์์ ์ฌ๋ง ํ ๊ด๋ จ ์ ๋ณด์ ๋๋ค. ๊ธฐ์ต๊ณผ ๊ด๋ จ๋ ๊ฒ ๊ฐ๋ค. @apaszke
@zhengyunqq ์๋ pin_memory=False
๋น์ ์ด ๊ทธ๊ฒ์ ์ค์ ํ๋ฉด True
. ๊ทธ๋ ์ง ์์ผ๋ฉด ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ชจ๋ฆ
๋๋ค.
num_workers๊ฐ ํด ๋ ๊ต์ฐฉ ์ํ๋ ๋ง๋ฌ์ต๋๋ค.
๋์๊ฒ ๋ฌธ์ ๋ ์์
์ ์ค๋ ๋๊ฐ ์ด๋ค ์ด์ ๋ก ์ฃฝ์ผ๋ฉด index_queue.put
๊ฐ ์์ํ ์ค๋จ๋๋ค๋ ๊ฒ์
๋๋ค. ์์
์ค๋ ๋๊ฐ ์ฃฝ์ด๊ฐ๋ ํ ๊ฐ์ง ์ด์ ๋ ์ด๊ธฐํ ์ค unpickler๊ฐ ์คํจํ๊ธฐ ๋๋ฌธ์
๋๋ค. ์ด ๊ฒฝ์ฐ 2017๋
5์ ๋ง์คํฐ์ ์ด Python ๋ฒ๊ทธ ์์ ๊น์ง ์์
์ ์ค๋ ๋๊ฐ ์ฃฝ๊ณ ๋์๋ ์ค๋จ์ด ๋ฐ์ํฉ๋๋ค. ์ ๊ฒฝ์ฐ์๋ ์ผ๊ด ํ๋ฆฌํ์นญ ํ๋ผ์ด๋ฐ ๋จ๊ณ์์ ์ค๋จ์ด ๋ฐ์ํ์ต๋๋ค.
SimpleQueue
์ฌ์ฉ๋ DataLoaderIter
๋ฅผ Queue
๋ก ๋์ฒดํ์ฌ ์ฐ์ํ ์์ธ ๋ฉ์์ง์ ํจ๊ป ์๊ฐ ์ด๊ณผ๋ฅผ ํ์ฉํฉ๋๋ค.
UPD: ์ ๊ฐ ์๋ชป ์๊ฐํ์ต๋๋ค. ์ด ๋ฒ๊ทธ ์์ ์ Queue
๊ฐ ์๋๋ผ SimpleQueue
Queue
ํจ์นํฉ๋๋ค. ์์
์ ์ค๋ ๋๊ฐ ์จ๋ผ์ธ ์ํ๊ฐ ์๋ ๊ฒฝ์ฐ SimpleQueue
๊ฐ ์ ๊ธฐ๋ ๊ฒ์ ์ฌ์ ํ โโ์ฌ์ค์
๋๋ค. ์ด๋ฅผ ํ์ธํ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ด ์ค ์ self.workers = []
๋ก ๋ฐ๊พธ๋ ๊ฒ์
๋๋ค.
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์๊ณ shm (ํ๊ฐ์์ด)์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์๋ง๋ Queue ๋๋ ๋ค๋ฅธ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋ซ์ต๋๊น?
๋น์ทํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด ์ฝ๋๋ ๋ฉ์ถ๊ณ ์๋ฌด ๊ฒ๋ ์ธ์ํ์ง ์์ต๋๋ค. num_workers=0์ผ๋ก ์ค์ ํ๋ฉด ์๋ํ์ง๋ง
dataloader = DataLoader(transformed_dataset, batch_size=2, shuffle=True, num_workers=2)
model.cuda()
for i, batch in enumerate(dataloader):
print(i)
๋ฃจํ ๋ค์ model.cuda()๋ฅผ ๋ฃ์ผ๋ฉด ๋ชจ๋ ๊ฒ์ด ์ ์คํ๋ฉ๋๋ค.
dataloader = DataLoader(transformed_dataset, batch_size=2, shuffle=True, num_workers=2)
for i, batch in enumerate(dataloader):
print(i)
model.cuda()
๋๊ตฌ๋ ์ง ๊ทธ ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
ImageNet์ ๊ต์กํ๋ ๋์์๋ ๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ํน์ ์ํคํ ์ฒ๊ฐ ์๋ ํน์ ์๋ฒ์์ ์ผ๊ด๋๊ฒ ํ๊ฐ์ ์ฒซ ๋ฒ์งธ ๋ฐ๋ณต์์ ์ค๋จ๋์ง๋ง(๋์ผํ ์ํคํ ์ฒ๋ฅผ ๊ฐ์ง ๋ค๋ฅธ ์๋ฒ ๋๋ ์ํคํ ์ฒ๊ฐ ๋ค๋ฅธ ๋์ผํ ์๋ฒ์์๋ ์๋) ์ ํจ์ฑ ๊ฒ์ฌ ์ ํ๊ฐํ๋ ๋์ ํญ์ ์ฒซ ๋ฒ์งธ ๋ฐ๋ณต์ ๋๋ค. ๋ด๊ฐ Torch๋ฅผ ์ฌ์ฉํ ๋ nccl์ด ์ด์ ๊ฐ์ ๊ต์ฐฉ ์ํ๋ฅผ ์ ๋ฐํ ์ ์์์ ๋ฐ๊ฒฌํ์ต๋๋ค. ๋๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๋๋ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ ๊ธฐ์์ ์์ ๋ถ๋ถ์์ ๋ฌด์์๋ก ๋ฉ์ถฅ๋๋ค. ์์์ ์ธ๊ธํ ๋ชจ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ์๊ฒ ์ ํฉํ์ง ์์ต๋๋ค. Ctrl-C๋ฅผ ๋๋ฅด๋ฉด ๋ค์์ด ์ธ์๋ฉ๋๋ค.
Traceback (most recent call last):
File "/home/zhangheng_li/applications/anaconda3/lib/python3.6/multiprocessing/process.py", line 249, in _bootstrap
self.run()
File "/home/zhangheng_li/applications/anaconda3/lib/python3.6/multiprocessing/process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "/home/zhangheng_li/applications/anaconda3/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 44, in _worker_loop
data_queue.put((idx, samples))
File "/home/zhangheng_li/applications/anaconda3/lib/python3.6/multiprocessing/queues.py", line 354, in put
self._writer.send_bytes(obj)
File "/home/zhangheng_li/applications/anaconda3/lib/python3.6/multiprocessing/connection.py", line 200, in send_bytes
self._send_bytes(m[offset:offset + size])
File "/home/zhangheng_li/applications/anaconda3/lib/python3.6/multiprocessing/connection.py", line 398, in _send_bytes
self._send(buf)
File "/home/zhangheng_li/applications/anaconda3/lib/python3.6/multiprocessing/connection.py", line 368, in _send
n = write(self._handle, buf)
KeyboardInterrupt
Traceback (most recent call last):
File "scripts/train_model.py", line 640, in <module>
main(args)
File "scripts/train_model.py", line 193, in main
train_loop(args, train_loader, val_loader)
File "scripts/train_model.py", line 341, in train_loop
ee_optimizer.step()
File "/home/zhangheng_li/applications/anaconda3/lib/python3.6/site-packages/torch/optim/adam.py", line 74, in step
p.data.addcdiv_(-step_size, exp_avg, denom)
KeyboardInterrupt
๋์ปค ๋ด๋ถ์ ๋จ์ผ ์์ ์์ ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ๋ ๋น์ทํ ๋ฌธ์ ๊ฐ ์์๊ณ ์ ๊ฒฝ์ฐ์๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ์์ ํ์ธํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ปค๋ 64MB์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ง ํ ๋นํ๋ ๊ฒ์ผ๋ก ๋ณด์ด์ง๋ง 1๋ช ์ ์์ ์์ ๋ํด 440MB๊ฐ ํ์ํ๋๋ฐ, ์ด๋ก ์ธํด @apaszke์์ ์ค๋ช ํ ๋์์ด ๋ฐ์ํ์ ์ ์์ต๋๋ค.
๋๋ ๊ฐ์ ๋ฌธ์ ๋ก ๊ณ ๋ฏผํ๊ณ ์์ง๋ง ์ด ์ค๋ ๋์ ๋๋ถ๋ถ์ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ๋ค๋ฅธ ํ๊ฒฝ์ ์์ผ๋ฏ๋ก ๋ด ์ ๋ ฅ์ด ๊ทผ๋ณธ์ ์ธ ์์ธ์ ์ฐพ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ๋ด pytorch๋ Windows10์์ peterjc123์ด ๋น๋ํ ์ฐ์ํ conda ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ์ค์น๋ฉ๋๋ค.
cifar10 ๋ฐ์ดํฐ ์ธํธ์์ ์ผ๋ถ cnn์ ์คํํ๊ณ ์์ต๋๋ค. ๋ฐ์ดํฐ ๋ก๋์ ๊ฒฝ์ฐ num_workers๋ 1๋ก ์ค์ ๋ฉ๋๋ค. num_workers > 0์ด๋ฉด BrokenPipeError๊ฐ ๋ฐ์ํ๋ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์๊ณ #494์์ ๊ถ์ฅํ์ง ์์ง๋ง ์ ๊ฐ ๊ฒช๊ณ ์๋ ๊ฒ์ BrokenPipeError๊ฐ ์๋๋ผ ์ผ๋ถ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ค๋ฅ์ ๋๋ค. ์ค๋ฅ๋ ํญ์ ๋ง์ง๋ง epoch์ ์ ํจ์ฑ ๊ฒ์ฌ ์งํ์ ๋ค์ epoch์ ๋ํ ํ๋ จ ์์ ์ง์ ์ธ ์ฝ 50 epoch์์ ๋ฐ์ํ์ต๋๋ค. ์๊ฐ์ 90%๋ ์ ํํ 50 epoch์ด๊ณ ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ 1 ๋๋ 2 epoch๊ฐ ๋ค๋ฆ ๋๋ค. ๊ทธ ์ธ์๋ ๊ฑฐ์ ์ผ์นํฉ๋๋ค. num_workers=0์ผ๋ก ์ค์ ํ๋ฉด ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
@paulguerrero ๋ง์ต๋๋ค. ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ 64M์์ 2G๋ก ๋๋ ค์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ๋์ปค ์ฌ์ฉ์์๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค.
@berzjackson ๊ทธ๊ฒ์ conda ํจํค์ง์ ์๋ ค์ง ๋ฒ๊ทธ์ ๋๋ค. ์ต์ CI ๋น๋์์ ์์ ๋์์ต๋๋ค.
์์์ผ์ Pytorch๋ฅผ ์ฌ์ฉํ๋ ์๋ก์ด ๊ณผ์ ์ ์์ํ ~600๋ช ์ ์ฌ๋๋ค์ด ์์ต๋๋ค. ํฌ๋ผ์ ๋ง์ ์ฌ๋๋ค์ด ์ด ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ํ๊ณ ์์ต๋๋ค. ์ผ๋ถ๋ AWS P2, ์ผ๋ถ๋ ์์ฒด ์์คํ (์ฃผ๋ก GTX 1070, ์ผ๋ถ Titan X).
๊ทธ๋ค์ด ํ๋ จ์ ์ค๋จํ๋ฉด ์คํ ์ถ์ ์ ๋์ ๋ค์์ ๋ณด์ฌ์ค๋๋ค.
~/anaconda2/envs/fastai/lib/python3.6/multiprocessing/connection.py in _recv_bytes(self, maxsize)
405
406 def _recv_bytes(self, maxsize=None):
--> 407 buf = self._recv(4)
408 size, = struct.unpack("!i", buf.getvalue())
409 if maxsize is not None and size > maxsize:
~/anaconda2/envs/fastai/lib/python3.6/multiprocessing/connection.py in _recv(self, size, read)
377 remaining = size
378 while remaining > 0:
--> 379 chunk = read(handle, remaining)
380 n = len(chunk)
381 if n == 0:
num_workers=4, pin_memory=False๊ฐ ์์ต๋๋ค. ์ ๋ ๊ทธ๋ค์๊ฒ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ค์ ์ ํ์ธํ๋๋ก ์์ฒญํ์ต๋๋ค. ํ์ง๋ง ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ๊ฐ ํ ์ ์๋(๋๋ Pytorch์์ ํ ์ ์๋) ์ผ์ด ์์ต๋๊น? (num_workers๋ฅผ ์ค์ด๋ ๊ฒ ์ธ์๋ ์์ ์๋๊ฐ ์๋นํ ๋๋ ค์ง๋๋ค.)
์ ๋ @jph00 (Jeremy์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค! :))์ด ์ธ๊ธ๋ ์์ ์ ์์ต๋๋ค. "num_workers=0"๋ ์ฌ์ฉํด ๋ณด์์ต๋๋ค. resnet34๊ฐ ๋งค์ฐ ๋๋ฆฌ๊ฒ ๋ก๋๋๋ ๊ฒฝ์ฐ์๋ ๋์ผํ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ํผํ ๋ ๋งค์ฐ ๋๋ฆฝ๋๋ค. ๊ทธ๋ฌ๋ ์ด์ํ ์ ์ ๋ ธํธ๋ถ ์ธ์ ์ ์๋ช ๋์ ํ ๋ฒ๋ง ๋ฐ์ํ๋ค๋ ๊ฒ์ ๋๋ค.
๋ค์ ๋งํด, ์ผ๋จ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋๊ณ ํผํ ์ด ํ ๋ฒ ์คํ๋๋ฉด 4๊ฐ์ num_workers๋ก๋ ๊ณ์ ์ด๋ํ๊ณ ๋จ๊ณ๋ฅผ ๋ฐ๋ณตํ ์ ์์ผ๋ฉฐ ๋ชจ๋ ๊ฒ์ด GPU์์ ์์๋๋ก ๋น ๋ฅด๊ฒ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ ๋ PyTorch 0.2.0_4, Python 3.6.2, Torchvision 0.1.9, Ubuntu 16.04 LTS๋ฅผ ์ฌ์ฉ ์ค์ ๋๋ค. ๋ด ํฐ๋ฏธ๋์์ "df -h"๋ฅผ ์ํํ๋ฉด ์ฌ์ฉ๋ฅ ์ด ๋งค์ฐ ๋ฎ์์ง๋ง /dev/shm์ 16GB๊ฐ ์๋ค๊ณ ๋งํฉ๋๋ค.
๋ค์์ ๋ก๋ฉ์ด ์คํจํ ์คํฌ๋ฆฐ์ท์
๋๋ค(์ฐธ๊ณ ๋ก ์ ๋ ๋ฐ์ดํฐ์ num_workers=0์ ์ฌ์ฉํ์ต๋๋ค).
(์๋ฌธ์๊ฐ ์์์ ์ฃ์กํฉ๋๋ค. ๋ค ์บก์ณํ๊ธฐ ์ํด ์ค ์์์ ํด์ผ ํ์ต๋๋ค...)
@apiltamang ๋์ผํ ๋ฌธ์ ์ธ์ง ํ์คํ์ง ์์ต๋๋ค. ๋์ผํ ์ฆ์์ฒ๋ผ ๋ค๋ฆฌ์ง ์์ต๋๋ค. ์ฌ๊ธฐ๊ฐ ์๋ fast.ai ํฌ๋ผ์์ ์ง๋จํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
์ต๋ํ ๋นจ๋ฆฌ ์กฐ์ฌ ์ค์ ๋๋ค!
@soumith ์ ๋ @apaszke ์๊ฒ ์ฝ์ค์ ๋น๊ณต๊ฐ ํฌ๋ผ์ ๋ํ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๊ณ ๋ฌธ์ ๊ฐ ์๋ ํ์๋ค์๊ฒ ์์์ ๋ก๊ทธ์ธํ ์ ์๋ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ๋๋ก ์์ฒญํ์ต๋๋ค.
@jph00 ์๋ ํ์ธ์ Jeremy, ํ์ ์ค์ ์์์ ์ธ๊ธํ ๋์ด ๋ ค๊ณ ์๋ํ ํ์์ด ์์ต๋๊น? ๋์์ด ๋์๋์?
@SsnL ํ์ ์ค ํ ๋ช ์ด ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋
@jph00 ๊ฐ์ฌํฉ๋๋ค! ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ผ๋ก ์ธํ ์ค๋จ์ ์ฑ๊ณต์ ์ผ๋ก ์ฌํํ์ต๋๋ค. ๋ฌธ์ ๊ฐ ๋ค๋ฅธ ๊ณณ์ ์๋ ๊ฒฝ์ฐ ๋ ๊น์ด ํ๊ณ ๋ค์ด์ผ ํฉ๋๋ค! ์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ๊ณต์ ํด ์ฃผ์๊ฒ ์ต๋๊น?
๋ฌผ๋ก ์ ๋๋ค. ์ฌ๊ธฐ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋ ธํธ๋ถ์ด ์์ต๋๋ค: https://github.com/fastai/fastai/blob/master/courses/dl1/lesson1.ipynb . ํ์๋ค์ ๋ ธํธ๋ถ์ ์๋ ์์๋๋ก ๋ชจ๋ ์ ์ ์คํํ ๋๋ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ์์์ฐจ๋ ธ์ต๋๋ค. ๋ ธํธ๋ถ์ ์ค๋ช ์ด ์ ๋์ด ์๊ธฐ๋ฅผ ๋ฐ๋ผ์ง๋ง ๋ ธํธ๋ถ์ ์คํํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ์๋ ค์ฃผ์ญ์์ค. ์ฌ๊ธฐ์๋ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋ํ ์ ์๋ ๋งํฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
๋ณต์ ํ ์ ์๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ ธํธ๋ถ์ ์ถ๊ฐํ ์ ์๋ ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
@jph00 ์ง๊ธ ๋ฐ๋ก ์ฝ๋์
๋๋ ๋ํ ๊ทธ๋ฅ ๋ฉ์ถ๊ฒ ๋๋ ๊ฒ๋ณด๋ค shm ์ ํ์ ๋๋ฌํ์ ๋ ๋ฉ์ง ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด PR์ ๋ณด๋ผ ๊ฒ์ ๋๋ค.
ํ์ธ ์ต์ Pytorch conda ์ค์น์ ํจ๊ป CUDA 9 AMI๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก์ด AWS P2 ์ธ์คํด์ค์ ๋ฌธ์ ๋ฅผ ๋ณต์ ํ์ต๋๋ค. ๊ณต๊ฐ ํค๋ฅผ ์ ๊ณตํ๋ฉด ์ง์ ์ฌ์ฉํด ๋ณผ ์ ์๋ ์ก์ธ์ค ๊ถํ์ ๋ถ์ฌํ ์ ์์ต๋๋ค. ๋ด ์ด๋ฉ์ผ์ fast.ai์์ ๋ด ์ด๋ฆ์ ์ฒซ ๊ธ์์ ๋๋ค.
@jph00 ๋ฐฉ๊ธ ์ด๋ฉ์ผ์ ๋ณด๋์ต๋๋ค :) ๊ฐ์ฌํฉ๋๋ค!
@jph00 ๊ทธ๋ฆฌ๊ณ ์ฐธ๊ณ ๋ก, ์คํฌ๋ฆฝํธ๋ ๋ด ์์์์ 400MB์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๋ฐ๋ผ์ ์ด ๋ฌธ์ ๊ฐ ์๋ ํ์๋ค์ ๋ฌด๋ฃ shm์ด ์ถฉ๋ถํ์ง ํ์ธํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ข์, ๋๋ opencv์ Pytorch ๋ค์ค ์ฒ๋ฆฌ๊ฐ ๋๋๋ก ํจ๊ป ์ ์๋ํ์ง ์๋๋ค๋ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ์์ ๋์ต๋๋ค. ์ฐ๋ฆฌ ๋ํ์์๋ ๋ฌธ์ ๊ฐ ์์ง๋ง AWS์์๋ ๋ง์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค(P2 ์ธ์คํด์ค๊ฐ ํฌํจ๋ ์๋ก์ด ๋ฅ ๋ฌ๋ CUDA 9 AMI์์). ๋ชจ๋ cv2 ํธ์ถ ์ฃผ์์ ์ ๊ธ์ ์ถ๊ฐํด๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์๊ณ cv2.setNumThreads(0)
ํด๋ ํด๊ฒฐ๋์ง ์์ต๋๋ค. ์ด๊ฒ์ ๊ทธ๊ฒ์ ํด๊ฒฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค :
from multiprocessing import set_start_method
set_start_method('spawn')
๊ทธ๋ฌ๋ ์ด๋ ์ฑ๋ฅ์ ์ฝ 15% ์ํฅ์ ๋ฏธ์นฉ๋๋ค. opencv github ๋ฌธ์ ์ ๊ถ์ฅ ์ฌํญ์ https://github.com/tomMoral/loky ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ๋๋ ์ ์ ๊ทธ ๋ชจ๋์ ์ฌ์ฉํ๊ณ ๊ทธ๊ฒ์ด ๊ฒฌ๊ณ ํ๋ค๋ ๊ฒ์ ์์๋ค. ์ง๊ธ ๋น์ฅ์ ์ถฉ๋ถํ ์ ์๋ํ๋ ์๋ฃจ์ ์ด ์์ผ๋ฏ๋ก ๊ธด๊ธํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ Dataloader์ Loky๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๊น?
์๋ง๋ ๋ ์ค์ํ ๊ฒ์ ์ด๋ฌํ ๋ฌดํ ์ค๋จ์ด ์กํ ์ ์๋๋ก ์ต์ํ pytorch์ ๋๊ธฐ์ด์ ์ผ์ข ์ ์๊ฐ ์ด๊ณผ๊ฐ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ฐธ๊ณ ๋ก, '์คํฐ'์ด ์ผ๋ถ ๋ถํ์ 2-3๋ฐฐ ๋๋ฆฌ๊ฒ ๋ง๋ค๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์์ ์ ์๋ํ์ต๋๋ค. ๊ทธ๊ฒ์ ๋ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ๋น๋ก ์ด์์ ์ด์ง๋ ์์ง๋ง!
ํํค์ณ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ๋ ๊ฐ์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์ผ์ จ๋ค๋ ๋คํ์ ๋๋ค. ์ค์ ๋ก ๋ฐ์ดํฐ ์ธํธ์ ์ธ๋ฑ์ฑํ ๋ ์๊ฐ ์ด๊ณผ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ ผ์ํ๊ณ ๋ด์ผ ๊ฒฝ๋ก์ ๋ํด ๋ค์ ์ฐ๋ฝ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
cc @soumith ๋ ์ฐ๋ฆฌ๊ฐ ์กฐ์ฌํ๊ณ ์ถ์ ๋กํค์ธ๊ฐ์?
์์ ํ ๋ก ์ ์ํด ์ด ์ค๋ ๋์ ์ค๋ ์ฌ๋๋ค์ ์ํด opencv ๋ฌธ์ ๋ https://github.com/opencv/opencv/issues/5150 ์์ ๋ ๊น์ด ๋ ผ์๋ฉ๋๋ค.
์ด์ ์ด์ ๋ํ ์ ์ ํ ์์ ์ฌํญ์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. Dataloader๋ฅผ ProcessPoolExecutor.map()
์ฌ์ฉ์๋ก ๋ค์ ์์ฑํ๊ณ ํ
์ ์์ฑ์ ์์ ํ๋ก์ธ์ค๋ก ์ฎ๊ฒผ์ต๋๋ค. ๊ฒฐ๊ณผ๋ ์๋ Dataloader์์ ๋ณธ ๊ฒ๋ณด๋ค ๋ ๋น ๋ฅด๋ฉฐ ๋ด๊ฐ ์๋ํ ๋ชจ๋ ์ปดํจํฐ์์ ์์ ์ ์ด์์ต๋๋ค. ์ฝ๋๋ ํจ์ฌ ๊ฐ๋จํฉ๋๋ค.
์ฌ์ฉ์ ๊ด์ฌ์ด ์๋ ์ฌ๋์ด ์์ผ๋ฉด https://github.com/fastai/fastai/blob/master/fastai/dataloader.py ์์ ์ป์ ์ ์์ต๋๋ค.
API๋ Dataset์ด Pytorch ํ ์๋ฅผ ๋ฐํํ์ง ์์์ผ ํ๋ค๋ ์ ์ ์ ์ธํ๊ณ ๋ ํ์ค ๋ฒ์ ๊ณผ ๋์ผํฉ๋๋ค. ์ด๋ numpy ๋ฐฐ์ด ๋๋ python ๋ชฉ๋ก์ ๋ฐํํด์ผ ํฉ๋๋ค. ์ด์ Python์์ ์๋ํ๋๋ก ํ๋ ค๋ ์๋๋ฅผ ํ์ง ์์์ผ๋ฏ๋ก ๊ฑฐ๊ธฐ์ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ด๋ ๋๋ผ์ง ์์ ๊ฒ์ ๋๋ค.
(๋ด๊ฐ ์ด ๊ธธ์ ํํ ์ด์ ๋ ์ต๊ทผ GPU์์ ๋ง์ ์ด๋ฏธ์ง ์ฒ๋ฆฌ/์ฆ๊ฐ ์์ ์ ์ํํ ๋ Pytorch CPU๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ ์ฒ๋ฆฌ๋ฅผ ์ํํ๋ฉด GPU๋ฅผ ๊ณ์ ๋ฐ์๊ฒ ์ ์งํ ๋งํผ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ๋ฅผ ์๋ฃํ ์ ์๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ์ง๋ง opencv๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ๋ ๋นจ๋๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก GPU๋ฅผ ์ถฉ๋ถํ ํ์ฉํ ์ ์์์ต๋๋ค.)
์ค, ๋ง์ฝ ๊ทธ๊ฒ์ด opencv ๋ฌธ์ ๋ผ๋ฉด ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๋ํด ํ ์ ์๋ ์ผ์ด ๋ง์ง ์์ต๋๋ค. ์ค๋ ๋ ํ์ด ์์ ๋ ํฌํฌ๊ฐ ์ํํ ๊ฒ์ ์ฌ์ค์ ๋๋ค. ํนํ PyTorch ํ ์๋ฅผ ์ ๋๋ก ์ฒ๋ฆฌํ์ง ๋ชปํ ๊ฒ์ด๋ผ๋ ์ ์์ ๋ฐํ์ ์ข ์์ฑ์ ์ถ๊ฐํ๊ณ ์ถ์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ต์ฐฉ ์ํ์ ์์ธ๊ณผ @SsnL ์ด ์๋ ์์ธ์ ํ์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@jph00 Pillow-SIMD๋ฅผ ์ฌ์ฉํด
์, ๋๋ pillow-SIMD๋ฅผ ์ ์๋๋ค. ํฌ๊ธฐ ์กฐ์ , ํ๋ฆผ ๋ฐ RGB ๋ณํ ์๋๋ง ํฅ์๋ฉ๋๋ค.
์ฌ๊ธฐ์์ ํ ์ ์๋ ์ผ์ด ๋ง์ง ์๋ค๋ ๋ฐ ๋์ํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ์ ํํ opencv ๋ฌธ์ ๊ฐ ์๋๋ฉฐ(pytorch์ ํน์ ์ผ์ด์ค ๋ค์ค ์ฒ๋ฆฌ ๋ชจ๋์ ๊ณ ์ฌํ๊ณ ๋ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฌํ ์ ํ์ python ๋ค์ค ์ฒ๋ฆฌ๋ฅผ ์ง์ํ๋ค๊ณ ์ฃผ์ฅํ์ง ์์) Pytorch ๋ฌธ์ ๋ ์๋๋๋ค. ๊ทธ๋ฌ๋ Pytorch๊ฐ ์ด๋ค ์ข ๋ฅ์ ์ค๋ฅ๋ ์ ๊ณตํ์ง ์๊ณ ์กฐ์ฉํ ์์ํ ๊ธฐ๋ค๋ฆฐ๋ค๋ ์ฌ์ค์ (IMO) ๋น์ ์ด ๊ณ ์น ์ ์๋ ๊ฒ์ด๊ณ , ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ง์ ๋๋ํ ์ฌ๋๋ค์ด ์ง๋ ๋ช ๋ ๋์ ๋ฌธ์ ๋ฅผ ํผํ๋ ๊ฐ์ ๋ ๋ค์ค ์ฒ๋ฆฌ ์ ๊ทผ ๋ฐฉ์์ ๋ง๋ค๊ธฐ ์ํด ์ด์ฌํ ๋ ธ๋ ฅํด ์์ต๋๋ค. ์ด ๊ฐ์. ์ธ๋ถ ์ข ์์ฑ์ ๊ฐ์ ธ์ค์ง ์๊ณ ๊ทธ๋ค์ด ์ฌ์ฉํ๋ ์ ๊ทผ ๋ฐฉ์์์ ์ฐจ์ฉํ ์ ์์ต๋๋ค.
Loky ๋ค์ ์๋ ์ฌ๋ ์ค ํ ๋ช ์ธ Olivier Grisel์ Python์ ๋ค์ค ์ฒ๋ฆฌ ์ํ๋ฅผ ์์ฝํ ํ๋ฅญํ ์ฌ๋ผ์ด๋ ๋ฐํฌ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. http://ogrisel.github.io/decks/2017_euroscipy_parallelism/
๋๋ ์ด์ ๋ฌธ์ ๊ฐ ์๋ ์๋ก์ด Dataloader๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ด๋ ์ชฝ์ด๋ ์๊ดํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ FWIW์์๋ pytorch์ ๋ค์ค ์ฒ๋ฆฌ์ ๋ค๋ฅธ ์์คํ ๊ฐ์ ์ํธ ์์ฉ์ด ๋ฏธ๋์ ๋ค๋ฅธ ์ฌ๋๋ค์๊ฒ๋ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋งํ ๊ฐ์น๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ถํฌ 14.04์ Python 2.7์์ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ด ๋ฐ์ดํฐ ๋ก๋๋ sqlite ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฝ๊ณ num_workers=0
์ ์๋ฒฝํ๊ฒ ์๋ํ์ผ๋ฉฐ ๋๋ก๋ num_workers=1
๊ด์ฐฎ์ ๋ณด์๊ณ ๋ ๋์ ๊ฐ์ ๋ํด ๋งค์ฐ ๋น ๋ฅด๊ฒ ๊ต์ฐฉ ์ํ์ ๋น ์ก์ต๋๋ค. ์คํ ์ถ์ ์ recv_bytes
์ค๋จ๋ ํ๋ก์ธ์ค๋ฅผ ๋ณด์ฌ์ฃผ์์ต๋๋ค.
์๋ํ์ง ์๋ ๊ฒ๋ค:
--shm-size 8G
๋๋ --ipc=host
echo 16834 | sudo tee /proc/sys/kernel/shmmni
๋ฅผ ์คํํ์ฌ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ธ๊ทธ๋จผํธ ์๋ฅผ ๋๋ฆฝ๋๋ค(๊ธฐ๋ณธ๊ฐ์ ๋ด ์ปดํจํฐ์์ 4096).pin_memory=True
๋๋ pin_memory=False
์ค ์ด๋ ๊ฒ๋ ๋์์ด ๋์ง ์์์ต๋๋ค.๋ด ๋ฌธ์ ๋ฅผ ์์ ์ ์ผ๋ก ํด๊ฒฐํ ๊ฒ์ ๋ด ์ฝ๋๋ฅผ Python 3์ผ๋ก ์ด์ํ๋ ๊ฒ์ด์์ต๋๋ค. (Anaconda์) Python 3.6 ์ธ์คํด์ค ๋ด์์ ๋์ผํ ๋ฒ์ ์ Torch๋ฅผ ์คํํ๋ฉด ๋ด ๋ฌธ์ ๊ฐ ์์ ํ ํด๊ฒฐ๋์์ผ๋ฉฐ ์ด์ ๋ฐ์ดํฐ ๋ก๋๊ฐ ๋ ์ด์ ์ค๋จ๋์ง ์์ต๋๋ค.
@apaszke ์ฐธ๊ณ ๋ก, opencv์ ํจ๊ป ์ ์๋ํ๋ ๊ฒ์ด ์ค์ํ ์ด์ (๊ทธ๋ฆฌ๊ณ ํ ์น์ํ์ด ์ข์ ์ต์
์ด ์๋ ์ด์ - <200๊ฐ ์ด๋ฏธ์ง/์ด์ ํ์ ์ ์ฒ๋ฆฌํ ์ ์์!):
๋๊ตฌ๋ ์ง์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ์ฐพ์์ต๋๊น?
@iqbalu ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํด๋ณด์ญ์์ค: https://github.com/fastai/fastai/blob/master/fastai/dataloader.py
๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง๋ง num_workers=0
์ง์ํ์ง ์์ต๋๋ค.
@elbaro ์ค์ ๋ก ์๋ํ๋๋ฐ ์ ๊ฒฝ์ฐ์๋ ์ฌ๋ฌ ์์ ์๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์์์ต๋๋ค. ๊ฑฐ๊ธฐ์์ ๋ณ๊ฒฝํ ๊ฒ์ด ์์ต๋๊น?
@iqbalu fast.ai ๋ฐ์ดํฐ ๋ก๋๋ ์์ ์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ์ง ์์ต๋๋ค. ์ค๋ ๋๋ง ์ฌ์ฉํ๋ฏ๋ก ์ผ๋ถ ๋๊ตฌ์๋ ํ์๋์ง ์์ ์ ์์ต๋๋ค.
@apaszke @elbaro @jph00 fast.ai ์ ๋ฐ์ดํฐ ๋ก๋๊ฐ ๋ฐ์ดํฐ ์ฝ๊ธฐ ์๋๋ฅผ 10๋ฐฐ ์ด์ ๋ฆ์ท์ต๋๋ค. num_workers=8์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ด๋ค ํํธ๊ฐ ๊ทธ ์ด์ ๊ฐ ๋ ์ ์์ต๋๊น?
๋ฐ์ดํฐ ๋ก๋๊ฐ GIL์ ํฌ๊ธฐํ์ง ์๋ ํจํค์ง๋ฅผ ์ฌ์ฉํ ๊ฐ๋ฅ์ฑ์ด ์์ต๋๋ค.
@apaszke ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋ช
@iqbalu ์ ๋ง ์๋๋๋ค. ๊ทธ๋ฐ ์ผ์ด ์ผ์ด๋์๋ ์ ๋๋ค
๋๋ ๋ง์ ๊ฒ์ ์๋ํ๊ณ cv2.setNumThreads(0)
๋ง์นจ๋ด ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
@jph00 ๊ฐ์ฌํฉ๋๋ค
๋๋ ์ต๊ทผ์ ์ด ๋ฌธ์ ๋ก ๊ณ ๋ฏผํ๋ค. cv2.setNumThreads(0)
์ด(๊ฐ) ์๋ํ์ง ์์ต๋๋ค. ๋์ scikit-image๋ฅผ ์ฌ์ฉํ๋๋ก ๋ชจ๋ cv2 ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง๋ง ๋ฌธ์ ๋ ์ฌ์ ํ ์กด์ฌํฉ๋๋ค. ๊ฒ๋ค๊ฐ /dev/shm
16G๊ฐ ์์ต๋๋ค. ์ฌ๋ฌ GPU๋ฅผ ์ฌ์ฉํ ๋๋ง ์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ชจ๋ ๊ฒ์ด ๋จ์ผ GPU์์ ์ ์๋ํฉ๋๋ค. ์๋ฃจ์
์ ๋ํด ์๋ก์ด ์๊ฐ์ด ์๋ ์ฌ๋์ด ์์ต๋๊น?
๊ฐ์ ์ค๋ฅ. ๋จ์ผ GPU๋ฅผ ์ฌ์ฉํ ๋ ์ด ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋๋ฅผ ์ํด opencv ์ค๋ ๋๋ฅผ ๋นํ์ฑํํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
cv2.setNumThreads(0)
pytorch 0.3, cuda 8.0, ubuntu 16.04๋ ์ฌ์ฉํด ๋ณด์ธ์.
opencv๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
์ ๋ pytorch 0.3, cuda 8.0, ubuntu 14.04๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. cv2.resize() ์ฌ์ฉ์ ์์ํ ํ ์ด ์ค๋จ์ ๊ด์ฐฐํ์ต๋๋ค.
cv2.setNumThreads(0)์ด ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
2๊ฐ์ 1080Ti ๋ฐ 32GB RAM์ด ์๋ ์์คํ ์์ python 3.6, pytorch 0.3.0, cuda 8.0 ๋ฐ ubuntu 17.04๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ด ๋ฐ์ดํฐ ์ธํธ์ 8๋ช ์ ์์ ์๋ฅผ ์ฌ์ฉํ ๋ ๊ต์ฐฉ ์ํ๊ฐ ์์ฃผ ๋ฐ์ํฉ๋๋ค(์ฒซ ๋ฒ์งธ ์ํฌํฌ์์ ๋ฐ์). ์์ ์๋ฅผ 4๋ก ์ค์ด๋ฉด ์ฌ๋ผ์ง๋๋ค(80 Epoch ์คํ).
๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ๋ฉด RAM์ ~10GB์ ์ฌ์ ๊ณต๊ฐ์ด ์์ต๋๋ค.
์ฌ๊ธฐ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์ข ๋ฃํ ํ ๋ก๊ทธ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. https://gist.github.com/milani/42f50c023cdca407115b309237d29c70
์
๋ฐ์ดํธ: SHMMNI ์ฆ๊ฐ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์์ ํ์ธํฉ๋๋ค. Ubuntu 17.04์์ kernel.shmmni=8192
๋ฅผ /etc/sysctl.conf
.
Ubuntu 17.10, Python 3.6, Pytorch 0.3.1, CUDA 8.0์์๋ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ๊ณ ์๊ฐ์ด ์ผ์นํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ๋ RAM์ด ์ถฉ๋ถํ ๋จ์ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ํฌํฌ ์ดํ ๋๋ 200๋ฒ์งธ ์ดํ์ ๋ฐ์ํ ์ ์์ต๋๋ค.
kernel.shmmni=8192
์ cv2.setNumThreads(0)
์ ์กฐํฉํ๋ฉด ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ง๋ง ๊ฐ๋ณ์ ์ผ๋ก๋ ์๋ํ์ง ์์ต๋๋ค.
์ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. num_workers=4๋ก ์ค์ ํ๋ฉด ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ์ต๋๋ค. Ubuntu 17.10, Pytorch 0.3.1, CUDA 9.1, python 3.6์ ์ฌ์ฉํฉ๋๋ค. 4๊ฐ์ python ์ค๋ ๋๊ฐ ์์ผ๋ฉฐ, ๊ฐ ์ค๋ ๋๋ CPU(4๊ฐ ์ฝ์ด)๊ฐ ์ ํด ์ํ๋ก ์ ์ง๋๋ ๋์ 1.6GB ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํฉ๋๋ค. num_workers=0์ผ๋ก ์ค์ ํ๋ฉด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๋๊ฐ์ ๋ฌธ์ ๊ฐ ์๋๋ฐ ์ ํํ ํ ์ํฌํฌ ํ์ ์ ์ง๋์ง๋ง ๋ ์์ ๋ฐ์ดํฐ ์ธํธ์์๋ ์ค์ ๋ก ์ฌํํ ์ ์์ต๋๋ค. Docker ํ๊ฒฝ์์ CUDA 9.1, Pytorch 0.3.1, Python 3.6์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
@jph00 ์ Dataloader๋ฅผ ์๋ํ์ง๋ง ๋ด ์ฌ์ฉ
Ubuntu 17.10, CUDA 9.1, Pytorch ๋ง์คํฐ(19/04 ์์นจ ์ปดํ์ผ)์์ ์ ํํ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ํ ๋ด Dataset ํ์ ํด๋์ค์์ OpenCV๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ ๋ค์ค ์ฒ๋ฆฌ ์์ ๋ฐฉ๋ฒ์ 'forkserver'์์ 'spawn'์ผ๋ก ๋ณ๊ฒฝํ์ฌ ๊ต์ฐฉ ์ํ๋ฅผ ํผํ ์ ์์์ต๋๋ค.
# Set multiprocessing start method - deadlock
set_start_method(forkserver')
# Set multiprocessing start method - runs fine
set_start_method('spawn')
์์ ๋ชจ๋ ์ ๊ทผ ๋ฐฉ์์ ๊ฑฐ์ ์๋ํ์ต๋๋ค! ๊ทธ๋ค ์ค ๋๊ตฌ๋ ์ผํ์ง ์์์ต๋๋ค!
์ด ๋ฌธ์ ๋ ํ๋์จ์ด ์ํคํ
์ฒ์์ ์ผ๋ถ ๋นํธํ์ฑ๊ณผ ๊ด๋ จ์ด ์์ ์ ์์ผ๋ฉฐ Pytorch๊ฐ ์ด๋ฅผ ์ ๋ฐํ ์ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค! Pytorch ๋ฌธ์ ์ผ ์๋ ์๊ณ ์๋ ์๋ ์์ต๋๋ค!
์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
_BIOS๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค!
ํ๋ฒ ํด๋ณด์ธ์. ์ ์ด๋ ๋ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์ฌ๊ธฐ๋ ๋ง์ฐฌ๊ฐ์ง์ ๋๋ค. ์ฐ๋ถํฌ ํ์ดํ ์น 0.4, ํ์ด์ฌ 3.6.
๋ฌธ์ ๋ ์ฌ์ ํ pytorch 0.4 ๋ฐ python 3.6์ ์กด์ฌํ๋ ๊ฒ ๊ฐ์ต๋๋ค. pytorch ๋ฌธ์ ์ธ์ง ํ์คํ์ง ์์ต๋๋ค. ๋๋ opencv๋ฅผ ์ฌ์ฉํ๊ณ num_workers=8
, pin_memory=True
. ์์์ ์ธ๊ธํ ๋ชจ๋ ํธ๋ฆญ์ ์๋ํ๊ณ cv2.setNumThreads(0)
๋ฅผ ์ค์ ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค.
(1) PyTorch ๋ฐ์ดํฐ ๋ก๋์์ num_workers=0์ ์ค์ ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋ฉ๋๋ค(์ ์ฐธ์กฐ) ๋๋
(2) cv2.setNumThreads(0)์ ํฉ๋ฆฌ์ ์ผ๋ก ํฐ num_workers๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์ด๊ฒ์ ์ผ์ข ์ ์ค๋ ๋ ์ ๊ธ ๋ฌธ์ ์ฒ๋ผ ๋ณด์ ๋๋ค.
๋๋ cv2.setNumThreads(0)์ ๋ด ์ฃผ์ ํ์ด์ฌ ํ์ผ์ ์์ ๋ถ๋ถ์ผ๋ก ์ค์ ํ๊ณ ๊ทธ ์ดํ๋ก ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์ด ์์ต๋๋ค.
์, ์ด๋ฌํ ๋ฌธ์ ์ ๋๋ถ๋ถ์ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํฌํฌ๋ก๋ถํฐ ์์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ ๊ฐ์ง ๋์์ ์คํฐ ์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
์ ๊ฒฝ์ฐ์๋ ๋ชจ๋ธ์ nn.DataParallel๋ก ๋ํํ๊ณ ๋ฐ์ดํฐ ๋ก๋์์ num_workers > 0์ ์ฌ์ฉํ ๋ ๊ต์ฐฉ ์ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. nn.DataParallel ๋ํผ๋ฅผ ์ ๊ฑฐํ๋ฉด ์ ๊ธ ์์ด ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ ์ ์์ต๋๋ค.
CUDA_VISIBLE_DEVICES=0 ํ์ด์ฌ myscript.py --split 1
CUDA_VISIBLE_DEVICES=1 ํ์ด์ฌ myscript.py --split 2
๋ค์ค GPU๊ฐ ์์ผ๋ฉด ์คํฌ๋ฆฝํธ๊ฐ ๋ ๋๋ฆฌ๊ฒ ์คํ๋์ง๋ง ๋ฐ์ดํฐ ์ธํธ์ ๋ค๋ฅธ ๋ถํ ์์ ๋์์ ์ฌ๋ฌ ์คํ์ ์คํํ ์ ์์ต๋๋ค.
Python 3.6.2 / Pytorch 0.4.0์์ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฌด์๋ณด๋ค๋ pin_memory ์ ํ, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ ๋ณ๊ฒฝ, ๊ทธ๋ฆฌ๊ณ Skiamge ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์ ๋ cv2๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค!!)๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ์ง๋ง ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ ๋ฌด์์๋ก ๋ฐ์ํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ์ ์ดํ๋ โโ๊ฒ์ ์ฝ์์๋ณด๊ณ ํ๋ จ์ ๋ค์ ์์ํ๋ ๊ฒ์ ๋๋ค.
@jinh574 ๋ฐฉ๊ธ ๋ฐ์ดํฐ ๋ก๋ ์์ ์ ์๋ฅผ 0์ผ๋ก ์ค์
@Shuailong ํฐ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก ์๋ ๋๋ฌธ์ ํด๋น ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋๋ ์ด ๋ฌธ์ ์ ๋ํด ๋ ์กฐ์ฌํ ํ์๊ฐ ์๋ค
Python 3.6 / Pytorch 0.4.0์์ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. pin_memory
์ต์
์ด ์ํฅ์ ๋ฏธ์นฉ๋๊น?
collate_fn ๋ฐ num_workers>0์ PyTorch ๋ฒ์ < 0.4์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
__getitem__()
ํจ์์์ ZERO DIM ํ
์๋ฅผ ๋ฐํํ์ง ์๋๋ก ํ์ญ์์ค.
๋๋ NUMPY ์ด๋ ์ด๋ก ๋ฐํํฉ๋๋ค.
num_workers=0 ๋๋ cv2.setNumThreads(0)์ ์ค์ ํ ํ์๋ ํด๋น ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
์ด ๋ ๊ฐ์ง ๋ฌธ์ ์ค ํ๋๋ก ์คํจํฉ๋๋ค. ๊ฐ์ ์ผ์ ์ง๋ฉดํ ๋ค๋ฅธ ์ฌ๋์ด ์์ต๋๊น?
์ญ์ถ์ (๊ฐ์ฅ ์ต๊ทผ ํธ์ถ ๋ง์ง๋ง):
ํ์ผ "/opt/conda/envs/pytorch-py3.6/lib/python3.6/runpy.py", 193ํ, _run_module_as_main
"__main__", mod_spec)
ํ์ผ "/opt/conda/envs/pytorch-py3.6/lib/python3.6/runpy.py", 85ํ, _run_code
exec(์ฝ๋, run_globals)
ํ์ผ "/opt/conda/envs/pytorch-py3.6/lib/python3.6/site-packages/torch/distributed/launch.py", 209ํ,
๊ธฐ๋ณธ()
ํ์ผ "/opt/conda/envs/pytorch-py3.6/lib/python3.6/site-packages/torch/distributed/launch.py", ๋ผ์ธ 205, ๋ฉ์ธ
ํ๋ก์ธ์ค.๋๊ธฐ()
ํ์ผ "/opt/conda/envs/pytorch-py3.6/lib/python3.6/subprocess.py", ๋ผ์ธ 1457, ๋๊ธฐ ์ค
(pid, sts) = self._try_wait(0)
ํ์ผ "/opt/conda/envs/pytorch-py3.6/lib/python3.6/subprocess.py", 1404ํ, _try_wait
(pid, sts) = os.waitpid(self.pid, wait_flags)
ํค๋ณด๋ ์ธํฐ๋ฝํธ
ํ์ผ "/opt/conda/envs/pytorch-py3.6/lib/python3.6/multiprocessing/process.py", 258ํ, _bootstrap
self.run()
ํ์ผ "/opt/conda/envs/pytorch-py3.6/lib/python3.6/multiprocessing/process.py", ๋ผ์ธ 93, ์คํ ์ค
self._target( self._args, * self._kwargs)
ํ์ผ "/opt/conda/envs/pytorch-py3.6/lib/python3.6/site-packages/torch/utils/data/dataloader.py", 96ํ, _worker_loop
r = index_queue.get(์๊ฐ ์ด๊ณผ=MANAGER_STATUS_CHECK_INTERVAL)
ํ์ผ "/opt/conda/envs/pytorch-py3.6/lib/python3.6/multiprocessing/queues.py", 104ํ, get
self._poll(์๊ฐ ์ด๊ณผ)์ด ์๋ ๊ฒฝ์ฐ:
์ค๋ฌธ์กฐ์ฌ์์ ํ์ผ "/opt/conda/envs/pytorch-py3.6/lib/python3.6/multiprocessing/connection.py", 257ํ
self._poll ๋ฐํ(์๊ฐ ์ด๊ณผ)
ํ์ผ "/opt/conda/envs/pytorch-py3.6/lib/python3.6/multiprocessing/connection.py", 414ํ, _poll
r = ๋๊ธฐ([์์ฒด], ์๊ฐ ์ด๊ณผ)
ํ์ผ "/opt/conda/envs/pytorch-py3.6/lib/python3.6/multiprocessing/connection.py", ๋ผ์ธ 911, ๋๊ธฐ ์ค
์ค๋น = selector.select(์๊ฐ ์ด๊ณผ)
ํ์ผ "/opt/conda/envs/pytorch-py3.6/lib/python3.6/selectors.py", 376ํ, ์ ํ
fd_event_list = self._poll.poll(์๊ฐ ์ด๊ณผ)
ํค๋ณด๋ ์ธํฐ๋ฝํธ
๋ฒ์ '0.5.0a0+f57e4ce'๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ณ๋ ฌ ๋ฐ์ดํฐ ๋ก๋(num_workers=0)๋ฅผ ์ทจ์ํ๊ฑฐ๋ cv2.setNumThreads(0)๋ฅผ ์ค์ ํ๋ฉด ์๋ํฉ๋๋ค.
๋๋ #11985๊ฐ ๋ชจ๋ ์ค๋จ์ ์ ๊ฑฐํด์ผ ํ๋ค๊ณ ์๋นํ ํ์ ํฉ๋๋ค(๋น์ ์ด ์ฐ๋ฆฌ๊ฐ ํต์ ํ ์ ์๋ ๋ถํํ ์๊ฐ์ ๋ฐฉํดํ์ง ์๋ ํ). ์ด์ ๋ณํฉ๋์์ผ๋ฏ๋ก ์ด๊ฒ์ ๋ซ์ต๋๋ค.
cv2๊ฐ ๋ฉํฐํ๋ก์ธ์ฑ์์ ์ ๋๋ก ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์ cv2์ ์ค๋จ๋ ์ ์ดํ ์ ์์ต๋๋ค.
torch_nightly-1.0.0.dev20181029
ํ์ฌ๊น์ง๋ ์ด๊ฒ์ ๊ฒฝํํ๊ณ ์์ผ๋ฉฐ ์์ง PR์ด ๋ณํฉ๋์ง ์์์ต๋๊น?
@Evpok ์ด๊ฒ์ ๊ฑฐ๊ธฐ์ ๋ณํฉ๋์์ต๋๋ค. ์ด ํจ์น๊ฐ ์์ด์ผ ํฉ๋๋ค. ๋ ์ด์ ๋จ์์๋ ๊ต์ฐฉ ์ํ๊ฐ ๊ฐ๋ฅํ์ง ๊ถ๊ธํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ณผ ์ ์๋ ์ฌ์ด ์ฌํ์ด ์์ต๋๊น?
์ค์ ๋ก ์ ์ชฝ์์ ๊ด๋ จ์๋ ๋ค์ค ์ฒ๋ฆฌ ์๋ง์ผ๋ก ์ถ์ ํ์ต๋๋ค. ๋ถํธ์ ๋๋ ค ์ฃ์กํฉ๋๋ค.
์๋
ํ์ธ์ @Evpok
๋๋ torch_nightly-1.0.0
๋ฅผ ์ฌ์ฉํ๊ณ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๊น?
collate_fn ๋ฐ num_workers>0์ PyTorch ๋ฒ์ < 0.4์ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ:
__getitem__()
ํจ์์์ ZERO DIM ํ ์๋ฅผ ๋ฐํํ์ง ์๋๋ก ํ์ญ์์ค.
๋๋ NUMPY ์ด๋ ์ด๋ก ๋ฐํํฉ๋๋ค.
0 ํฌ๋ฏธํ ํ ์๋ฅผ ๋ฐํํ๋ ๋ฒ๊ทธ๋ฅผ ์์ ํ๋๋ฐ ๋ฌธ์ ๊ฐ ์ฌ์ ํ ์กด์ฌํฉ๋๋ค.
@zimenglan-sysu-512 ์ฃผ์ ๋ฌธ์ ๋ ๋ฉํฐํ๋ก์ธ์ฑ์ ํ๊ณ์์ต๋๋ค. spawn
๋๋ forkserver
(CPU-GPU ํต์ ์ ํ์)๋ฅผ ์ฌ์ฉํ ๋ ํ๋ก์ธ์ค ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ๋ ๊ฒ์ ๋ค์ ์ ํ์ ์ด๋ฉฐ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋ด๊ฐ ์กฐ์ํด์ผ ํ๋ ๊ฐ์ฒด์ ์ข
๋ฅ์ ์ ํฉํฉ๋๋ค.
์ด ์ค ์ด๋ ๊ฒ๋ ๋๋ฅผ ์ํด ์ผํ์ง ์์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ต์ opencv๋ ์๋ํฉ๋๋ค( 3.4.0.12
~ 3.4.3.18
๋ณ๊ฒฝํ ์ฌํญ ์์).
sudo pip3 install --upgrade opencv-python
@see-- opencv๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. :)
์ ๋ python2.7๊ณผ ํจ๊ป OpenCV 3.4.3.18์ ์ฌ์ฉ ์ค์ด๋ฉฐ ์ฌ์ ํ ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ด ๋๋ค. :/
๋ค์์ ์๋ํ์ญ์์ค.
from torch.utils.data.dataloader import DataLoader
๋์ ์
from torch.utils.data import DataLoader
์ฌ๊ธฐ์์ ์ ํ ๊ฒ์ฌ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
https://github.com/pytorch/pytorch/blob/656b565a0f53d9f24547b060bd27aa67ebb89b88/torch/utils/data/dataloader.py#L816
๋ค์์ ์๋ํ์ญ์์ค.
from torch.utils.data.dataloader import DataLoader
๋์ ์
from torch.utils.data import DataLoader
์ฌ๊ธฐ์์ ์ ํ ๊ฒ์ฌ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
pytorch/torch/utils/data/dataloader.py
656b565์ 816ํ
super(DataLoader, self).__setattr__(attr, val)
์ด๊ฒ์ ๋จ์ง ๋ณ์นญ์ด ์๋๋๊น? Torch.utils.data.__init__์์ dataloader.DataLoader๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
๋๋ ๋ํ num_workers> 0์ผ๋ก ๋งค๋ฌ๋ ค์์์ต๋๋ค. ๋ด ์ฝ๋์๋ opencv๊ฐ ์์ผ๋ฉฐ /dev/shm
์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ฌธ์ ๊ฐ ๋์ง ์์ต๋๋ค. ์์ ์ ์ ์ฌํญ์ด ์ ์๊ฒ ํจ๊ณผ์ ์ด์ง ์์์ต๋๋ค. ๋ด ์์ ์ฌํญ์ numpy๋ฅผ 1.14.1์์ 1.14.5๋ก ์
๋ฐ์ดํธํ๋ ๊ฒ์ด ์์ต๋๋ค.
conda install numpy=1.14.5
๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
ํ , ๋ด numpy ๋ฒ์ ์ 1.15.4์ด๋ฏ๋ก 1.14.5๋ณด๋ค ์ต์ ๋ฒ์ ์ ๋๋ค... ๊ทธ๋ผ ๊ด์ฐฎ์๊น์?
ํ , ๋ด numpy ๋ฒ์ ์ 1.15.4์ด๋ฏ๋ก 1.14.5๋ณด๋ค ์ต์ ๋ฒ์ ์ ๋๋ค... ๊ทธ๋ผ ๊ด์ฐฎ์๊น์?
Idk, numpy ์ ๋ฐ์ดํธ๋ mkl์ ์ ๋ฐ์ดํธํ์ต๋๋ค.
์ด๋ค mkl ๋ฒ์ ์ด ์์ต๋๊น? ๊ด์ฐ์ 2019.1(๋น๋ 144)์ด๊ณ ์ด๋ฆ์ mkl์ด ํฌํจ๋ ๊ธฐํ ํจํค์ง๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
mkl ์๋น์ค 1.1.2 py37he904b0f_5
mkl_fft 1.0.6 py37hd81dba3_0
mkl_random 1.0.2 py37hd81dba3_0
์ด๋ค mkl ๋ฒ์ ์ด ์์ต๋๊น? ๊ด์ฐ์ 2019.1(๋น๋ 144)์ด๊ณ ์ด๋ฆ์ mkl์ด ํฌํจ๋ ๊ธฐํ ํจํค์ง๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
mkl ์๋น์ค 1.1.2 py37he904b0f_5
mkl_fft 1.0.6 py37hd81dba3_0
mkl_random 1.0.2 py37hd81dba3_0
conda list | grep mkl
mkl 2018.0.1 h19d6760_4
mkl-service 1.1.2 py36h17a0993_4
์ต์ pytorch์์ ์ฌ์ ํ ์ค๋จ์ด ํ์๋๋ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ์ฌํํ๋ ์งง์ ์คํฌ๋ฆฝํธ๋ฅผ ์ ๊ณตํ ์ ์๋ค๋ฉด ํฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ๊ฐ์ฌ ํด์!
๋๋ ์ฌ์ ํ ์ด ๊ต์ฐฉ ์ํ๋ฅผ ๋ณด๊ณ ์์ต๋๋ค. ์ฌ์์ฐํ๋ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค ์ ์๋์ง ํ์ธํ๊ฒ ์ต๋๋ค.
pin_memory=True
์ด(๊ฐ) ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
pin_memory=True
์ ํจ๊ป ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. 70 epoch ํ์๋ ์ฌ์ ํ ๋ฉ์ถฅ๋๋ค. ์ง๊ธ๊น์ง ๋๋ฅผ ์ํด ์ผํ ๊ฒ์ num_workers=0
์ค์ ํ๋ ๊ฒ์ด์ง๋ง ๋์ ๋๊ฒ ๋๋ฆฝ๋๋ค.
๋ํ ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ๊ณ ์์ต๋๋ค(๋งค์ฐ ๋ฌด์์๋ก ๋ฐ์). pin_memory
์๋ํ๊ณ Numpy๋ฅผ ์
๋ฐ์ดํธํ์ต๋๋ค. ๋ค๋ฅธ ์ปดํจํฐ์์ ์คํํด ๋ณด๊ฒ ์ต๋๋ค.
๋ฐ์ดํฐ ๋ก๋๊ฐ ์๋ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฉํฐ์ค๋ ๋ฉ ๋์ ๋ฉํฐํ๋ก์ธ์ฑ์ ์ฌ์ฉํด ๋ณด์ญ์์ค. ์ด๊ฒ์ ๋๋ฅผ ์ํด ๋ฌธ์ ๋ฅผ ์์ ํ ํด๊ฒฐํ์ต๋๋ค (๊ทธ๋ฐ๋ฐ GIL ๋๋ฌธ์ Python์์ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์๋ ๋ ์ข์ต๋๋ค)
Pytorch1.0, Pillow5.0.0 numpy1.16.1 python3.6์์ ๋์ผํ ์ค๋ฅ
๋๋ ๋ํ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. pin_memory=True
๋ฐ num_workers=0
. ๋ฐ์ดํฐ ์ธํธ์ ์์ ๋ถ๋ถ์ ์ฌ์ฉํ ๋ ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์์ต๋๋ค. ์ ์ฒด ๋ฐ์ดํฐ ์ธํธ๋ง ์ฌ์ฉํ๋ฉด ์ด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํธ์ง: ์์คํ ์ ๊ฐ๋จํ ๋ค์ ์์ํ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค.
๋๋ ๋น์ทํ ๋ฌธ์ ๊ฐ ์์๋ค. ์ผ๋ถ ์ฝ๋์์ ์ด ํจ์๋ (๊ฑฐ์ ํญ์) d_iter.next()์์ ์ค๋จ๋ฉ๋๋ค.
def get_next_batch(d_iter, loader):
try:
data, label = d_iter.next()
except StopIteration:
d_iter = iter(loader)
data, label = d_iter.next()
return data, label
๋๋ฅผ ์ํด ์ผํ ํดํน์์ด ํจ์๋ฅผ ํธ์ถ ํ ํ ์ฝ๊ฐ์ ์ง์ฐ์ ์ถ๊ฐํ๋ ๊ฒ์ด ์์ต๋๋ค.
trn_X, trn_y = get_next_batch(train_data_iter, train_loader)
time.sleep(0.003)
val_X, val_y = get_next_batch(valid_data_iter, valid_loader)
์ง์ฐ์ด ๊ต์ฐฉ ์ํ๋ฅผ ํผํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๊น?
๋๋ ์ฌ์ ํ ์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ค. pytorch 1.0 ๋ฐ python 3.7 ์ฌ์ฉ. ์ฌ๋ฌ data_loader๋ฅผ ์ฌ์ฉํ ๋ ์ด ๋ฒ๊ทธ๊ฐ ๋ํ๋ฉ๋๋ค. 3๊ฐ ๋ฏธ๋ง์ data_loader๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋จ์ผ GPU๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ๋ฒ๊ทธ๊ฐ ๋ํ๋์ง ์์ต๋๋ค. ์ํ์ ๋ง์น:
๋ด ์๋ฃจ์
์ ์ ์ฒ๋ฆฌ ํ๋ก๊ทธ๋จ์์ cv2.setNumThreads(0)์ ์ถ๊ฐํฉ๋๋ค.
๋๋ ๊ธฐ์ฐจ์ ๋ฐ์์ํ 2 ๊ฐ์ ๋ฐ์ดํฐ ๋ก๋๊ฐ ์์ต๋๋ค.
ํ ๋ฒ๋ง ํ๊ฐ์๋ฅผ ์คํํ ์ ์์ต๋๋ค.
๋ฐฉ๊ธ pytorch 1.1์์ ์ด ๋ฒ๊ทธ๋ฅผ ๋ง๋ฌ์ต๋๋ค. 99๋ฒ์งธ epoch์ ๋์์ ๊ฐ์ ์์น์ ๋ ๋ฒ ๋ฉ์ท์ต๋๋ค. pin_memory
์ด False
๋ก ์ค์ ๋์์ต๋๋ค.
์์ ์> 0์ ์ฌ์ฉํ ๋๋ ๋์ผํ ๋ฌธ์ , ํ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์์ต๋๋ค.
๋ด ์๋ฃจ์ ์ ์ ์ฒ๋ฆฌ ํ๋ก๊ทธ๋จ์์ cv2.setNumThreads(0)์ ์ถ๊ฐํฉ๋๋ค.
๋๋ ๊ธฐ์ฐจ์ ๋ฐ์์ํ 2 ๊ฐ์ ๋ฐ์ดํฐ ๋ก๋๊ฐ ์์ต๋๋ค.
ํ ๋ฒ๋ง ํ๊ฐ์๋ฅผ ์คํํ ์ ์์ต๋๋ค.
์ด ์๋ฃจ์ ์ ์ ์๊ฒ ํจ๊ณผ์ ์ ๋๋ค. ๊ฐ์ฌํฉ๋๋ค.
๋ฐ์ดํฐ ๋ก๋๋ ๋ด๊ฐ Epoch๋ฅผ ๋ง์น๋ฉด ์ค์ง๋๊ณ ์ Epoch๋ฅผ ์์ํฉ๋๋ค.
๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ง๋๋ค. ์ ๊ฒฝ์ฐ์๋ opencv-python์ ์ค์นํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค(์ด์ ์ opencv3์ ์ค์นํ์ต๋๋ค). opencv-python์ ์ด๋ํ ํ ๊ต์ก์ด ์ค์ง๋์ง ์์ต๋๋ค.
๊ทธ๊ฒ๋ ์ข์ ์๊ฐ์ด์ผ
2019-06-20 10:51:02์์ "hongzhenwang" [email protected]์์ ๋ค์๊ณผ ๊ฐ์ด ์ผ์ต๋๋ค.
๋ฐ์ดํฐ ๋ก๋๋ ๋ด๊ฐ Epoch๋ฅผ ๋ง์น๋ฉด ์ค์ง๋๊ณ ์ Epoch๋ฅผ ์์ํฉ๋๋ค.
๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ง๋๋ค. ์ ๊ฒฝ์ฐ์๋ opencv-python์ ์ค์นํ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค(์ด์ ์ opencv3์ ์ค์นํ์ต๋๋ค). opencv-python์ ์ด๋ํ ํ ๊ต์ก์ด ์ค์ง๋์ง ์์ต๋๋ค.
โ
๋น์ ์ด ๋๊ธ์ ๋ฌ์๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๋ฐ๋ ๊ฒ์
๋๋ค.
์ด ์ด๋ฉ์ผ์ ์ง์ ๋ต์ฅํ๊ฑฐ๋ GitHub์์ ๋ณด๊ฑฐ๋ ์ค๋ ๋๋ฅผ ์์๊ฑฐํ์ธ์.
๋๋ ์ฌ์ ํ ์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ค. pytorch 1.0 ๋ฐ python 3.7 ์ฌ์ฉ. ์ฌ๋ฌ data_loader๋ฅผ ์ฌ์ฉํ ๋ ์ด ๋ฒ๊ทธ๊ฐ ๋ํ๋ฉ๋๋ค. 3๊ฐ ๋ฏธ๋ง์ data_loader๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋จ์ผ GPU๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ๋ฒ๊ทธ๊ฐ ๋ํ๋์ง ์์ต๋๋ค. ์ํ์ ๋ง์น:
1. time.sleep(0.003) 2. pin_memory=True/False 3. num_workers=0/1 4. from torch.utils.data.dataloader import DataLoader 5. writing 8192 to /proc/sys/kernel/shmmni None of them works. Don't know whether there is any solutions?
์ฌ์ ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ฐพ์ผ๋ ค๊ณ ํฉ๋๋ค. ๋ค๋ฅธ GPU์์ ๋์์ 2๊ฐ์ ๋ณ๋ ฌ ํ๋ก์ธ์ค๋ฅผ ์คํํ ๋๋ง ์ด ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ํ๋๋ ๊ณ์ ์งํ๋๊ณ ๋ค๋ฅธ ํ๋๋ ๋ฉ์ถฅ๋๋ค.
num_workers=4๋ก ์ค์ ํ๋ฉด ํ๋ก๊ทธ๋จ์ด ๋ฐฐ์น 4๊ฐ๋ง๋ค ๋ช ์ด(๋๋ ๋ช ๋ถ) ๋์ ์ค๋จ๋์ด ๋ง์ ์๊ฐ์ ๋ญ๋นํฉ๋๋ค. ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ํ ์์ด๋์ด๊ฐ ์์ต๋๊น?
๋ฐ์ดํฐ ๋ก๋์ pin_memory=True ๋ฐ num_workers=0 ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์๋ฃจ์ ์ ๋๋ค!
๋ฐ์ดํฐ ๋ก๋์ pin_memory=True ๋ฐ num_workers=0 ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์๋ฃจ์ ์ ๋๋ค!
@ArturoDeza
์ด๊ฒ์ด ํด๊ฒฐ์ฑ ์ผ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ num_workers=0์ผ๋ก ์ค์ ํ๋ฉด CPU์ ์ ์ฒด ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ ์๋๊ฐ ๋๋ ค์ง๊ณ GPU ์ฌ์ฉ๋ฅ ์ด ๋งค์ฐ ๋ฎ์์ง๋๋ค.
์ ์๊ฒ ๊ทธ ์ด์ ๋ ์์คํ
์ CPU๊ฐ ์ถฉ๋ถํ์ง ์๊ฑฐ๋ Dataloader์ ์ง์ ๋ num_workers
์ถฉ๋ถํ์ง ์์๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ์ดํฐ ๋ก๋์ __get_item__
๋ฉ์๋๊ฐ numpy
, librosa
๋๋ opencv
์ ๊ฐ์ ์ค๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ๋ก๋ ์์
์์์ ์ค๋ ๋ฉ์ ๋นํ์ฑํํ๋ ๊ฒ๋ ์ข์ ์๊ฐ์ผ ์ ์์ต๋๋ค numpy
opencv
(์ด๊ฒ์ด ์ค์ํ ์ด์ ๋ ์๋ ์ฐธ์กฐ). ์ด๊ฒ์ OMP_NUM_THREADS=1 MKL_NUM_THREADS=1 python train.py
ํ๋ จ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ฌ ๋ฌ์ฑํ ์ ์์ต๋๋ค. ์๋ ์ค๋ช
์ ๋ช
ํํ ํ๊ธฐ ์ํด ๊ฐ Dataloader ๋ฐฐ์น๋ ๋จ์ผ ์์
์๊ฐ ์ฒ๋ฆฌํฉ๋๋ค. ๊ฐ ์์
์๋ batch_size
์ํ์ ์ฒ๋ฆฌํ์ฌ ๋จ์ผ ๋ฐฐ์น๋ฅผ ์๋ฃํ ๋ค์ ์ ๋ฐ์ดํฐ ๋ฐฐ์น ์ฒ๋ฆฌ๋ฅผ ์์ํฉ๋๋ค.
num_workers
๋จธ์ (๋๋ Kubernetes๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํฌ๋)์ CPU ์๋ณด๋ค ๋ฎ๊ฒ ์ค์ ํด์ผ ํ์ง๋ง ๋ฐ์ดํฐ๊ฐ ๋ค์ ๋ฐ๋ณต์ ์ํด ํญ์ ์ค๋น๋ ์ ์์ ๋งํผ ์ถฉ๋ถํ ๋๊ฒ ์ค์ ํด์ผ ํฉ๋๋ค. GPU๊ฐ t
์ด ์์ ๊ฐ ๋ฐ๋ณต์ ์คํํ๊ณ ๊ฐ ๋ฐ์ดํฐ ๋ก๋ ์์
์๊ฐ ๋จ์ผ ๋ฐฐ์น๋ฅผ ๋ก๋/์ฒ๋ฆฌํ๋ ๋ฐ N*t
์ด๊ฐ ๊ฑธ๋ฆฐ๋ค๋ฉด num_workers
๋ฅผ N
์ด์์ผ๋ก ์ค์ ํด์ผ ํฉ๋๋ค N
CPU๊ฐ ์์ด์ผ ํฉ๋๋ค.
๋ถํํ๋ Dataloader๊ฐ K
์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์์ฑ๋๋ ํ๋ก์ธ์ค ์๋ num_workers*K = N*K
๋ฉ๋๋ค. ์ด๋ ์์คํ
์ CPU ์๋ณด๋ค ํจ์ฌ ๋ง์ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํฌ๋๊ฐ ์ ํ๋๊ณ Dataloader๊ฐ ๋งค์ฐ ๋๋ ค์ง๋๋ค. ์ด๋ก ์ธํด Dataloader๊ฐ t์ด๋ง๋ค ๋ฐฐ์น๋ฅผ ๋ฐํํ์ง ์์ GPU๊ฐ ์ค๋จ๋ ์ ์์ต๋๋ค.
K
์ค๋ ๋๋ฅผ ํผํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ์ OMP_NUM_THREADS=1 MKL_NUM_THREADS=1 python train.py
๋ฉ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ํธ์ถํ๋ ๊ฒ์
๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ Dataloader ์์
์๊ฐ ๋จ์ผ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋๋ก ์ ํํ๊ณ ์์คํ
์ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. GPU ๊ณต๊ธ์ ์ ์งํ๋ ค๋ฉด ์ฌ์ ํ ์ถฉ๋ถํ num_workers
๊ฐ ์์ด์ผ ํฉ๋๋ค.
๋ํ __get_item__
์์ ์ฝ๋๋ฅผ ์ต์ ํํ์ฌ ๊ฐ ์์
์๊ฐ ์งง์ ์๊ฐ์ ๋ฐฐ์น๋ฅผ ์๋ฃํ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค. ์์
์๊ฐ ๋ฐฐ์น ์ ์ฒ๋ฆฌ๋ฅผ ์๋ฃํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ด ๋์คํฌ์์ ๊ต์ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ์๊ฐ(ํนํ ๋คํธ์ํฌ ์ ์ฅ์์์ ์ฝ๋ ๊ฒฝ์ฐ) ๋๋ ๋คํธ์ํฌ ๋์ญํญ(๋คํธ์ํฌ์์ ์ฝ๋ ๊ฒฝ์ฐ)์ ์ํด ๋ฐฉํด๋ฐ์ง ์๋์ง ํ์ธํ์ญ์์ค. ๋์คํฌ). ๋ฐ์ดํฐ์ธํธ๊ฐ ์๊ณ RAM์ด ์ถฉ๋ถํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ์ธํธ๋ฅผ RAM(๋๋ /tmpfs
)์ผ๋ก ์ด๋ํ๊ณ ๋น ๋ฅธ ์ก์ธ์ค๋ฅผ ์ํด ์ฝ์ด๋ณด์ธ์. Kubernetes์ ๊ฒฝ์ฐ RAM ๋์คํฌ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค(Kubernetes์์ emptyDir
๊ฒ์).
__get_item__
์ฝ๋๋ฅผ ์ต์ ํํ๊ณ ๋์คํฌ ์ก์ธ์ค/๋คํธ์ํฌ ์ก์ธ์ค๊ฐ ์์ธ์ด ์๋์ ํ์ธํ์ง๋ง ์ฌ์ ํ ์ค๋จ์ด ํ์๋๋ ๊ฒฝ์ฐ ๋ ๋ง์ CPU(Kubernetes ํฌ๋์ฉ)๋ฅผ ์์ฒญํ๊ฑฐ๋ GPU๋ฅผ ๋ค์์ผ๋ก ์ด๋ํด์ผ ํฉ๋๋ค. CPU๊ฐ ๋ ๋ง์ ๋จธ์ .
๋ ๋ค๋ฅธ ์ต์
์ batch_size
๋ฅผ ์ค์ฌ ๊ฐ worker
๊ฐ ํด์ผ ํ ์์
์ ์ค์ด๊ณ ์ฌ์ ์ฒ๋ฆฌ๋ฅผ ๋ ๋นจ๋ฆฌ ์๋ฃํ๋๋ก ํ๋ ๊ฒ์
๋๋ค. ์ ํด GPU ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฌ์ฉ๋์ง ์๊ธฐ ๋๋ฌธ์ ํ์์ ์ต์
์ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ฐ๋์งํ์ง ์์ต๋๋ค.
์ผ๋ถ ์ฌ์ ์ฒ๋ฆฌ๋ฅผ ์คํ๋ผ์ธ์ผ๋ก ์ํํ๊ณ ๊ฐ ์์ ์์ ๋ถ๋ด์ ๋์ด์ค ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ ์์ ์๊ฐ wav ํ์ผ์ ์ฝ๊ณ ์ค๋์ค ํ์ผ์ ๋ํ ์คํํธ๋ก๊ทธ๋จ์ ๊ณ์ฐํ๋ ๊ฒฝ์ฐ ์คํ๋ผ์ธ์์ ์คํํธ๋ก๊ทธ๋จ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํ๊ณ ์์ ์์ ๋์คํฌ์์ ๊ณ์ฐ๋ ์คํํธ๋ก๊ทธ๋จ์ ์ฝ์ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ ์์ ์๊ฐ ํด์ผ ํ๋ ์์ ์ ์์ด ์ค์ด๋ญ๋๋ค.
horovod์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ง๋๋ค
๋น์ทํ ๋ฌธ์ ๋ฅผ ๋ง๋๋ณด์ธ์... ์ํฌํฌ๋ฅผ ๋๋ด๊ณ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํด ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ธฐ ์์ํ๋ ๋์ ๊ต์ฐฉ ์ํ๊ฐ ๋ฐ์ํ์ต๋๋ค...
@jinhou @jackroos horovod ๋ก ์ ํจ์ฑ ๊ฒ์ฌ ์์ ์ ๋ฌด์์๋ก ๋ฉ์ท์ต๋๋ค. ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ์ํํ๋ ์์ ์ ์๊ฐ ์ด๊ณผ๋ฅผ ์ค์ ํ๊ณ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๊ฑด๋๋ฐ๋ ๊ฒ์ ๋๋ค. ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
@jinhou @jackroos horovod ๋ก ์ ํจ์ฑ ๊ฒ์ฌ ์์ ์ ๋ฌด์์๋ก ๋ฉ์ท์ต๋๋ค. ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ์ํํ๋ ์์ ์ ์๊ฐ ์ด๊ณผ๋ฅผ ์ค์ ํ๊ณ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๊ฑด๋๋ฐ๋ ๊ฒ์ ๋๋ค. ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
์๋์. ์ด ๊ฒฝ์ฐ ๋ถ์ฐ ๊ต์ก์ ๋๋๋ค.
๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ํ ์ํฌํฌ๋ฅผ ๋ง์น๋ฉด ๋ฐ์ดํฐ ๋ก๋๊ฐ ์ค์ง๋๊ณ ์ ์ํฌํฌ๊ฐ ์์๋ฉ๋๋ค.
์์ด ์ ์ด๋ ๊ฒ ๋ง์?
๋๋ ์ฌ์ ํ ์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ค. pytorch 1.0 ๋ฐ python 3.7 ์ฌ์ฉ. ์ฌ๋ฌ data_loader๋ฅผ ์ฌ์ฉํ ๋ ์ด ๋ฒ๊ทธ๊ฐ ๋ํ๋ฉ๋๋ค. 3๊ฐ ๋ฏธ๋ง์ data_loader๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋จ์ผ GPU๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ๋ฒ๊ทธ๊ฐ ๋ํ๋์ง ์์ต๋๋ค. ์ํ์ ๋ง์น:
- time.sleep(0.003)
- pin_memory=์ฐธ/๊ฑฐ์ง
- num_workers=0/1
- Torch.utils.data.dataloader์์ DataLoader ๊ฐ์ ธ์ค๊ธฐ
- /proc/sys/kernel/shmmni์ 8192 ์ฐ๊ธฐ
๊ทธ๋ค ์ค ๋๊ตฌ๋ ์๋ํ์ง ์์ต๋๋ค. ํด๊ฒฐ์ฑ ์ด ์๋์ง ๋ชจ๋ฅด์ญ๋๊น?
0์ผ๋ก ์ค์ ๋ num_workers๊ฐ ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค. ์ฌ์ฉํ๋ ๋ชจ๋ ๊ณณ์์ 0์ธ์ง ํ์ธํด์ผ ํฉ๋๋ค.
๋ค๋ฅธ ์ ์ฌ์ ์ธ ์๋ฃจ์ :
3~7๋ฒ ์ ๋ ๊ฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ pytorch 1.3, ubuntu16์์ ์ด ๋ฌธ์ ๋ฅผ ๊ฒฝํํ์ต๋๋ค. ์์ ๋ชจ๋ ์ ์์ ์คํ์ ๋๋ฆฌ๊ฒ ํ๋ ์์ ์=0์ ์ ์ธํ๊ณ ๋ ์๋ํ์ง ์์์ต๋๋ค. ์ด๊ฒ์ ํฐ๋ฏธ๋์์ ์คํํ ๋๋ง ๋ฐ์ํฉ๋๋ค. Jupyter ๋ ธํธ๋ถ ๋ด์์๋ ์์ ์๊ฐ 32์ธ ๊ฒฝ์ฐ์๋ ๋ชจ๋ ๊ฒ์ด ์ ์์ ๋๋ค.
๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค์ ์ด์ด์ผ ํฉ๋๊น? ๊ฐ์ ๋ฌธ์ ๋ฅผ ๋ณด๊ณ ํ์๋ ๋ถ๋ค๋ ๋ง์ด ๋ณด์ด๋ค์...
๋๋ ์ฌ์ ํ ์ด ๋ฌธ์ ๋ฅผ ๊ฒช๊ณ ์๋ค. pytorch 1.0 ๋ฐ python 3.7 ์ฌ์ฉ. ์ฌ๋ฌ data_loader๋ฅผ ์ฌ์ฉํ ๋ ์ด ๋ฒ๊ทธ๊ฐ ๋ํ๋ฉ๋๋ค. 3๊ฐ ๋ฏธ๋ง์ data_loader๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๋จ์ผ GPU๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ๋ฒ๊ทธ๊ฐ ๋ํ๋์ง ์์ต๋๋ค. ์ํ์ ๋ง์น:
- time.sleep(0.003)
- pin_memory=์ฐธ/๊ฑฐ์ง
- num_workers=0/1
- Torch.utils.data.dataloader์์ DataLoader ๊ฐ์ ธ์ค๊ธฐ
- /proc/sys/kernel/shmmni์ 8192 ์ฐ๊ธฐ
๊ทธ๋ค ์ค ๋๊ตฌ๋ ์๋ํ์ง ์์ต๋๋ค. ํด๊ฒฐ์ฑ ์ด ์๋์ง ๋ชจ๋ฅด์ญ๋๊น?0์ผ๋ก ์ค์ ๋ num_workers๊ฐ ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค. ์ฌ์ฉํ๋ ๋ชจ๋ ๊ณณ์์ 0์ธ์ง ํ์ธํด์ผ ํฉ๋๋ค.
๋ค๋ฅธ ์ ์ฌ์ ์ธ ์๋ฃจ์ :
- ๋ฉํฐํ๋ก์ธ์ฑ ๊ฐ์ ธ์ค๊ธฐ set_start_method์์
set_start_method('์คํฐ')- cv2.setNumThreads(0)
3~7๋ฒ ์ ๋ ๊ฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.
train.py
๊ณผ ๊ฐ์ด ์์ ํ์ต๋๋ค.
from __future__ import division
import cv2
cv2.setNumThreads(0)
import argparse
...
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋๋ฅผ ์ํด ์๋ํฉ๋๋ค.
์ฌ๋ฌ๋ถ, ์ ๊ฐ ๋์ธ ์ ์๋ค๋ฉด
๋๋ ๋ํ ์ด์ ์ ์ฌํ์ด ๋ฌธ์ ๊ฐ ์์์ง๋ง 100 ์ ๋๋ง๋ค ๋ฐ์ํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด CUDA๋ฅผ ํ์ฑํํ์ ๋๋ง ๋ฐ์ํ๋ค๋ ๊ฒ์ ์์์ฐจ๋ ธ๊ณ , ๋ํ dmesg๋ ์ถฉ๋ํ ๋๋ง๋ค ์ด ๋ก๊ทธ ํญ๋ชฉ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
python[11240]: segfault at 10 ip 00007fabdd6c37d8 sp 00007ffddcd64fd0 error 4 in libcudart.so.10.1.243[7fabdd699000+77000]
๊ทธ๊ฒ์ ๋์๊ฒ ํก์ค์์คํ์ง๋ง CUDA์ python ๋ฉํฐ์ค๋ ๋ฉ์ด ์ ๋๋ก ์๋ํ์ง ์๋๋ค๊ณ ๋งํ์ต๋๋ค.
๋ด ์์ ์ ๋ฐ์ดํฐ ์ค๋ ๋์์ cuda๋ฅผ ๋นํ์ฑํํ๋ ๊ฒ์ด ์์ต๋๋ค. ์ฌ๊ธฐ ๋ด ํ์ด์ฌ ํญ๋ชฉ ํ์ผ์ ์ค๋ํซ์ด ์์ต๋๋ค.
from multiprocessing import set_start_method
import os
if __name__ == "__main__":
set_start_method('spawn')
else:
os.environ["CUDA_VISIBLE_DEVICES"] = ""
import torch
import application
๋ฐ๋ผ๊ฑด๋ ๊ทธ๊ฒ์ ๋ด๊ฐ ๋น์ ํ์๋ก ํ๋ ๊ฒ์ฒ๋ผ ์ฌ๊ธฐ์ ์ฐฉ๋ฅํ๋ ๋๊ตฐ๊ฐ๋ฅผ ๋์ธ ์ ์์ต๋๋ค.
@jinhou @jackroos horovod ๋ก ์ ํจ์ฑ ๊ฒ์ฌ ์์ ์ ๋ฌด์์๋ก ๋ฉ์ท์ต๋๋ค. ํ์ฌ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก ์ํํ๋ ์์ ์ ์๊ฐ ์ด๊ณผ๋ฅผ ์ค์ ํ๊ณ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๊ฑด๋๋ฐ๋ ๊ฒ์ ๋๋ค. ํด๊ฒฐ์ฑ ์ด ์์ต๋๊น?
์๋์. ์ด ๊ฒฝ์ฐ ๋ถ์ฐ ๊ต์ก์ ๋๋๋ค.
PyTorch 1.4๋ก ์
๋ฐ์ดํธํ ํ OpenCV๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ถ์ฐ ๊ต์ก์์ ๋น์ทํ ๋ฌธ์ ๋ฅผ ๋ง๋ฌ์ต๋๋ค.
์ด์ ํ๋ จ ๋ฐ ๊ฒ์ฆ ๋ฃจํ ์ ์ ๊ฒ์ฆ์ ํ ๋ฒ ์คํํด์ผ ํฉ๋๋ค.
๋๋ ์ด๊ฒ ๋๋ฌธ์ ๋ง์ ์ด๋ ค์์ ๊ฒช์๋ค. pytorch ๋ฒ์ , python ๋ฒ์ ๋ฐ ๋ค๋ฅธ ๋ฌผ๋ฆฌ์ ์์คํ (๋์ผํ๊ฒ ์ค์ ๋์์ ์ ์์)์์ ์ง์๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋งค๋ฒ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
File "/home/<me>/miniconda2/envs/<my-module>/lib/python3.8/site-packages/bicep/loops.py", line 73, in __call__
for data, target in self.dataloader:
File "/home/<me>/miniconda2/envs/<my-module>/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 345, in __next__
data = self._next_data()
File "/home/<me>/miniconda2/envs/<my-module>/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 830, in _next_data
self._shutdown_workers()
File "/home/<me>/miniconda2/envs/<my-module>/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 942, in _shutdown_workers
w.join()
File "/home/<me>/miniconda2/envs/<my-module>/lib/python3.8/multiprocessing/process.py", line 149, in join
res = self._popen.wait(timeout)
File "/home/<me>/miniconda2/envs/<my-module>/lib/python3.8/multiprocessing/popen_fork.py", line 47, in wait
return self.poll(os.WNOHANG if timeout == 0.0 else 0)
File "/home/<me>/miniconda2/envs/<my-module>/lib/python3.8/multiprocessing/popen_fork.py", line 27, in poll
pid, sts = os.waitpid(self.pid, flag)
๋ด๊ฐ ์ฌ์ฉํ๋ ์ปดํจํฐ์์ ํ๋ก์ธ์ค๊ฐ ์ฒ๋ฆฌ๋๋ ๋ฐฉ์์ ๋ถ๋ช ํ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ์์ต๋๋ค. num_workers=0์ ์ค์ ํ๋ ๊ฒ ์ธ์๋ ์์ ์๋ฃจ์ ์ค ์ด๋ ๊ฒ๋ ์๋ํ์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ์ด๊ฒ์ ๋ฐ๋ฅ์ ๋๋ฌํ ์ ์๊ธฐ๋ฅผ ์ ๋ง๋ก ์ํฉ๋๋ค. ๋๊ตฌ๋ ์ง ์ด๊ฒ์ ์์ํ๊ฑฐ๋ ์ง๋ฌธํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ต๋๊น?
๋๋ ์ฌ๊ธฐ.
ERROR: Unexpected segmentation fault encountered in worker.
Traceback (most recent call last):
File "/home/miniconda/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 480, in _try_get_batch
data = self.data_queue.get(timeout=timeout)
File "/home/miniconda/lib/python3.6/multiprocessing/queues.py", line 104, in get
if not self._poll(timeout):
File "/home/miniconda/lib/python3.6/multiprocessing/connection.py", line 257, in poll
return self._poll(timeout)
File "/home/miniconda/lib/python3.6/multiprocessing/connection.py", line 414, in _poll
r = wait([self], timeout)
File "/home/miniconda/lib/python3.6/multiprocessing/connection.py", line 911, in wait
ready = selector.select(timeout)
File "/home/miniconda/lib/python3.6/selectors.py", line 376, in select
fd_event_list = self._poll.poll(timeout)
File "/home/miniconda/lib/python3.6/site-packages/torch/utils/data/_utils/signal_handling.py", line 65, in handler
_error_if_any_worker_fails()
RuntimeError: DataLoader worker (pid 95106) is killed by signal: Segmentation fault.
ํ ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ์ ์
๋ฐ์ดํฐ๋ฅผ ํ ์ค์ฉ ๊ตฌ๋ฌธ ๋ถ์ํ๋ฉด์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
with open(current_file, mode='rb') as f:
text = f.read().decode('utf-8')
all_data.extend(text.split('\n'))
ํ์ง๋ง ํ ์ค์ฉ ์ฝ์ ํ JSON ๊ตฌ๋ฌธ ๋ถ์ ๋ ผ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ฉด ์ด ์ค๋ฅ๊ฐ ๋ณด๊ณ ๋ฉ๋๋ค.
with open(current_file, mode='rb') as f:
text = f.read().decode('utf-8')
all_data.extend(text.split('\n'))
json_data = []
for line in all_data:
try:
json_data.append(json.loads(line))
except:
break
return json_data
์ฝ๊ฐ์ JSON ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋๊ฐ ์๋ค๋ ๊ฒ์ ์ดํดํ์ง๋ง ์์ ์ ์๋ฅผ 2๋ก ์ค์ด๊ณ ๋ฐ์ดํฐ ์ธํธ๊ฐ ๋งค์ฐ ์์๋ ์ฌ์ ํ ๋์ผํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ด shm๊ณผ ๊ด๋ จ์ด ์๋์ง ์์ฌํฉ๋๋ค. ์ด๋ค ๋จ์?
์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ด์ด ๋ณผ๊น์?
์ฐ๋ฆฌ๋ ๊ทธ๋์ผ๋ง ํด. BTW, ์ผ๋ถ GDB ๋๋ฒ๊ทธ๋ฅผ ์ํํ์ง๋ง ์๋ฌด ๊ฒ๋ ๋ฐ๊ฒฌ๋์ง ์์์ต๋๋ค. ๊ทธ๋์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ฌธ์ ์ธ์ง ํ์คํ์ง ์์ต๋๋ค.
(gdb) run
Starting program: /home/miniconda/bin/python performance.py
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[New Thread 0x7fffa60a6700 (LWP 61963)]
[New Thread 0x7fffa58a5700 (LWP 61964)]
[New Thread 0x7fffa10a4700 (LWP 61965)]
[New Thread 0x7fff9e8a3700 (LWP 61966)]
[New Thread 0x7fff9c0a2700 (LWP 61967)]
[New Thread 0x7fff998a1700 (LWP 61968)]
[New Thread 0x7fff970a0700 (LWP 61969)]
[New Thread 0x7fff9489f700 (LWP 61970)]
[New Thread 0x7fff9409e700 (LWP 61971)]
[New Thread 0x7fff8f89d700 (LWP 61972)]
[New Thread 0x7fff8d09c700 (LWP 61973)]
[New Thread 0x7fff8a89b700 (LWP 61974)]
[New Thread 0x7fff8809a700 (LWP 61975)]
[New Thread 0x7fff85899700 (LWP 61976)]
[New Thread 0x7fff83098700 (LWP 61977)]
[New Thread 0x7fff80897700 (LWP 61978)]
[New Thread 0x7fff7e096700 (LWP 61979)]
[New Thread 0x7fff7d895700 (LWP 61980)]
[New Thread 0x7fff7b094700 (LWP 61981)]
[New Thread 0x7fff78893700 (LWP 61982)]
[New Thread 0x7fff74092700 (LWP 61983)]
[New Thread 0x7fff71891700 (LWP 61984)]
[New Thread 0x7fff6f090700 (LWP 61985)]
[Thread 0x7fff7e096700 (LWP 61979) exited]
[Thread 0x7fff6f090700 (LWP 61985) exited]
[Thread 0x7fff74092700 (LWP 61983) exited]
[Thread 0x7fff7b094700 (LWP 61981) exited]
[Thread 0x7fff80897700 (LWP 61978) exited]
[Thread 0x7fff83098700 (LWP 61977) exited]
[Thread 0x7fff85899700 (LWP 61976) exited]
[Thread 0x7fff8809a700 (LWP 61975) exited]
[Thread 0x7fff8a89b700 (LWP 61974) exited]
[Thread 0x7fff8d09c700 (LWP 61973) exited]
[Thread 0x7fff8f89d700 (LWP 61972) exited]
[Thread 0x7fff9409e700 (LWP 61971) exited]
[Thread 0x7fff9489f700 (LWP 61970) exited]
[Thread 0x7fff970a0700 (LWP 61969) exited]
[Thread 0x7fff998a1700 (LWP 61968) exited]
[Thread 0x7fff9c0a2700 (LWP 61967) exited]
[Thread 0x7fff9e8a3700 (LWP 61966) exited]
[Thread 0x7fffa10a4700 (LWP 61965) exited]
[Thread 0x7fffa58a5700 (LWP 61964) exited]
[Thread 0x7fffa60a6700 (LWP 61963) exited]
[Thread 0x7fff71891700 (LWP 61984) exited]
[Thread 0x7fff78893700 (LWP 61982) exited]
[Thread 0x7fff7d895700 (LWP 61980) exited]
total_files = 5040. //customer comments
[New Thread 0x7fff6f090700 (LWP 62006)]
[New Thread 0x7fff71891700 (LWP 62007)]
[New Thread 0x7fff74092700 (LWP 62008)]
[New Thread 0x7fff78893700 (LWP 62009)]
ERROR: Unexpected segmentation fault encountered in worker.
ERROR: Unexpected segmentation fault encountered in worker.
Traceback (most recent call last):
File "/home/zhrui/.local/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 761, in _try_get_data
data = self._data_queue.get(timeout=timeout)
File "/home/miniconda/lib/python3.6/multiprocessing/queues.py", line 104, in get
if not self._poll(timeout):
File "/home/miniconda/lib/python3.6/multiprocessing/connection.py", line 257, in poll
return self._poll(timeout)
File "/home/miniconda/lib/python3.6/multiprocessing/connection.py", line 414, in _poll
r = wait([self], timeout)
File "/home/miniconda/lib/python3.6/multiprocessing/connection.py", line 911, in wait
ready = selector.select(timeout)
File "/home/miniconda/lib/python3.6/selectors.py", line 376, in select
fd_event_list = self._poll.poll(timeout)
File "/home/zhrui/.local/lib/python3.6/site-packages/torch/utils/data/_utils/signal_handling.py", line 66, in handler
_error_if_any_worker_fails()
RuntimeError: DataLoader worker (pid 62005) is killed by signal: Segmentation fault.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "performance.py", line 62, in <module>
main()
File "performance.py", line 48, in main
for i,batch in enumerate(rl_data_loader):
File "/home/zhrui/.local/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 345, in __next__
data = self._next_data()
File "/home/zhrui/.local/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 841, in _next_data
idx, data = self._get_data()
File "/home/zhrui/.local/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 808, in _get_data
success, data = self._try_get_data()
File "/home/zhrui/.local/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 774, in _try_get_data
raise RuntimeError('DataLoader worker (pid(s) {}) exited unexpectedly'.format(pids_str))
RuntimeError: DataLoader worker (pid(s) 62005) exited unexpectedly
[Thread 0x7fff78893700 (LWP 62009) exited]
[Thread 0x7fff74092700 (LWP 62008) exited]
[Thread 0x7fff71891700 (LWP 62007) exited]
[Thread 0x7fff6f090700 (LWP 62006) exited]
[Inferior 1 (process 61952) exited with code 01]
(gdb) backtrace
No stack.
๊ทธ๋ฆฌ๊ณ ์ถฉ๋ถํ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ์ด๋ segfault๊น์ง ๊ฝค ์ค๋ ์๊ฐ ๋์ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ถฉ๋ถํ ๊ฒ์ผ๋ก ์์ํ์ง๋ง ๋ฐ์ดํฐ ๋ก๋ ์์ ์ ์์ํ ์งํ์ ์ธ๊ทธ๋จผํธ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
------ Messages Limits --------
max queues system wide = 32000
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 18014398509465599
max total shared memory (kbytes) = 18014398509481980
min seg size (bytes) = 1
------ Semaphore Limits --------
max number of arrays = 32000
max semaphores per array = 32000
max semaphores system wide = 1024000000
max ops per semop call = 500
semaphore max value = 32767
์๋ ํ์ธ์ @soumith @apaszke , ์ด ๋ฌธ์ ๋ฅผ ๋ค์ ์ด ์ ์์ต๋๊น ? shm ํฌ๊ธฐ ๋ฐ ์ธ๊ทธ๋จผํธ๋ฅผ ๋๋ฆฌ๋ ๊ฒ๊ณผ ๊ฐ์ ์ ์๋ ๋ชจ๋ ์๋ฃจ์ ์ ์๋ํ์ง๋ง ์๋ฌด ๊ฒ๋ ์๋ํ์ง ์์ต๋๋ค. ์ ๋ opencv ์ ๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋จ์ํ JSON ๊ตฌ๋ฌธ ๋ถ์์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ ํ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฌ๋ ๊ฒ์ ํ์ธํ๊ธฐ ๋๋ฌธ์ shm๊ณผ ๊ด๋ จ์ด ์๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์คํ ์ถ์ ์ ๋ํ ์์ ๊ฒ์๋ ๊ฒ์ฒ๋ผ ์๋ฌด ๊ฒ๋ ํ์ํ์ง ์์ต๋๋ค.
@apaszke , ๊ทํ์ ์ ์์ ๋ํด
"์, ์ด๋ฌํ ๋ฌธ์ ์ ๋๋ถ๋ถ์ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํฌํฌ๋ก๋ถํฐ ์์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํฉ๋๋ค. ํ ๊ฐ์ง ๋์์ ์์ฑ ์์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ผ ์ ์์ต๋๋ค."
๋ฐ์ดํฐ ๋ก๋ ๋ค์ค ์์
์๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ฐฉ๋ฒ์ ๋ณ๊ฒฝํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? set_start_method('spawn')
๋ฅผ main.py์ ์ค์ ํ๊ณ ์์ง๋ง ๋์์ด ๋์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ํ ๋ค์ค ์์ ์(๋ค์ค ํ๋ก์ธ์ค) ๋ฐ์ดํฐ ๋ก๋๋ฅผ ํ์ฑํํ๊ณ ๊ธฐ๋ณธ ๊ต์ก์์ https://pytorch.org/docs/stable/notes/multiprocessing.html ์์ ์ ์ํ ๋๋ก ๋ค์ค ํ๋ก์ธ์ค๋ฅผ ์์ํ๋ ๊ฒฝ์ฐ ์ฌ๊ธฐ์ ์ผ๋ฐ์ ์ธ ์ง๋ฌธ์ด ์์ต๋๋ค.
pytorch๋ ๋ฐ์ดํฐ ๋ก๋์ ๊ธฐ๋ณธ ๊ต์ก ๋ค์ค ํ๋ก์ธ์ค๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํฉ๋๊น? ๋ฉํฐ ์ฝ์ด GPU์์ ๊ฐ๋ฅํ ๋ชจ๋ ํ๋ก์ธ์ค/์ค๋ ๋ฉ์ ๊ณต์ ํฉ๋๊น? ๋ํ ๋ค์ค ํ๋ก์ธ์ค๋ฅผ ์ํ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฐ์ดํฐ ๋ก๋์ ๋ฉ์ธ ํธ๋ ์ด๋ ํ๋ก์ธ์ค์ ์ํด "๊ณต์ "๋ฉ๋๊น? JSON ๊ตฌ๋ฌธ ๋ถ์, CSV ๊ตฌ๋ฌธ ๋ถ์, ํฌ๋ ๊ธฐ๋ฅ ์ถ์ถ๊ณผ ๊ฐ์ ์ผ๋ถ ๋ฐ์ดํฐ ์๋ฆฌ ์์
์ด ์๋ ๊ฒฝ์ฐ์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ๋ฑ, ์ด๋์ ๋ฃ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์๊ฐ? ๋ฐ์ดํฐ ๋ก๋์์ ๋ฐ์ดํฐ ๋ก๋ __get_item__
๋ฅผ ๊ฐ๋ฅํ ํ ๊ฐ๋จํ๊ฒ ์ ์งํ๊ธฐ ์ํด ์์์ ์ ์ํ ๋๋ก ๋ฐ์ดํฐ ๋ก๋์์ ์๋ฒฝํ๊ฒ ์ค๋น๋ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ฑฐ๋ ๊ธฐ๋ณธ ๊ต์ก์ ์ฌ์ฉํ์ฌ ๊ทธ๋ ๊ฒ ํ์ญ์์ค.
@zhangruiskyline ๊ทํ์ ๋ฌธ์ ๋ ์ค์ ๋ก ๊ต์ฐฉ ์ํ๊ฐ ์๋๋๋ค. ๊ทธ๊ฒ์ segfault์ ์ํด ๋ ธ๋์๋ค์ด ์ดํด๋นํ๋ ๊ฒ์ ๊ดํ ๊ฒ์ ๋๋ค. sigbus๋ shm ๋ฌธ์ ๋ฅผ ์ ์ํ๋ ๊ฒ์ ๋๋ค. ๋ฐ์ดํฐ์ธํธ ์ฝ๋๋ฅผ ํ์ธํ๊ณ ๊ฑฐ๊ธฐ์์ ๋๋ฒ๊ทธํด์ผ ํฉ๋๋ค.
๋ค๋ฅธ ์ง๋ฌธ์ ๋ตํ๋ ค๋ฉด
multiproessing_context='spawn'
๋ฅผ ์ฌ์ฉํ๋ฉด ์คํฐ์ด ์ค์ ๋ฉ๋๋ค. set_start_method
๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค.@SsnL ๊ฐ์ฌ multiproessing_context='spawn'
ํ์ง๋ง ๋์ผํ ์คํจ์
๋๋ค.
์ด์ ์ค๋ ๋์์ ์ง์ ํ์ง๋ง ๋ด ์ฝ๋๋ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
with open(current_file, mode='rb') as f:
text = f.read().decode('utf-8')
all_data.extend(text.split('\n'))
with open(current_file, mode='rb') as f:
text = f.read().decode('utf-8')
all_data.extend(text.split('\n'))
json_data = []
for line in all_data:
try:
json_data.append(json.loads(line))
except:
break
return json_data
๊ทธ๋์ ๋๋ ๊ทธ๊ฒ์ด ๋ด ์ฝ๋ ๋ฌธ์ ์ธ์ง ์์ฌ์ค๋ฝ๊ณ JSON ๊ตฌ๋ฌธ ๋ถ์์ ์ฌ์ฉํ์ง ์๊ณ ์ง์ ๋ฌธ์์ด ๋ถํ , ๋์ผํ ๋ฌธ์ ๋ฅผ ์๋ํฉ๋๋ค. ๋ฐ์ดํฐ ๋ก๋์์ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๋ ผ๋ฆฌ๊ฐ ์๋ ํ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ํ
๋ค์ค ํ๋ก์ธ์ค ๊ต์ก, ๊ฐ ํ๋ก์ธ์ค์๋ ๊ณ ์ ํ DataLoader๊ฐ ์์ผ๋ฏ๋ก DataLoader ์์ ์ ๋ช ์์ ์ผ๋ก ์ํ๋์ง ์๋ ํ ํ๋ก์ธ์ค ๊ฐ์ ๊ณต์ ๋์ง ์์ต๋๋ค.
๊ทธ๋ผ ๊ฐ๊ฐ 8๊ฐ์ ์์ ์ ๋ฐ์ดํฐ ๋ก๋๊ฐ ์๋ 4๊ฐ์ ๊ต์ก ํ๋ก์ธ์ค๊ฐ ์๋์ง ๋ณด๊ฒ ์ต๋๋ค. ์๋์ ์ด 32๊ฐ์ ํ๋ก์ธ์ค๊ฐ ์์ต๋๊น?
@zhangruiskyline ๋ฌธ์ ๋ฅผ ์ฌํํ๋ ์์ฒด ํฌํจ๋ ์คํฌ๋ฆฝํธ๊ฐ ์์ผ๋ฉด ์ฐ๋ฆฌ๋ ๋น์ ์ ๋์ธ ์ ์์ต๋๋ค. ์, 32๊ฐ์ ํ๋ก์ธ์ค๊ฐ ์์ ๊ฒ์ ๋๋ค.
๊ณ ๋ง์, ๋๋ ๋ํ ๋น์ทํ ๋ฌธ์ ๋ฅผ ๋ณด์๋ค
https://github.com/pytorch/pytorch/issues/4969
https://github.com/pytorch/pytorch/issues/5040
๋ ๋ค ๋ซํ์ง๋ง ๋ช ํํ ํด๊ฒฐ์ฑ ์ด๋ ์์ ์ฌํญ์ด ๋ณด์ด์ง ์์ต๋๋ค. ์ด๊ฒ์ด ์ฌ์ ํ ๊ด๋ฒ์ํ ๊ธฐ์กด ๋ฌธ์ ์ ๋๊น?
์์ฒด ํฌํจ๋ ์ฌ์์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์ ๊ณตํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ์ง๋ง ์ด ์คํฌ๋ฆฝํธ๋ ๋น์ฌ ํ๋ซํผ ๋ฐ ๋ฐ์ดํฐ ์์ค์ ๊ณ ๋๋ก ํตํฉ๋์ด ์์ผ๋ฏ๋ก ์๋ํ ๊ฒ์ ๋๋ค.
@zhangruiskyline ๋น์ ์ด ์ฝ์ ๋ฌธ์ ๋ ์ฐ๊ฒฐ๋ ๋ฌธ์ ์ ์ ์ฌํ์ง ์์ต๋๋ค. ํด๋น ์ค๋ ๋์ ๋ํด ๋ณด๊ณ ๋ ์๋/๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๊ฐ ์ด๋ฏธ ํด๊ฒฐ๋์๊ธฐ ๋๋ฌธ์ ๋ซํ๋๋ค.
@SsnL ๊ฐ์ฌ Pytorch ์ ์ต์ํ์ง ์์์ ํ๋ฆด ์ ์์ง๋ง, ๊ทธ ๋ชจ๋ ๊ฒ์ ์ดํด๋ณด์๊ณ , ๊ทธ ์ค ์ผ๋ถ๋ ๋ค์์ผ๋ก ํด๊ฒฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์์ ์ ์๋ฅผ 0์ผ๋ก ์ค์ด์ญ์์ค. ๋๋ฌด ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ํ์ฉ๋์ง ์์ต๋๋ค.
shm ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ์ง ๋ง ์ถฉ๋ถํ shm์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฌธ์ ๋ ์์ํ ์งํ์ ๊ฑฐ์ ๋ฐ์ํ์ผ๋ฉฐ ํจ์ฌ ์์ ๋ฐ์ดํฐ ์ธํธ๋ก ์๋ํ ๋ฌธ์ ๋ ๋์ผํฉ๋๋ค.
opencv์ ๊ฐ์ ์ผ๋ถ lib๋ ๋ค์ค ํ๋ก์ธ์ค์์ ์ ์๋ํ์ง ์์ต๋๋ค. ์ฐ๋ฆฌ๋ JSON/CSV๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก ์ค์ ๋ก ๋ฉ์ง ๊ฒ์ ์๋๋๋ค.
์ฐ๋ฆฌ์ ์ฝ๋๋ ๋งค์ฐ ๊ฐ๋จํ๊ณ ํ๋ จ ๋ฐ์ดํฐ ์ธํธ์๋ 10000๊ฐ ์ด์์ ํ์ผ์ด ์์ผ๋ฉฐ ๊ฐ ํ์ผ์ ์ฌ๋ฌ ์ค์ JSON ๋ฌธ์์ด์
๋๋ค. ๋ฐ์ดํฐ ๋ก๋์์ __get_item__
๋ฅผ ์ ์ํ์ฌ 10,000๊ฐ ์ด์์ ํ์ผ์์ ๊ฐ ํ์ผ์ ๊ฐ์ ธ์ค๊ณ ํด๋น ํ์ผ์ ๋ชจ๋ ์ฝํ
์ธ ๋ฅผ ์ฝ์ต๋๋ค.
์๋ฃจ์ 1์์ ๋จผ์ ํ๋ณ๋ก JSON ๋ฌธ์์ด ๋ชฉ๋ก์ ์ฝ๊ณ ๋ถํ ํฉ๋๋ค. ์ฆ์ ๋ฐํํ๋ฉด ์๋ํ๋ฉฐ ์ฑ๋ฅ์ด ์ข์ต๋๋ค.
with open(current_file, mode='rb') as f:
text = f.read().decode('utf-8')
all_data.extend(text.split('\n'))
return all_data
์ด์ ๋ฐํ๋ ๊ฐ์ด ์ฌ์ ํ JSON ๋ฌธ์์ด์ด๋ฏ๋ก ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ๋ค์ค ํ๋ก์ธ์ค ๋ฐ์ดํฐ ๋ก๋๋ฅผ ํ์ฉํ๋ ค๊ณ ํ๋ฏ๋ก ์ฌ๊ธฐ์ JSON ๊ตฌ๋ฌธ ๋ถ์ ๋ ผ๋ฆฌ๋ฅผ ๋ฃ์ผ๋ฉด ์คํจํฉ๋๋ค.
with open(current_file, mode='rb') as f:
text = f.read().decode('utf-8')
all_data.extend(text.split('\n'))
json_data = []
for line in all_data:
try:
json_data.append(json.loads(line))
except:
break
return json_data
์ฐ๋ฆฌ๋ ๋์ค์ JSON ๊ตฌ๋ฌธ ๋ถ์์ด ๋๋ฌด ๋ฌด๊ฒ๊ณ JSON์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ๋๋ฌด ๋ง๋ค๊ณ ์๊ฐํ ๋ค์ JSON ๋ฌธ์์ด์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์๋์ผ๋ก ๊ธฐ๋ฅ ๋ชฉ๋ก์ผ๋ก ๋ณํํ๊ธฐ๋ก ์ ํํ์ง๋ง ๋์ผํ ์คํจ์ ๋๋ค. ์ผ๋ถ ์คํ ์ถ์ ๋ถ์์ ์ํํ์ง๋ง ๊ฑฐ๊ธฐ์๋ ์๋ฌด๊ฒ๋ ์์์ต๋๋ค.
BTW, ์ฐ๋ฆฌ๋ Linux Docker Env, 24์ฝ์ด CPU ๋ฐ 1 V100์์ ์ฝ๋๋ฅผ ์คํํ๊ณ ์์ต๋๋ค.
๋ค์์๋ ์ด๋์์ ์กฐ์ฌ๋ฅผ ์์ํด์ผ ํ ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋น์ ์ ์ด๋ค ์๊ฐ์ด ์์ต๋๊น?
์๋ ,
https://github.com/open-mmlab/mmdetection ์์ ์ฌ์ฉ๋๋ https://github.com/open-mmlab/mmcv ์์ ํฅ๋ฏธ๋ก์ด ์๊ฒฌ์ ์ฐพ์์ต๋๋ค.
๋ค์ ์ฝ๋๋ train epoch์ val epoch์ ์์ ๋ถ๋ถ์ ์ฌ์ฉ๋ฉ๋๋ค.
time.sleep(2) # Epoch ์ ํ ๋์ ๊ฐ๋ฅํ ๊ต์ฐฉ ์ํ ๋ฐฉ์ง
๋น์ ์ด ๊ทธ๊ฒ์ ์๋ ํ ์ ์์ต๋๋ค.
BTW, ๋ค์ค ์์
์ ๋ฐ์ดํฐ ๋ก๋๊ฐ ์๋ ๊ฐ ํ๋ก์ธ์ค ๋ฐ ๋ค์ค ํ๋ก์ธ์ค๋ก ์ด๋ํ๋ฉด ํด๋น ๋ฐ์ดํฐ ๋ก๋๊ฐ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๋ฐ์ดํฐ ๋ก๋์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ง ์๋๋ก ํ๋ ํ๋ก์ธ์ค๊ฐ ์ด๋ป๊ฒ ๋ค๋ฅธ๊ฐ์? ti๋ ์ด๋ฏธ pytorch ๋ฐ์ดํฐ ๋ก๋ __get_item__
์ํด ์ฒ๋ฆฌ๋ฉ๋๊น?
์๋ ํ์ธ์ @SsnL , ๋์์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ์ด ์ค๋ ๋์ ๋ํ ํ์ ์กฐ์น๋ฅผ ์ทจํ๊ณ ์ถ์ต๋๋ค. pytorch ๋ค์ค ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ต์ก ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋งํ์ฌ CPU ์ธก์์ ์ผ๋ถ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋๋ฅผ ๋์ ๋๋ค(GPU์ ๋ ๋นจ๋ฆฌ ๊ณต๊ธํ๊ธฐ ์ํด), https://pytorch.org/docs/stable /notes/multiprocessing.html#multiprocessing -๋ชจ๋ฒ ์ฌ๋ก
๋ํ ๊ฐ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์์ ๋ค์ค ์์ ์ ๋ฐ์ดํฐ ๋ก๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ก๋ฉ ์ฒ๋ฆฌ ์๊ฐ์ ๋จ์ถํฉ๋๋ค. https://pytorch.org/docs/stable/data.html
๋๋ ๋ฐ์ดํฐ ๋ก๋๊ฐ ์๋ ๋ฉ์ธ ํธ๋ ์ด๋ ๊ณผ์ ์์ ๋ด heaving CPU JSON ๊ตฌ๋ฌธ ๋ถ์์ ๋ฃ์๊ณ ๋ฌธ์ ๊ฐ ์ฌ๋ผ์ง ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ์ด์ ๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ด์จ๋ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์ ์ง๋ฌธ์ด ์์ต๋๋ค. N
์ฒ๋ฆฌ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๊ณ ๊ฐ๊ฐ์๋ M
๋ก๋ ์์
์๊ฐ ์์ผ๋ฏ๋ก ์ค๋ ๋ฉ ์๋์ ์ด NxM
๊ฐ ์์ต๋๋ค.
๋ด ๋ฐ์ดํฐ ๋ก๋์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ฑ์ค ๋ฐฉ์์ผ๋ก ๊ฐ์ ธ์ค๋ ค๋ฉด N๊ฐ์ ๋ค๋ฅธ ์ฒ๋ฆฌ์์ M ๋ฐ์ดํฐ ๋ก๋์์ __get_item__(self, idx)
๊ฐ ๋ค๋ฅธ ์ธ๋ฑ์ค๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํจ๊ป ์๋ํ ์ ์์ต๋๋ค. ์ค๋ณต ๋๋ ์ผ๋ถ ํ๋ก์ธ์ค๋ฅผ ๊ทธ๋ฆฌ์?
์๋ก์ด ํ๋ จ ๋๋ ๊ฒ์ฆ ์ํฌํฌ์ ์์ ๋ถ๋ถ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ ์ ์๋ค๊ณ ๋ถํํ ํ ๋ฐ์ดํฐ ๋ก๋๊ฐ ์ถฉ๋ํ๋ ๋์ผํ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์์ ์๋ฃจ์ ์ (i)
/dev/shm
๊ฐ 32GB์ด๊ณ 2.5GB ์ด์ ์ฌ์ฉ๋ ์ ์ด ์์ผ๋ฉฐ (ii) pin_memory=False ์ค์ ์ด ์๋ํ์ง ์์์ต๋๋ค.์ด๊ฒ์ ์๋ง๋ ๊ฐ๋น์ง ์์ง๊ณผ ๊ด๋ จ์ด ์์ต๋๊น? ๋ด ์ฝ๋๋ ๋๋ต ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๋ฌดํ ๋ฐ๋ณต์๊ฐ ํ์ํ๋ฏ๋ก ์๋
next()
์ฃผ์๋ฅผ ์ ์ธํ๊ณ ์๋ํฉ๋๋ค :-)def train(): train_iter = train_loader.__iter__() for i in xrange(max_batches): try: x, y = next(train_iter) except StopIteration: train_iter = train_loader.__iter__() ... del train_iter
train_loader
๋DataLoader
๊ฐ์ฒด์ ๋๋ค. ํจ์ ๋์ ๋ช ์์ ์ธdel train_iter
์ค์ด ์์ผ๋ฉด ํ๋ก์ธ์ค๋ ํญ์ 2-3 ์ํฌํฌ ํ์ ์ถฉ๋ํฉ๋๋ค(/dev/shm
์ฌ์ ํ 2.5GB๋ฅผ ํ์ํจ). ๋์์ด ๋์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
4
์์ ์(Ubuntu 16.04์ CUDA 8.0 ๋ฒ์ 0.1.12_2
)๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์ด๊ฒ์ ๋ช ์ฃผ ๋์ ๊ณ ๊ตฐ๋ถํฌ ํ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค. ๋ก๋๋ฅผ ์ง์ ๋ฐ๋ณตํ๋ ๋์ ๋ก๋ ๋ฐ๋ณต์๋ฅผ ๋ช
์์ ์ผ๋ก ์ฌ์ฉํด์ผ ํ๋ฉฐ ์ํฌํฌ๊ฐ ๋๋ ๋ del loader_iterator
๋ฅผ ์ฌ์ฉํ์ฌ ๋ง์นจ๋ด ๊ต์ฐฉ ์ํ๋ฅผ ์ ๊ฑฐํ์ต๋๋ค.
๋๋ ๊ฐ์ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. 8๊ฐ์ ๋ฐ์ดํฐ ๋ก๋(MNIST, MNISTM, SVHN, USPS, ๊ฐ๊ฐ ํ์ต ๋ฐ ํ ์คํธ์ฉ)๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค. 6(๋ชจ๋ 6)์ ์ฌ์ฉํ๋ฉด ์ ์๋ํฉ๋๋ค. 8์ ์ฌ์ฉํ๋ฉด 6๋ฒ์งธ MNIST-M ํ ์คํธ๋ฅผ ๋ก๋ํ ๋ ํญ์ ์ฐจ๋จ๋ฉ๋๋ค. ์ด๋ฏธ์ง ๊ฒ์์ ์๋ํ๊ณ , ์คํจํ๊ณ , ์กฐ๊ธ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค์ ์๋ํ๋ ๋์๋ ๋ฃจํ์ ๊ฐํ ์์ต๋๋ค. ๋ชจ๋ batch_size์ ๋ํด ์ค๋ฅ๊ฐ ์ง์๋๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ง์ด ๋จ์ ์์ผ๋ฉฐ num_workers๋ฅผ 0์ผ๋ก ์ค์ ํ ๊ฒฝ์ฐ์๋ง ์ฌ๋ผ์ง๋๋ค. ๋ค๋ฅธ ์์ด ๋ฌธ์ ์ ์์ธ์ ๋๋ค.
https://stackoverflow.com/questions/54013846/pytorch-dataloader-stucked-if-using-opencv-resize-method ์์ ํํธ๋ฅผ ์ป์์ต๋๋ค.
cv2.setNumThreads(0)
๋ฃ์ผ๋ฉด ์ ์๋ํฉ๋๋ค.
์๋ ํ์ธ์, ๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ulimit -n๊ณผ ๊ด๋ จ์ด ์์๊ณ ๋จ์ํ ๋๋ฆฌ๋ฉด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์์ต๋๋ค. ๋๋ ulimit -n 500000์ ์ฌ์ฉํ์ต๋๋ค.
@SebastienEske ulimit -n Ubuntu 20.04์์๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ต๋๋ค.
์๋ง๋ set ulimit -n ์ด ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ผ ๊ฒ์
๋๋ค. ๋ชจ๋ธ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๊ต์ฐฉ ์ํ๊ฐ ์ ์ ๋ ์์ฃผ ๋ฐ์ํ๊ณ cv2.setNumThreads(0)
ํ
์คํธ๋ ์ํํ์ง๋ง ์๋ํ์ง ์์ต๋๋ค.
๊ธฐ๋ก์ ์ํด cv2.setNumThreads(0)
๊ฐ ์ ์๊ฒ ํจ๊ณผ์ ์ด์์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋น์ทํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ํ ์ํฌํฌ๋ฅผ ๋ง์น๋ฉด ๋ฐ์ดํฐ ๋ก๋๊ฐ ์ค์ง๋๊ณ ์ ์ํฌํฌ๊ฐ ์์๋ฉ๋๋ค.