Pytorch: デヌタロヌダヌでデッドロックが発生する可胜性

䜜成日 2017幎04月25日  Â·  189コメント  Â·  ゜ヌス: pytorch/pytorch

バグはpytorch / examples148で説明されおいたす。 サンプルコヌドは私にはきれいに芋えるので、これはPyTorch自䜓のバグかどうか疑問に思いたす。 たた、これは1120に関連しおいるのだろうか。

最も参考になるコメント

同様の問題が発生したした。゚ポックを終了するずデヌタロヌダヌが停止し、新しい゚ポックを開始したす。

党おのコメント189件

ロヌダヌが停止したずきに、どのくらいの空きメモリがありたすか

@apaszke topをチェックするず、残りのメモリキャッシュされたメモリも䜿甚枈みずしおカりントされたすは通垞2GBです。 ただし、キャッシュされたものを䜿甚枈みずしおカりントしない堎合は、垞に倚く、たずえば30GB以䞊になりたす。

たた、怜蚌の開始時に垞に停止する理由はわかりたせんが、それ以倖の堎所では停止したせん。

おそらく、怜蚌のために、共有メモリの䜿甚を制限を超えおプッシュする別のロヌダヌが䜿甚されおいるためです。

@ngimel

プログラムをもう䞀床実行したした。 そしお行き詰たりたした。

top出力

~~~
トップ-1751182日間、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キャッシュされたMem

PIDナヌザヌPRNI VIRT RES SHR SCPUMEM TIME + COMMAND 3067 aalreja 20 0 143332 101816 21300 R 46.1 0.2 163144 Xvnc
16613 aalreja 30 10 32836 4880 3912 S 16.9 0.0 106.92ファむバヌランプ3221 aalreja 20 0 8882348 1.017g 110120 S 1.3 1.6 57906.87 MATLAB
1285ルヌト200 1404848 48252 25580 S 0.3 0.1 600.12 dockerd 16597 yimengz + 20 0 25084 3252 2572 R 0.3 0.0 004.56 top
1ルヌト200 33616 4008 2624 S 0.0 0.0 001.43 init
~~~

free出力

〜yimengzh_everyday @ yimengzh 〜$無料キャッシュされた䜿甚枈み空き共有バッファの合蚈Mem65863816 60122060 5741756 9954628 1372688 51154916-/ +バッファ/キャッシュ7594465 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 | Bus-Id Disp.A | 揮発性のUncorr。 ECC |
| Fan Temp Perf PwrUsage / Cap | メモリ-䜿甚法| GPU-Util Compute M. |
| =============================== + ================= ===== + ====================== |
| 0 GeForce GTX TIT ...オフ| 00000300.0オフ| 該圓なし|
| 3042C P8 14W / 250W | 3986MiB / 6082MiB | 0デフォルト|
+ ------------------------------- + ----------------- ----- + ---------------------- +
| 1テスラK40cオフ| 00008100.0オフ| オフ|
| 046C P0 57W / 235W | 0MiB / 12205MiB | 0デフォルト|
+ ------------------------------- + ----------------- ----- + ---------------------- +

+ ------------------------------------------------- ---------------------------- +
| プロセスGPUメモリ|
| GPUPIDタむププロセス名䜿甚法|
| ================================================= ============================ |
| 0 16509 C python 3970MiB |
+ ------------------------------------------------- ---------------------------- +
~~~

蚘憶の問題ではないず思いたす。

共有メモリには個別の制限がありたす。 ipcs -lmたたはcat /proc/sys/kernel/shmallずcat /proc/sys/kernel/shmmaxを詊すこずができたすか たた、䜿甚するワヌカヌが少ない堎合たずえば、1人のワヌカヌの極端なケヌスでテストする堎合、デッドロックが発生したすか

@apaszke

~~~
yimengzh_everyday @ yimengzh 〜$ ipcs -lm

------共有メモリの制限--------
セグメントの最倧数= 4096
最倧セグメントサむズキロバむト= 18014398509465599
最倧合蚈共有メモリキロバむト= 18446744073642442748
最小セグメントサむズバむト= 1

yimengzh_everyday @ yimengzh 〜$ cat / proc / sys / kernel / shmall
18446744073692774399
yimengzh_everyday @ yimengzh 〜$ cat / proc / sys / kernel / shmmax
18446744073692774399
~~~

圌らはどのようにあなたを探したすか

劎働者の数が少ないずいうこずに関しおは、それほど頻繁には起こらないず思いたす。 私は今詊すこずができたす。 しかし、実際には、その倚くの劎働者が必芁だず思いたす。

最倧4096の共有メモリセグメントが蚱可されおいたす。これが問題である可胜性がありたす。 /proc/sys/kernel/shmmni曞き蟌むこずで、それを増やすこずができたすおそらく8192を詊しおください。 スヌパヌナヌザヌ暩限が必芁な堎合がありたす。

@apaszkeたあこれらはUbuntuず

トレヌニングプログラムを実行しおいるずきの@apaszke 、 ipcs -a実際には共有メモリが䜿甚されおいないこずを瀺しおいたす。 それは期埅されおいたすか

@apaszkeは、

~~~
yimengzh_everyday @ yimengzh 〜$ ipcs -lm

------共有メモリの制限--------
セグメントの最倧数= 8192
最倧セグメントサむズキロバむト= 18014398509465599
最倧合蚈共有メモリキロバむト= 18446744073642442748
最小セグメントサむズバむト= 1
~~~

1人の劎働者を詊したせんでした。 たず、それは遅いでしょう。 第二に、問題が本圓にデッドロックである堎合、それは間違いなく消えたす。

@ zym1010のデフォルト蚭定は、そのようなワヌクロヌドを念頭に眮いお䜜成する必芁はないので、そうです、それは問題であった可胜性がありたす。 ipcsは、䜿甚しおいないSystem V共有メモリ甚ですが、同じ制限がPOSIX共有メモリに適甚されないようにしたかったのです。

問題が実際に存圚する堎合は、ワヌカヌずメむンプロセスの間でデッドロックが発生しおいる可胜性があり、1人のワヌカヌでこれをトリガヌできる可胜性があるため、確実に消えるこずはありたせん。 ずにかく、私はそれを再珟するこずができるたで問題を修正するこずはできたせん。 䟋を実行するために䜿甚しおいるパラメヌタヌは䜕ですかたた、コヌドを䜕らかの方法で倉曎したしたか たた、 torch.__version__の倀は䜕ですか Dockerで実行しおいたすか

@apaszkeありがずう。 私はあなたの分析を今よりよく理解しおいたす。

64GB RAM、デュアルXeon、TitanBlackを搭茉したUbuntu14.04マシンで実行されるたでに瀺された他のすべおの結果K40もありたすが、私は䜿甚したせんでした。

問題を生成するコマンドは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です。 コヌドはたったく倉曎したせんでした。

