joblibの並列化関数を利用する場合、並列実行される関数の中のprint()文が全部出力できなくなります。
原因は何でしょうか。
この場合中間結果を確認したい場合どうすれば良いのでしょうか。
環境 Google Colaboratory
実行文の例:
Python
1Parallel(n_jobs=-1,verbose=11)(delayed(myFunc)(x) for x in range(100) )
myFunc()中のprint()文が全部自動的に無効になってしまいました。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
joblib については詳しく知りませんが、サブプロセス側でのprint デバッグは
logging モジュールの QueueHandler 等を用いて、メインプロセス側でまとめて出力するように構成します。
⇛ サンプルコードは、ロギングクックブックの複数プロセスからのログを参照してください。
問題の原因は、サブプロセスの利用方法次第では、
実行環境で設定された python上のsys.stdout 等のリダイレクトが適応されない、という問題です。
google colab 以外にも IDE 内の実行でも同様の症状が確認されています。
(解決可能な不具合ではなく、実装による制限のようです)
Pararell の引数に backend="multithread" を指定すると、print() の表示自体は出来るようになりますが、
マルチプロセスでは実行タイミングが保証されない為、ログ出力が崩れる原因にも成りかねません。
デバッグで一時的に出力が見たいだけの場合等は、printが手軽かもしれませんが、
マルチスレッド・マルチプロセスではlogging モジュールをお勧めします。
実際の用途を想定すると
外部ライブラリ内で logging モジュールを使っている場合もあるので、
例えばサブプロセス側でそういったライブラリを使う場合、
正しく logging の設定を構成できないと、ログ出力に気付かない
もしくは、ログが壊れる、といったことが起こる可能性があります。
関連:
- logging cookbook - 複数のプロセスからの単一ファイルへのログ記録
- Google Colaboratory でログファイルを出力する方法
- problem with logging module in google colab
FileHandler の代わりに StreamHandler を使うと notebook 内に出力できますが、
ログが大量になる時に、便利そうな記事を見つけたので関連として紹介。
他、Google Colab (Jupyter 環境等) での logging モジュール利用の注意点もあります。
投稿2022/06/12 08:58
総合スコア8817
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Google colabで試した結果を載せます。
Backendがloky以外なら表示できます。
※Stackoverflowにて記事発見。「lokyモジュールがそうさせている」とのこと。
後はお好みでどうぞ。
Python3
1import joblib 2 3# # backend: multithread, expected one of ['loky', 'multiprocessing', 'sequential', 'threading'] 4# back_end = "loky" # 表示されない。割愛した時のデフォルトの引数 5# back_end = "multiprocessing" # 表示される。並列処理の特性上、必ず順番通りになるわけではない。 6# back_end = "sequential" # 表示される。joblibのガワはかぶっていても並列処理はしていないので、必ず順番通りに表示される。 7back_end = "threading" # 表示される。並列処理の特性上、必ず順番通りになるわけではない(はずなのに、Google Colabだと順番通りに…)。 8 9def myFunc(val): 10 print("Child:",val,flush=True) # 質問事項の検証用 11 return val 12 13ans = joblib.Parallel(n_jobs=-1,verbose=0,backend=back_end)(joblib.delayed(myFunc)(x) for x in range(100) ) 14print("ans:",ans) 15
投稿2022/06/12 01:47
編集2022/06/12 22:35
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2022/06/12 22:22 編集

退会済みユーザー
2022/06/14 22:28 編集

0
自己解決
マルチプロセスの場合、print 文の表示がタイミング的乱れがあるという印象でした。
投稿2022/06/13 08:34
編集2022/06/13 09:02総合スコア315
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/06/13 11:46 編集

退会済みユーザー
2022/06/13 15:06

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。