dataloader経由でデータを取得する際に処理待ちのような状態になって動かなくなることがあったのでメモ。
具体的にやろうとしてたのはDETRを動かしてみることで、画像2枚だけの小さなデータセットを用意して実行したところ以下の部分以降に処理が進まなかった
https://github.com/facebookresearch/detr/blob/eb9f7e03ed8e2ed2cd55528989fe7df890bc3fc0/datasets/coco.py#L29
- 前後にprintを置いて後ろの出力だけが出ない
- エラーが出るわけではなく学習処理は実行中のまま進まない
- 上記のtransformsを単純に
ToTensor()
だけに置き換えてみても同様
学習開始の際に以下のようなwarningが出てたのでそれも調べてみる
[W ParallelNative.cpp:212] Warning: Cannot set number of intraop threads after parallel work has started or after set_num_threads call when using native parallel backend (functio n set_num_threads)
メッセージでググるとこういうのがヒットする https://stackoverflow.com/questions/64772335/pytorch-w-parallelnative-cpp206 https://github.com/pytorch/pytorch/issues/46409
私の環境は
- macOS
- python3.7.7
- pytorch1.9.0
なのでリンクにある状態とは異なるものの、ひとまず num_worker=0
として試したらwarningは出なくなり、かつ処理も進むようになった。というわけでdataloaderが複数workerで動いていることによる問題だった模様。
OMP_NUM_THREADS=1, seems to resolve the issue. The num_workers parameters on DataLoader seems to have no effect on the issue.
githubのissueだとこのように書いてあるが、pytorchのversionが異なるためかnum_workerの設定だけで問題なかった。
ちなみにせっかくなので調べてみたところ OMP_NUM_THREADS
はCPU上での並列処理のスレッド数を設定するものだった
https://pytorch.org/docs/stable/notes/cpu_threading_torchscript_inference.html
https://qiita.com/sakaia/items/6d31dedb396463023cfe
この設定にすると当然dataloaderのworkerの並列動作がなくなるのでパフォーマンスは低下するが、今回はまず動かしてみるという状態なので今の所はこれで解決。