Python3.5にpipを介しおpytorchをむンストヌルしたした。 pytorchのバヌゞョンは0.1.11_5です。 Dockerで実行されおいたせん。

ずころで、私も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、ゟンビ1CPU7.2us、2.8sy、0.0ni、89.7id、0.3wa、0.0hi、0.0si、0.0stMem合蚈132196824k、䜿甚枈み131461528k、空き735296k、バッファヌ347448kスワップ合蚈2047996k、䜿甚22656k、無料2025340k、キャッシュ125226796k〜

私が芋぀けたもう1぀のこずは、トレヌニングコヌドを倉曎しお、すべおのバッチを通過しないようにした堎合、たずえば、50バッチのみをトレヌニングするこずです。

if i >= 50:
    break

その埌、デッドロックは解消されたようです。

さらなるテストは、コンピュヌタを再起動した盎埌にプログラムを実行した堎合、このフリヌズがはるかに頻繁に発生するこずを瀺唆しおいるようです。 コンピュヌタにキャッシュがあった埌、このフリヌズが発生する頻床は少ないようです。

詊したしたが、このバグを再珟するこずはできたせん。

同様の問題が発生したした。゚ポックを終了するずデヌタロヌダヌが停止し、新しい゚ポックを開始したす。

num_workers = 0に蚭定するず機胜したす。 しかし、プログラムは遅くなりたす。

@apaszke最初にコンピュヌタヌを再起動しおから、プログラムを実行しおみたしたか 私にずっお、これは凍結を保蚌したす。 0.12バヌゞョンを詊したしたが、それでも同じです。

私が指摘したいのは、OpenBLASにリンクされたnumpyがむンストヌルされおいお、 @ soumithのanacondaクラりドのMKLがpipを䜿甚しおpytorchをむンストヌルしたこずです。

぀たり、基本的にpytorchはMKLを䜿甚し、numpyはOpenBLASを䜿甚しおいたす。 これは理想的ではないかもしれたせんが、これはここでの問題ずは䜕の関係もないはずだず思いたす。

調べおみたしたが、再珟できたせんでした。 MKL / OpenBLASはこの問題ずは無関係である必芁がありたす。システム構成に問題がある可胜性がありたす

@apaszkeありがずう。 anacondaの公匏リポゞトリずMKLベヌスのpytorchからPythonを詊したした。 それでも同じ問題。

Dockerでコヌドを実行しおみたした。 ただ立ち埀生。

同じ問題があり、4぀のうち1぀のGPUを䜿甚しおnvidia-docker内でpytorch / examples imagenetトレヌニングの䟋resnet18、4人のワヌカヌを実行したす。プロセスに到達できたら、gdbバックトレヌスを収集しようずしたす。 。

少なくずもOpenBLASには、行列の乗算でデッドロックの問題があるこずが知られおいたすが、これは比范的たれにしか発生したせん https 

@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

ただ残っおいる1぀のワヌカヌの堎合、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を䜿甚するず、最初の゚ポックトレむンを取埗しお完党に怜蚌できる堎合があり、2番目の゚ポックの途䞭でロックされたす。 したがっお、デヌタセット/読み蟌み関数で問題が発生する可胜性はほずんどありたせん。

これは、特定のハヌドりェア/゜フトりェアの組み合わせによっお比范的たれにトリガヌされる可胜性のあるImageLoaderの競合状態のように芋えたす。

@ zym1010ポむンタヌをありがずう、 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以前にこれを再珟しようずしたずき、2぀のむンスタンスを䞊べお実行したり、システムに他の重芁な負荷をかけたりしお実行しようずしたしたか

@jsainioこれを調査しおくれおありがずう これは奇劙なこずです。ワヌカヌは䞀緒に終了する必芁があり、メむンプロセスが完了したらデヌタの読み取りを行いたす。 なぜそれらが時期尚早に終了するのかを調べおみるこずができたすか たぶんカヌネルログ dmesg をチェックしたすか

いいえ、詊したこずはありたせんが、IIRCではない堎合でも衚瀺されおいるようです。

@apaszkeわかりたした、劎働者が退出するべきではなかったこずを知っおおくずよいでしょう。

詊したしたが、なぜ終了するのかを確認する良い方法がわかりたせん。 dmesgは、関連するものは䜕も衚瀺されたせん。 私は、Anacondaパッケヌゞを䜿甚しおUbuntu 16.04から掟生したDockerで実行しおいたす

1぀の方法は、ワヌカヌルヌプ内に倚数の印刷を远加するこずです。 なぜ圌らが黙っお出るのか私には分かりたせん。 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

その䜿甚法はかなり難しいようです。 これは、2人のゟンビワヌカヌがいる枯湟劎働者です。

shmのサむズを倧きくしおみおください。 確認したずころ、問題を再珟しようずしたサヌバヌでは16GBでした。 Dockerフラグを倉曎するか、実行したす

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がある堎合はよくありたす。

これに぀いおの蚀及を芋぀けるのは難しいですが、ここに1぀ありたす。

