日々精進

新しく学んだことを書き留めていきます

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)

参考:

stackoverflow.com

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になることがある。

参考: nishidy.hatenablog.com

なのでタプルの要素の一つにnumpy.ndarrayがあると、ndarray同士の比較の結果、ndarrayが生成され、結果がboolでないのでエラーになる。

今回は値が同じかでなく、オブジェクトが同じかを確認したかったのでid(obj)でオブジェクトのIDを取得して比較するよう修正した。

参考:

qiita.com

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された理由を出してくれるとわかりやすいんだけど。。

参考:

stackoverflow.com

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'

参考:

github.com

AWSでどのGPUインスタンスを使えば良いかが分かる資料

GPUインスタンスの種類が多すぎて何を使えば良いかわからない・・と言う場合、以下を参考にするといいかも。

towardsdatascience.com

ユースケース別にオススメのインスタンスタイプがかかれていて参考になりました。 ただ、2020年6月の記事なのでちょっと古くなっているところがある。 最近追加されたg4ad, DL1などのインスタンスタイプは考慮されていない。