原因はわかっていないが、再実行したらエラーが出なかった。なぜだ・・
multiprocessing.Poolは各ProcessにGlobal変数をコピーする
マルチプロセスなので当たり前なんだけど、Pythonのmultiprocessing.Poolを使って複数プロセスで並列処理をする時にGlobal変数はそれぞれのプロセスにコピーされる。
なので、以下の例だとmy_funcの中でGlobal変数を変更しても他のプロセスには影響しない。
pool = ProcessingPool(nodes=nodes)
pool.map(lambda x: my_func(x[0], x[1]), candidates)
参考:
Pythonでオブジェクト==で比較すると「{ValueError}The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()」エラー
発生条件は以下。
- @dataclassの付いたclassのオブジェクトを==で比較する
- そのclassのインスタンス変数にnumpy.ndarrayがある
原因は以下。
@dataclassで自動生成されるeqメソッドは、そのクラスのフィールドからなるタプルを比較する
参考: docs.python.org
ndarray同士の比較結果は、各要素毎の比較結果を格納したndarrayになることがある。
なのでタプルの要素の一つにnumpy.ndarrayがあると、ndarray同士の比較の結果、ndarrayが生成され、結果がboolでないのでエラーになる。
今回は値が同じかでなく、オブジェクトが同じかを確認したかったのでid(obj)でオブジェクトのIDを取得して比較するよう修正した。
参考:
Pythonスクリプトを実行すると「ImportError: cannot import name」エラー
原因は色々ありうるが、今回は同じフォルダ名が複数あることだった。つまり、以下のようなフォルダ構成になっていて root/aとroot/bをPYTHONPATHに追加していた。
root/a/common/a.py root/b/common/b.py
そうするとa.pyをimportしようとするとそんなモジュールないよというエラーになる。
名前が同じ場合、どちらかしかモジュール検索できないんだなぁ。。
学習中に突然学習が止まる
以下のようなメッセージを残して学習が止まることがあり、困った。
train.sh: line 27: 32529 Killed
原因はOOMだった。
dmesg -T| grep -E -i -B100 'killed process'
上記コマンドを実行すると、以下が表示され、OOMでプロセスが殺されたことが分かる。
[Fri Nov 12 12:40:36 2021] Out of memory: Kill process 32529 (train.py) score 934 or sacrifice child [Fri Nov 12 12:40:36 2021] Killed process 32529 (train.py) total-vm:91100884kB, anon-rss:54097488kB, file-rss:65616kB, shmem-rss:4485120kB
ログにもっとKillされた理由を出してくれるとわかりやすいんだけど。。
参考:
conda env createでyamlを指定しconda環境を作る時にpycocotoolsが含まれていると「ModuleNotFoundError: No module named 'Cython'」エラー
pycocotoolsのsetup.pyがCythonなどをimportしているためエラーになるっぽい。
ホントはやりたくないが、以下のようにyamlに含めず後からpip installでインストールするようにした。
conda env create -f=/root/environment.yaml conda activate myenv pip install 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
参考:
AWSでどのGPUインスタンスを使えば良いかが分かる資料
GPUインスタンスの種類が多すぎて何を使えば良いかわからない・・と言う場合、以下を参考にするといいかも。
ユースケース別にオススメのインスタンスタイプがかかれていて参考になりました。 ただ、2020年6月の記事なのでちょっと古くなっているところがある。 最近追加されたg4ad, DL1などのインスタンスタイプは考慮されていない。