この問題に぀いおお時間をいただきありがずうございたす、それは長い間私を狂わせおきたした 正しく理解できれば、 /dev/shmを8Gではなく16Gに拡匵する必芁がありたす。 それは意味がありたすが、 df -hを詊しおみるず、すべおのRAMが実際にそのように割り圓おられおいるこずがわかりたす:(私は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パヌティションがある堎合、最倧32Gのtmpfsをマりントできるので、 /dev/shmを拡匵するこずは問題ありたせんよね

さらに重芁なこずに、RAMの半分近くを占めるため、cgroupパヌティションずその目的に戞惑っおいたす。 どうやらそれは効率的にマルチプロセッサタスクを管理するように蚭蚈されおいたすが、私はそれが䜕をするのか、そしおなぜそれが必芁なのかよくわかりたせん、それはすべおの物理RAMをshmに割り圓おるために䜕かを倉曎したすかサむズを16Gに蚭定したためそしおそれをSWAPに入れたすただし、䞡方が郚分的にRAMずSWAPに同時に含たれるず思いたす

@apaszkeありがずう 根本的な原因を芋぀けたのは玠晎らしいこずです。 マシンに他にどのような負荷がかかっおいるかに応じお、さたざたな「ConnectionReset」゚ラヌずdocker --shm-size=1024mデッドロックの䞡方が発生するこずがありたした。 --shm-size=16384mず4人のワヌカヌで今すぐテストしたす。

@jsainioConnectionResetは同じこずが原因である可胜性がありたす。 プロセスは䞀郚のデヌタの亀換を開始したしたが、shmがスペヌスを䜿い果たすず、SIGBUSがワヌカヌに送信され、匷制終了されたした。

@ClementPinardは、RAMが䞍足するずマシンがフリヌズする可胜性があるこずを陀いお、必芁なだけ倧きくするこずができたすカヌネルでさえこのメモリを解攟できないため。 おそらく/sys/fs/cgroupに぀いお気にする必芁はありたせん。 tmpfsパヌティションはメモリを遅延的に割り圓おたす。䜿甚量が0Bのたたである限り、コストはかかりたせん制限を含む。 スワップを䜿甚するずデヌタの読み蟌みが非垞に遅くなるため、スワップを䜿甚するのは良い考えではないず思いたす。そのため、 shmサむズを12GBに増やし、ワヌカヌの数を制限しおみおください私が蚀ったように、すべおのRAMをshmに䜿甚しないでください。 これは、カヌネルのドキュメントからの

/dev/shm䜿甚量が非垞に少ない堎合でもデッドロックが発生する理由はわかりたせん私のマシンでは20kBで発生したす。 おそらく、カヌネルは過床に楜芳的ですが、すべおが満たされるたで埅機せず、この領域から䜕かを䜿甚し始めるずプロセスを匷制終了したす。

今12Gず私が持っおいた半分の劎働者でテストしたした、そしおそれは倱敗したした:(
それはluaトヌチバヌゞョン同じ速床、同じ数のワヌカヌの魅力のように機胜しおいたした。これは、問題が/dev/shm関連しおいお、Pythonマルチプロセッシングに近くないのではないかず思いたす...

あなたが蚀ったようにそれに぀いおの奇劙なこずは、 /dev/shmが満杯に近づくこずは決しおないずいうこずです。 最初のトレヌニング゚ポックでは、500Moを超えるこずはありたせんでした。 たた、最初の゚ポックでロックされるこずはなく、テストをシャットダりンしおも、trainloaderがすべおの゚ポックで倱敗するこずはありたせん。 デッドロックは、テスト゚ポックを開始したずきにのみ衚瀺されるようです。 電車からテストに行くずきは/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.5 GBを瀺したす。 お圹に立おれば

私は4ワヌカヌを䜿甚しおいたすUbuntu16.04のCUDA8.0でバヌゞョン0.1.12_2 。

たた、特にwork_numberが倧きい堎合、デッドロックに遭遇したした。 この問題の可胜な解決策はありたすか 私の/ dev / shmサむズは32GBで、cuda 7.5、pytorch 0.1.12、python2.7.13です。 以䞋は死亡埌の関連情報です。 それは蚘憶に関係しおいるようです。 @apaszke

default
image

@zhengyunqqをTrue蚭定した堎合は、 pin_memory=False詊しおください。 そうでなければ、私は解決策を知りたせん。

num_workersが倧きいずきにもデッドロックに遭遇したした。

私にずっおの問題は、䜕らかの理由でワヌカヌスレッドが停止した堎合、 index_queue.putが氞久にハングするこずでした。 動䜜䞭のスレッドが停止する理由の1぀は、初期化䞭にアンピッカヌが倱敗するこずです。 その堎合、2017幎5月にマスタヌでこのPythonのバグ修正が行われるたで、ワヌカヌスレッドが停止し、無限のハングが発生しおいたした。 私の堎合、ハングはバッチプリフェッチプラむミング段階で発生しおいたした。

たぶん、 SimpleQueue䜿甚されおいるDataLoaderIterをQueue眮き換えるず、適切な䟋倖メッセヌゞでタむムアりトが可胜になりたす。

UPD私は間違っおいたした、このバグ修正はSimpleQueueではなくQueueにパッチを圓おたす。 オンラむンのワヌカヌスレッドがない堎合、 SimpleQueueがロックされるのは事実です。 これらの行をself.workers = []眮き換えるこずを確認する簡単な方法です。

私は同じ問題を抱えおいたす、そしお私は蚱可なしにshmを倉曎するこずはできたせん、倚分キュヌか䜕か他のものを䜿うほうが良いですか

同様の問題がありたす。
このコヌドはフリヌズし、䜕も出力したせん。 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

Docker内の1人のワヌカヌでデッドロックが発生するずいう同様の問題があり、私の堎合は共有メモリの問題であるこずが確認できたす。 デフォルトでは、dockerは64MBの共有メモリしか割り圓おおいないようですが、1人のワヌカヌに440MBが必芁でした。これにより、@ apaszkeで説明されおいる動䜜が発生した可胜性がありたす。

私は同じ問題に悩たされおいたすが、このスレッドの他のほずんどの環境ずは異なる環境にいるので、私の入力が根本的な原因を特定するのに圹立぀可胜性がありたす。 私のpytorchは、Windows10でpeterjc123によっお構築された優れたcondaパッケヌゞを䜿甚しおむンストヌルされたす。

cifar10デヌタセットでcnnを実行しおいたす。 デヌタロヌダヌの堎合、num_workersは1に蚭定されたす。num_workersが0より倧きいず、BrokenPipeErrorが発生するこずがわかっおおり、494でアドバむスされおいたすが、私が経隓しおいるのはBrokenPipeErrorではなく、メモリ割り圓お゚ラヌです。 ゚ラヌは垞に、最埌の゚ポックの怜蚌盎埌で、次の゚ポックのトレヌニングの開始前の玄50゚ポックで発生したした。 90の確率で正確に50゚ポックですが、それ以倖の堎合は1たたは2゚ポックずれたす。 それ以倖はすべおかなり䞀貫しおいたす。 num_workers = 0に蚭定するず、この問題が解消されたす。

@paulguerreroは正しいです。 共有メモリを64Mから2Gに増やすこずで、この問題を解決したした。 Dockerナヌザヌにずっおは䟿利かもしれたせん。

@berzjacksonこれはcondaパッケヌゞの既知のバグです。 最新のCIビルドで修正されたした。

月曜日にPytorchを䜿甚する新しいコヌスを開始した人は玄600人です。 私たちのフォヌラムの倚くの人々がこの問題を報告しおいたす。 䞀郚はAWSP2にあり、䞀郚は独自のシステム䞻に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のクラスにい1回だけ発生したす。

぀たり、デヌタが読み蟌たれ、フィッティングが1回実行されるず、移動しお手順を繰り返し続けるこずができたす... 4 num_workersを䜿甚しおも、GPUではすべおが期埅どおりに高速に動䜜するようです。

私はPyTorch0.2.0_4、Python 3.6.2、Torchvision 0.1.9、Ubuntu 16.04LTSを䜿甚しおいたす。 タヌミナルで「df-h」を実行するず、䜿甚率は非垞に䜎いものの、/ dev / shmに16GBあるこずがわかりたす。

これは、ロヌドが倱敗した堎所のスクリヌンショットですデヌタにnum_workers = 0を䜿甚したこずに泚意しおください
小さな文字に぀いおは申し蚳ありたせん。すべおをキャプチャするにはズヌムアりトする必芁がありたした...

screenshot 2017-11-01 13 55 46

@apiltamangそれが同じ問題かどうかは

このできるだけ早く調べおください

私はもちろんのプラむベヌトフォヌラムぞのアクセス@apaszke䞎えおくれたず私は圌らのボックスに私達のログむンぞのアクセス暩を䞎える問題を孊生に求めおきたした@soumith。

@ jph00こんにちはゞェレミヌ、孊生のいずれかが@apaszkeは前述したようにSHMを増やしおみたのですか 圹に立ちたしたか

@SsnLの孊生の䞀人は、共有メモリを増やしたが、ただ問題があるこずを確認したした。 他の人にも確認しおもらいたした。

@ jph00ありがずう 共有メモリが少ないため、ハングを正垞に再珟できたした。 問題が他の堎所にある堎合は、さらに深く掘り䞋げる必芁がありたす。 スクリプトを私ず共有しおもよろしいですか

確かに-これが私たちが䜿甚しおいるノヌトブックです https 

耇補できる共有メモリの問題に基づいお、ラむブラリたたはノヌトブックに远加しお回避できる回避策はありたすか

@ jph00今すぐコヌドに飛び蟌みたす。 共有メモリの䜿甚量を枛らす方法を芋぀けようずしたす。 スクリプトで倧量のshmを䜿甚する必芁はないようですので、垌望がありたす。

たた、PRを送信しお、shm制限に達したずきに、単にハングさせるのではなく、適切な゚ラヌメッセヌゞを衚瀺したす。

OK最新のPytorchcondaむンストヌルを備えたCUDA9 AMIを䜿甚しお、新しいAWSP2むンスタンスで問題を再珟したした。 公開鍵を提䟛しおいただければ、盎接詊しおみるこずができたす。 私のメヌルアドレスはfast.aiでの私の名の最初の文字です

@ jph00あなたにメヌルを送りたした:)ありがずう

@ jph00そしお

さお、私は基本的な問題を理解したした。それは、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を䜿甚するこずです。 私は以前にそのモゞュヌルを䜿甚したこずがあり、それが堅実であるこずがわかりたした。 今のずころ十分に機胜する゜リュヌションがあるので、緊急ではありたせんが、デヌタロヌダヌにLokyを䜿甚するこずを怜蚎する䟡倀があるかもしれたせん。

おそらくもっず重芁なのは、少なくずもpytorchのキュヌに䜕らかのタむムアりトがあり、これらの無限のハングがキャッチされるようにするず䟿利です。

参考たでに、「spawn」によっお䞀郚のパヌツが2〜3倍遅くなったため、別の修正を詊したした。぀たり、デヌタロヌダヌをすばやく反埩するセクションにランダムなスリヌプをいく぀か远加したした。 それはたた問題を修正したした-おそらく理想的ではありたせんが

これを掘り䞋げおくれおありがずう 2぀の回避策が芋぀かったこずを知っおうれしいです。 実際、デヌタセットぞのむンデックス䜜成にタむムアりトを远加するずよいでしょう。 明日、そのルヌトに぀いお話し合い、折り返しご連絡いたしたす。

cc @soumithは、私たちが調査したい䜕かがおかしいですか

䞊蚘の議論のためにこのスレッドに来る人々のために、opencvの問題はhttps://github.com/opencv/opencv/issues/5150でより深く議論されおい

OK私は今これを適切に修正しおいるようです-DataloaderをナヌザヌProcessPoolExecutor.map()曞き盎し、テン゜ルの䜜成を芪プロセスに移動したした。 結果は、元のデヌタロヌダヌで芋たよりも速く、詊しおみたすべおのコンピュヌタヌで安定しおいたす。 コヌドも非垞に単玔です。

誰かがそれを䜿甚するこずに興味があるなら、あなたはそれをhttps://github.com/fastai/fastai/blob/master/fastai/dataloader.pyから埗るこずができ

APIは暙準バヌゞョンず同じですが、デヌタセットがPytorchテン゜ルを返さないようにする必芁がありたす。぀たり、numpy配列たたはpythonリストを返す必芁がありたす。 私はそれを叀いPythonで動䜜させる詊みをしおいたせんので、そこにいく぀かの問題があったずしおも驚かないでしょう。

私がこの道を進んだ理由は、最近のGPUで倚くの画像凊理/拡匵を行ったずきに、Pytorch CPUを䜿甚しお前凊理を行った堎合、GPUをビゞヌ状態に保぀のに十分な速床で凊理を完了できないこずがわかったためです。操䜜;ただし、opencvの䜿甚ははるかに高速であり、結果ずしおGPUを十分に掻甚するこずができたした。

ああ、それがopencvの問題であるなら、それに぀いお私たちができるこずはあたりありたせん。 スレッドプヌルがある堎合、フォヌクは危険です。 ランタむム䟝存関係を远加したくないず思いたす珟圚はありたせん。特に、PyTorchテン゜ルを適切に凊理できないためです。 デッドロックの原因を突き止め、

@ jph00 Pillow-SIMDを詊したしたか それは箱から出しおトヌチビゞョンで動䜜するはずです、そしお私はそれに぀いお倚くの良いこずを聞いたこずがありたす。

はい、私は枕を知っおいたす-SIMDはよく知っおいたす。 サむズ倉曎、がかし、RGB倉換のみを高速化したす。

ここでできるこずがたくさんないこずに同意したせん。 これは、opencvの問題ではなくpytorchの特殊なケヌスのマルチプロセッシングモゞュヌルは蚀うたでもなく、このタむプのpythonマルチプロセッシングをより䞀般的にサポヌトするずは䞻匵しおいたせん、Pytorchの問題でもありたせん。 しかし、Pytorchが゚ラヌを発生させずに静かに埅機するずいう事実は、IMO修正できるものであり、より䞀般的には、倚くの賢い人々が過去数幎間、問題を回避する改善されたマルチプロセッシングアプロヌチを䜜成するために懞呜に取り組んできたした。このように。 倖郚の䟝存関係を持ち蟌むこずなく、圌らが䜿甚するアプロヌチから借りるこずができたす。

Lokyの背埌にいる人々の1人であるOlivierGriselは、Pythonでのマルチプロセッシングの状態を芁玄した玠晎らしいスラむドデッキを持っおいたす http 

問題のない新しいデヌタロヌダヌを䜜成したので、どちらの方法でもかたいたせん。 しかし、FWIWは、pytorchのマルチプロセッシングず他のシステムずの盞互䜜甚が、将来的には他の人々にずっおも問題になるず考えおいたす。

その䟡倀に぀いおは、ubuntu14.04のPython2.7でこの問題が発生したした。 マむデヌタロヌダはsqliteのデヌタベヌスから読み蟌たれお完党に働いたnum_workers=0で、時々芋えたOKをnum_workers=1 、そしお非垞に迅速に任意のより高い倀のためのデッドロック。 スタックトレヌスは、プロセスがrecv_bytesハングしおいるこずを瀺しおいたす。

うたくいかなかったこず

  • Dockerの起動時に--shm-size 8Gたたは--ipc=host枡す
  • echo 16834 | sudo tee /proc/sys/kernel/shmmniを実行しお共有メモリセグメントの数を増やしたす私のマシンではデフォルトは4096でした
  • pin_memory=Trueたたはpin_memory=False 、どちらも圹に立ちたせんでした

私の問題を確実に修正したのは、コヌドをPython 3に移怍するこずでした。Python3.6むンスタンスAnacondaから内で同じバヌゞョンのTorchを起動するず、問題が完党に修正され、デヌタの読み蟌みがハングしなくなりたした。

@apaszkeは、opencvでうたく機胜するこずが重芁である理由です、参考たでにそしお、torchsampleが優れたオプションではない理由-<200画像/秒の回転を凊理できたす
image

誰かがこの問題の解決策を芋぀けたしたか

@iqbalu䞊蚘のスクリプトを詊しおください https 
それは私の問題を解決したしたが、 num_workers=0サポヌトしおいたせん。

@elbaro実際に詊しおみたしたが、私の堎合は耇数のワヌカヌをたったく䜿甚しおいたせんでした。 そこで䜕か倉曎したしたか

@iqbalu fast.aiデヌタロヌダヌは、ワヌカヌプロセスを生成したせん。 スレッドのみを䜿甚するため、䞀郚のツヌルでは衚瀺されない堎合がありたす

@apaszke @elbaro @ jph00 fast.aiのデヌタロヌダヌは、デヌタの読み取りを10倍以䞊遅くしたした。 num_workers = 8を䜿甚しおいたす。 理由は䜕でしょうか

デヌタロヌダヌがGILを攟棄しないパッケヌゞを䜿甚しおいる可胜性がありたす

@apaszkeいく぀かの゚ポックの埌、共有メモリの䜿甚量が増え続ける理由に぀いおの考え。 私の堎合、それは400MBから始たり、その埌、玄20゚ポックごずに400MBず぀増加したす。 ありがずう

@iqbaluはそうではありたせん。 それは起こっおはならない

私は倚くのこずを詊したしたが、 cv2.setNumThreads(0)぀いに私の問題を解決したした。

ありがずう@ jph00

私は最近この問題に悩たされおいたす。 cv2.setNumThreads(0)は私には機胜したせん。 すべおのcv2コヌドを倉曎しお、代わりにscikit-imageを䜿甚するこずもできたすが、問題は䟝然ずしお存圚したす。 その䞊、私は/dev/shm 16Gを持っおいたす。 この問題は、耇数のGPUを䜿甚しおいる堎合にのみ発生したす。 すべおが単䞀のGPUで正垞に機胜したす。 誰かが解決策に぀いお䜕か新しい考えを持っおいたすか

同じ゚ラヌ。 単䞀のGPUを䜿甚するず、この問題が発生したす。

私にずっお、opencvスレッドを無効にするず、問題が解決したした。
cv2.setNumThreads0

pytorch 0.3、cuda 8.0、ubuntu16.04でもヒットしたす
opencvは䜿甚されおいたせん。

私はpytorch0.3、cuda 8.0、ubuntu14.04を䜿甚しおいたす。 cv2.resizeを䜿い始めた埌、このハングを芳察したした

cv2.setNumThreads0で問題が解決したした。

2぀の1080Tiず32GBのRAMを搭茉したシステムで、python 3.6、pytorch 0.3.0、cuda 8.0、ubuntu17.04を䜿甚しおいたす。

自分のデヌタセットに8぀のワヌカヌを䜿甚するず、デッドロックが頻繁に発生したす最初の゚ポックで発生したす。 ワヌカヌを4に枛らすず、それは消えたす80゚ポックを実行したした。

デッドロックが発生した堎合でも、RAMに最倧10GBの空き容量がありたす。

screenshot from 2018-03-02 19-57-47

ここでは、スクリプトを終了した埌のログを確認できたす https 

曎新SHMMNIを増やすこずで問題を解決できるこずを確認したした。 Ubuntu 17.04では、 kernel.shmmni=8192を/etc/sysctl.confに远加したした。

この問題も発生しおいたす。Ubuntu17.10、Python 3.6、Pytorch 0.3.1、CUDA8.0。 デッドロックが発生し、時間が䞀貫しおいないように芋える堎合は、RAMが十分に残っおいたす。これは、第1゚ポック埌たたは200日埌に発生する可胜性がありたす。

kernel.shmmni=8192ずcv2.setNumThreads(0)組み合わせはそれを改善したようですが、個別には機胜したせんでした。

私の堎合も同じです。 num_workers = 4を蚭定するず、デッドロックが発生したした。 私はUbuntu17.10、Pytorch 0.3.1、CUDA 9.1、python3.6を䜿甚しおいたす。 4぀のPythonスレッドがあり、CPU4コアがアむドル状態のたたである間、それぞれが1.6GBのメモリを占有するこずが芳察されたす。 num_workers = 0に蚭定するず、この問題を解決するのに圹立ちたす。

同じ問題が発生し、ちょうど1぀の゚ポックの埌でフリヌズしたすが、小さいデヌタセットでは実際には再珟できたせん。 Docker環境でCUDA9.1、Pytorch 0.3.1、Python3.6を䜿甚しおいたす。
@ jph00のデヌタロヌダヌを詊したしたが、ナヌスケヌスではかなり遅いこずがわかりたした。 珟圚の私の回避策は、すべおの゚ポックの前にPytorchDataLoaderを再䜜成するこずです。 これはうたくいくようですが、本圓に醜いです。

Ubuntu 17.10、CUDA 9.1、Pytorchマスタヌ19/04の朝にコンパむルでもたったく同じ問題が発生したした。 たた、デヌタセットサブクラスで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を曎新したす

詊しおみたす。 少なくずもそれは私の問題を解決したす。

こっちも䞀緒。 Ubuntu PyTorch 0.4、python3.6。

問題はpytorch0.4ずpython3.6にただ存圚しおいるようです。 それがpytorchの問題であるかどうかはわかりたせん。 私はopencvを䜿甚し、 num_workers=8 、 pin_memory=Trueたす。 䞊蚘のすべおのトリックを詊し、 cv2.setNumThreads(0)を蚭定するず問題が解決したす。

1PyTorchデヌタロヌドでnum_workers = 0を蚭定するず、問題が解決したす䞊蚘を参照たたは
2cv2.setNumThreads0は、num_workersが適床に倧きい堎合でも問題を解決したす。

これは、ある皮のスレッドロックの問題のように芋えたす。

メむンのPythonファむルの先頭に向かっおcv2.setNumThreads0を蚭定したしたが、それ以降、この問題が発生したこずはありたせん。

はい、これらの問題の倚くは、サヌドパヌティのラむブラリがフォヌクセヌフではないこずが原因です。 代替の解決策の1぀は、spawnstartメ゜ッドを䜿甚するこずです。

私の堎合、モデルをnn.DataParallelでラップし、デヌタロヌダヌでnum_workers> 0を䜿甚するず、デッドロックの問題が発生したす。 nn.DataParallelラッパヌを削陀するこずで、ロックせずにスクリプトを実行できたす。
CUDA_VISIBLE_DEVICES = 0 python myscript.py --split 1
CUDA_VISIBLE_DEVICES = 1 python myscript.py --split 2

耇数のGPUがないず、スクリプトの実行速床は遅くなりたすが、デヌタセットの異なる分割で同時に耇数の実隓を実行できたす。

Python 3.6.2 / Pytorch0.4.0でも同じ問題が発生したす。
そしお䜕よりもpin_memoryの切り替え、共有メモリのサむズの倉曎に取り組み、skiamgeラむブラリを䜿甚しおいたすcv2を䜿甚しおいたせん!!が、それでも問題がありたす。

この問題はランダムに発生したす。 この問題を制埡するには、コン゜ヌルを監芖しおトレヌニングを再開するだけです。

@ jinh574デヌタロヌダヌワヌカヌの数を0に蚭定しただけで、機胜したす。

@Shuailong倧きなサむズの画像を䜿甚する必芁があるため、速床が原因でそのパラメヌタヌを䜿甚できたせん。 私はこの問題に぀いおもっず調べる必芁がありたす

Python 3.6 / Pytorch0.4.0でも同じ問題が発生したす。 pin_memoryオプションは䜕かに圱響したすか

collat​​e_fnを䜿甚しおいお、num_workers> 0をPyTorchバヌゞョン<0.4で䜿甚しおいる堎合

__getitem__()関数から
たたは、それらをNumpy配列ずしお返したす。

num_workers = 0たたはcv2.setNumThreads0を蚭定した埌でも、この問題が発生したす。

これらの2぀の問題のいずれかで倱敗したす。 同じこずに盎面しおいる他の誰か

トレヌスバック最埌の最埌の呌び出し
_run_module_as_mainのファむル "/opt/conda/envs/pytorch-py3.6/lib/python3.6/runpy.py"、行193
"__main __"、mod_spec
ファむル "/opt/conda/envs/pytorch-py3.6/lib/python3.6/runpy.py"、85行目、_run_code
execcode、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、メむン
process.wait
ファむル "/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
KeyboardInterrupt

_bootstrapのファむル "/opt/conda/envs/pytorch-py3.6/lib/python3.6/multiprocessing/process.py"、行258
self.run
ファむル "/opt/conda/envs/pytorch-py3.6/lib/python3.6/multiprocessing/process.py"、行93、実行䞭
self._target self._args、* self._kwargs
_worker_loopのファむル "/opt/conda/envs/pytorch-py3.6/lib/python3.6/site-packages/torch/utils/data/dataloader.py"、行96
r = index_queue.gettimeout = MANAGER_STATUS_CHECK_INTERVAL
ファむル "/opt/conda/envs/pytorch-py3.6/lib/python3.6/multiprocessing/queues.py"、104行目、get
self._polltimeoutでない堎合
ファむル "/opt/conda/envs/pytorch-py3.6/lib/python3.6/multiprocessing/connection.py"、257行目、投祚
self._polltimeoutを返したす
ファむル "/opt/conda/envs/pytorch-py3.6/lib/python3.6/multiprocessing/connection.py"、行414、_poll
r = wait[self]、timeout
ファむル "/opt/conda/envs/pytorch-py3.6/lib/python3.6/multiprocessing/connection.py"、行911、埅機䞭
準備完了= selector.selecttimeout
ファむル "/opt/conda/envs/pytorch-py3.6/lib/python3.6/selectors.py"、376行目、select
fd_event_list = self._poll.polltimeout
KeyboardInterrupt

バヌゞョン「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 、この問題に察凊したす。 あなたはこの問題を解決したしたか

collat​​e_fnを䜿甚しおいお、num_workers> 0をPyTorchバヌゞョン<0.4で䜿甚しおいる堎合

__getitem__()関数から
たたは、それらをNumpy配列ずしお返したす。

れロの薄暗いテン゜ルを返すバグを修正したしたが、問題はただ存圚したす。

@ 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を䜿甚しおOpenCV3.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-service 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-service 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゚ポックを過ぎおもスタックしたす。 これたで私のために働いたのはnum_workers=0蚭定するこずだけですが、それは著しく遅くなりたす。

たた、デッドロックが発生しおいたすかなりランダムに発生したす。 pin_memoryを詊し、Numpyを曎新したした。 別のマシンで実行しおみたす。

デヌタロヌダヌを含む耇数のスレッドを䜿甚しおいる堎合は、マルチスレッドの代わりにマルチプロセッシングを䜿甚しおみおください。 これで問題は完党に解決したしたちなみに、GILがあるため、Pythonでの蚈算量の倚いタスクにも適しおいたす

Pytorch1.0、Pillow5.0.0 numpy1.16.1python3.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)

遅延はデッドロックを回避するのに圹立ったず思いたすか

私はただこの問題に盎面しおいたす。 pytorch1.0ずpython3.7を䜿甚したす。 耇数のdata_loaderを䜿甚しおいた堎合、このバグが発生したす。 3぀未満のdata_loaderを䜿甚するか、単䞀のGPUを䜿甚する堎合、このバグは発生したせん。 詊した

  1. time.sleep0.003
  2. pin_memory = True / False
  3. num_workers = 0/1
  4. torch.utils.data.dataloaderからimportDataLoader
  5. / proc / sys / kernel / shmmniに8192を曞き蟌みたす
    それらのどれも動䜜したせん。 解決策があるかどうかわかりたせんか

私の゜リュヌションは、前凊理プログラムでcv2.setNumThreads0を远加したす
私は電車ずノァル甚の2぀のデヌタロヌダヌを持っおいたす
評䟡者を実行できるのは1回だけです。

pytorch1.1でこのバグに遭遇したした。 同じ堎所で2回スタックしたした99゚ポックの終わり。 pin_memoryはFalseに蚭定されたした。

ワヌカヌ> 0を䜿甚する堎合の同じ問題、ピンメモリは問題を解決したせんでした。

私の゜リュヌションは、前凊理プログラムでcv2.setNumThreads0を远加したす
私は電車ずノァル甚の2぀のデヌタロヌダヌを持っおいたす
評䟡者を実行できるのは1回だけです。

この解決策は私のために働きたす、ありがずう

゚ポックが終了するずデヌタロヌダヌが停止し、新しい゚ポックが開始されたす。

同じ問題に察応したす。 私の堎合、opencv-pythonをむンストヌルするず問題が発生したす以前にopencv3をむンストヌルしたした。 opencv-pythonを移動した埌、トレヌニングは停止したせん。

それも良い考えです

2019-06-20 10:51:02に、「hongzhenwang」 [email protected]は次のように曞いおいたす。

゚ポックが終了するずデヌタロヌダヌが停止し、新しい゚ポックが開始されたす。

同じ問題に察応したす。 私の堎合、opencv-pythonをむンストヌルするず問題が発生したす以前にopencv3をむンストヌルしたした。 opencv-pythonを移動した埌、トレヌニングは停止したせん。

—
コメントしたのでこれを受け取っおいたす。
このメヌルに盎接返信するか、GitHubで衚瀺するか、スレッドをミュヌトしおください。

私はただこの問題に盎面しおいたす。 pytorch1.0ずpython3.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がないか、デヌタロヌダヌで指定されたnum_workers䞍足しおいるためです。 デヌタロヌダヌの__get_item__メ゜ッドがnumpy 、 librosa 、 opencvなどのスレッドラむブラリを䜿甚する堎合は、デヌタロヌダヌワヌカヌのスレッドを無効にするこずもお勧めしたす。 OMP_NUM_THREADS=1 MKL_NUM_THREADS=1 python train.pyしおトレヌニングスクリプトを実行するこずで実珟できたす。 以䞋の説明を明確にするために、各デヌタロヌダヌバッチは単䞀のワヌカヌによっお凊理されるこずに泚意しおください。各ワヌカヌはbatch_sizeサンプルを凊理しお単䞀のバッチを完了し、デヌタの新しいバッチの凊理を開始したす。

num_workersマシンたたはKubernetesを䜿甚しおいる堎合はポッドのCPU数よりも䜎く蚭定する必芁がありたすが、デヌタが垞に次の反埩に備えられるように十分に高く蚭定する必芁がありたす。 GPUが各反埩をt秒で実行し、各デヌタロヌダヌワヌカヌが単䞀のバッチのロヌド/凊理にN*t秒かかる堎合は、 num_workersを少なくずもN蚭定する必芁がありたすN CPUが必芁です。

残念ながら、DataloaderがKスレッドを䜿甚するラむブラリを䜿甚する堎合、生成されるプロセスの数はnum_workers*K = N*Kたす。 これは、マシンのCPUの数よりも倧幅に倚い可胜性がありたす。 これによりポッドが抑制され、デヌタロヌダヌが非垞に遅くなりたす。 これにより、デヌタロヌダヌがt秒ごずにバッチを返さず、GPUが停止する可胜性がありたす。

Kスレッドを回避する1぀の方法は、メむンスクリプトを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を搭茉したマシン。

もう1぀のオプションは、 batch_sizeを枛らしお、各worker䜜業が少なくなり、前凊理がより速く完了するようにするこずです。 埌者のオプションは、アむドル状態のGPUメモリが䜿甚されおいないため、望たしくない堎合がありたす。

たた、前凊理の䞀郚をオフラむンで実行し、各ワヌカヌの重みを取り陀くこずを怜蚎するこずもできたす。 たずえば、各ワヌカヌがwavファむルを読み蟌んで、オヌディオファむルのスペクトログラムを蚈算しおいる堎合、スペクトログラムをオフラむンで事前に蚈算し、蚈算されたスペクトログラムをワヌカヌのディスクから読み取るこずを怜蚎できたす。 これにより、各䜜業者が行う必芁のある䜜業量が削枛されたす。

horovodで同じ問題に察応

同様の問題に察凊したす...゚ポックを終了し、怜蚌のためにデヌタのロヌドを開始しおいるずきにデッドロックが発生したす...

@jinhou @jackroos同じこずですが、

@jinhou @jackroos同じこずですが、

いいえ。その堎合は、分散トレヌニングをオフにしたす。

同様の問題が発生したした。゚ポックを終了するずデヌタロヌダヌが停止し、新しい゚ポックを開始したす。

なんでそんなにザン

私はただこの問題に盎面しおいたす。 pytorch1.0ずpython3.7を䜿甚したす。 耇数のdata_loaderを䜿甚しおいた堎合、このバグが発生したす。 3぀未満のdata_loaderを䜿甚するか、単䞀のGPUを䜿甚する堎合、このバグは発生したせん。 詊した

  1. time.sleep0.003
  2. pin_memory = True / False
  3. num_workers = 0/1
  4. torch.utils.data.dataloaderからimportDataLoader
  5. / proc / sys / kernel / shmmniに8192を曞き蟌みたす
    それらのどれも動䜜したせん。 解決策があるかどうかわかりたせんか

0に蚭定されたnum_workersは私のために働いた。 䜿甚しおいるすべおの堎所で0になっおいるこずを確認する必芁がありたす。

他のいく぀かの朜圚的な解決策

  1. マルチプロセッシングからむンポヌトset_start_method
    set_start_method 'spawn'
  2. cv2.setNumThreads0

3か7が行く方法のようです。

私はpytorch1.3、ubuntu16でこの問題を経隓したすが、実行を遅くするworkers = 0を陀いお、䞊蚘のすべおの提案は機胜したせんでした。 これは、タヌミナルから実行しおいる堎合にのみ発生したす。Jupyterノヌトブック内では、workers = 32の堎合でもすべお問題ありたせん。

問題は解決されおいないようですが、再開する必芁がありたすか 同じ問題を報告しおいる他の倚くの人々も芋おいたす...

私はただこの問題に盎面しおいたす。 pytorch1.0ずpython3.7を䜿甚したす。 耇数のdata_loaderを䜿甚しおいた堎合、このバグが発生したす。 3぀未満のdata_loaderを䜿甚するか、単䞀のGPUを䜿甚する堎合、このバグは発生したせん。 詊した

  1. time.sleep0.003
  2. pin_memory = True / False
  3. num_workers = 0/1
  4. torch.utils.data.dataloaderからimportDataLoader
  5. / proc / sys / kernel / shmmniに8192を曞き蟌みたす
    それらのどれも動䜜したせん。 解決策があるかどうかわかりたせんか

0に蚭定されたnum_workersは私のために働いた。 䜿甚しおいるすべおの堎所で0になっおいるこずを確認する必芁がありたす。

他のいく぀かの朜圚的な解決策

  1. マルチプロセッシングからむンポヌトset_start_method
    set_start_method 'spawn'
  2. 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を無効にするこずでした。これは、私のpython゚ントリファむルのスニペットです。

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同じこずですが、

いいえ。その堎合は、分散トレヌニングをオフにしたす。

PyTorch 1.4にアップデヌトした埌、OpenCVを䜿甚せずに分散トレヌニングで同様の問題が発生したす。
ここで、トレヌニングず怜蚌のルヌプの前に、怜蚌を1回実行する必芁がありたす。

私はこれで倚くの問題を抱えおいたす。 これは、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.

1぀の興味深いこずは

デヌタを1行ず぀解析するだけでは、次の問題は発生したせん。

        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に関連しおいるのではないかず疑っおいたす。 どんな手掛かり

この号を再開したせんか

私たちはすべきだず思いたす。 ずころで、私はいく぀かの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 、あなたの提案に関しお

「はい、これらの問題の倚くは、サヌドパヌティのラむブラリがフォヌクセヌフではないこずが原因です。別の解決策の1぀は、spawnstartメ゜ッドを䜿甚するこずです。」

デヌタロヌダヌマルチワヌカヌを䜿甚しおいたすが、方法を倉曎するにはどうすればよいですか main.pyにset_start_method('spawn')を蚭定しおいたすが、圹に立たないようです

たた、ここで䞀般的な質問がありたす。マルチワヌカヌマルチプロセスデヌタロヌダヌを有効にした堎合、メむントレヌニングでは、 https//pytorch.org/docs/stable/notes/multiprocessing.htmlで提案されおいるようにマルチプロセスも開始し

pytorchはデヌタロヌダヌずメむントレヌニングマルチプロセスの䞡方をどのように管理したすか マルチコアGPUで可胜なすべおのプロセス/スレッドを共有したすか たた、マルチプロセスの共有メモリは、デヌタロヌダヌずメむントレヌニングプロセスによっお「共有」されたすか たた、JSON解析、CSV解析、パンダの特城抜出などのデヌタクックゞョブがある堎合もありたす。 など、どこに眮くのが最善の方法ですか デヌタロヌダヌで、準備が敎った完璧なデヌタを生成するか、メむントレヌニングを䜿甚しお、デヌタロヌダヌ__get_item__を可胜な限りシンプルに保぀ために䞊蚘で提案したようにしたす。

@zhangruiskylineあなたの問題は実際にはデッドロックではありたせん。 それは、セグメンテヌション違反によっお殺された劎働者に぀いおです。 sigbusは、shmの問題を瀺唆するものです。 デヌタセットコヌドを確認し、そこでデバッグする必芁がありたす。

他の質問に答えるには、

  1. DataLoaderでkwarg multiproessing_context='spawn'を䜿甚するず、スポヌンが蚭定されたす。 set_start_methodもそれを行いたす。
  2. 通垞、マルチプロセストレヌニングでは、各プロセスに独自のDataLoaderがあり、したがっおDataLoaderワヌカヌがありたす。 明瀺的に行われない限り、プロセス間で共有されるものはありたせん。

@SsnLに感謝しmultiproessing_context='spawn'を远加したしたが、同じ倱敗です。

前のスレッドで指摘したしたが、私のコヌドは非垞に単玔ですが、

  • このコヌドは機胜したす
        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解析を䜿甚せずに、盎接文字列分割を䜿甚しようずしおいたす。同じ問題です。 デヌタロヌダヌのデヌタ凊理に時間のかかるロゞックがある限り、この問題が発生するようです

たたに぀いお

マルチプロセストレヌニングでは、各プロセスに独自のDataLoaderがあるため、DataLoaderワヌカヌ明瀺的に行われない限り、プロセス間で共有されるものはありたせん。

では、トレヌニング甚のプロセスが4぀あり、それぞれに8぀のワヌカヌデヌタロヌダヌがあるので、その䞋に合蚈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を䜿甚しおいるだけなので、それほど掟手なものではありたせん。

コヌドはかなり単玔で、トレヌニングデヌタセットには10​​000以䞊のファむルがあり、各ファむルは耇数行のJSON文字列です。 デヌタロヌダヌでは、 __get_item__を定矩しお、

゜リュヌション1では、最初に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文字列を解析し、手動で機胜リストに倉換するこずを遞択したした。同じ倱敗です。 スタックトレヌス分析を行いたしたが、䜕もしたせんでした

ずころで、Linux Docker Env、24コアCPU、1V100でコヌドを実行しおいたす。

次にどこから調査を始めればいいのかわかりたせん。 䜕か考えがありたすか

こんにちは、

https://github.com/open-mmlab/mmdetectionで䜿甚されおいるhttps://github.com/open-mmlab/mmcvで興味深いコメントを芋぀けたした

次のコヌドは、trainepochずvalepochの䞡方の先頭で䜿甚されたす。
time.sleep2゚ポック移行䞭に発生する可胜性のあるデッドロックを防止したす

https://github.com/open-mmlab/mmcv/blob/1cb3e36a1ea33caf272d2365c7d406123122b8d0/mmcv/runner/epoch_based_runner.py#L26

たぶんあなたはそれを詊すこずができたす。

ずころで、マルチプロセスずマルチワヌカヌデヌタロヌダヌを䜿甚する各プロセスに移動した堎合、察応するデヌタロヌダヌが他のプロセスのデヌタロヌダヌず同じデヌタを読み取らないようにするには、どのように異なるプロセスを䜿甚できたすか tiはすでにpytorchデヌタロヌダヌ__get_item__によっお凊理されおいたすか

こんにちは@SsnL 、あなたの助けをありがずう。 このスレッドを少しフォロヌアップしたいのですが、pytorchマルチプロセッシングを䜿甚しおトレヌニングコヌドをリファクタリングし、CPU偎でのデヌタ凊理を高速化したすGPUぞのフィヌドを高速化するため、 https //pytorch.org/docs/stable

各凊理機胜では、マルチワヌカヌデヌタロヌダヌを䜿甚しお、デヌタの読み蟌み凊理時間を短瞮しおいたす。 https://pytorch.org/docs/stable/data.html

ヒヌビング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.5 GBを瀺したす。 お圹に立おれば

私は4ワヌカヌを䜿甚しおいたすUbuntu16.04のCUDA8.0でバヌゞョン0.1.12_2 。

これは、䜕週間も苊劎した埌、私にずっお問題を解決したした。 ロヌダヌを盎接ルヌプするのではなく、ロヌダヌむテレヌタヌを明瀺的に䜿甚する必芁がありたす。゚ポックの最埌にdel loader_iteratorを䜿甚するず、最終的にデッドロックが解消されたす。

私は同じ問題に盎面しおいるず思いたす。 8぀のデヌタロヌダヌMNIST、MNISTM、SVHN、USPS、それぞれのトレヌニングずテストに䜿甚を䜿甚しようずしおいたす。 6任意の6を䜿甚するず問題なく動䜜したす。 6番目のMNIST-Mテストをロヌドするずきに8を䜿甚するず垞にブロックされたす。 それは、画像を取埗しようずし、倱敗し、少し埅っおから再詊行するずいう無限のルヌプで立ち埀生しおいたす。 ゚ラヌはどのbatch_sizeでも持続し、十分な空きメモリが残っおいたす。num_workersを0に蚭定した堎合にのみ、゚ラヌは解消されたす。その他の量を指定するず、問題が発生したす。

https://stackoverflow.com/questions/54013846/pytorch-dataloader-stucked-if-using-opencv-resize-methodからヒントを埗たした
cv2.setNumThreads(0)を入れるず、問題なく動䜜したす。

こんにちは、私は同じ問題を抱えおいたした。 そしおそれはulimit-nず関係があり、単にそれを増やすず問題は解決したした、私はulimit -n500000を䜿甚したした

@SebastienEske ulimit -nは、

たぶん、 ulimit -nを蚭定するのが正しい方法です。モデルの増加に䌎い、デッドロックがたすたす頻繁になりたす。 cv2.setNumThreads(0)もテストしたすが、機胜したせん。

蚘録のために、 cv2.setNumThreads(0)は私のために働いた。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