Celery と RabbitMQ を使用して、いくつかの線形回帰タスクを分散しようとしています。セットアップは add(x,y) 関数の例で問題なく動作しますが、statsmodels OLS クラスをインスタンス化すると、たとえば
self.model = sm.OLS(self.y, self.X)
100% の CPU を消費している間、ワーカーは無期限に保留されます。
何が起こっている?
Celery と RabbitMQ を使用して、いくつかの線形回帰タスクを分散しようとしています。セットアップは add(x,y) 関数の例で問題なく動作しますが、statsmodels OLS クラスをインスタンス化すると、たとえば
self.model = sm.OLS(self.y, self.X)
100% の CPU を消費している間、ワーカーは無期限に保留されます。
何が起こっている?
デフォルトでは、セロリはマルチプロセッシング ライブラリを同時実行の実装として使用します。StatsModels の OLS メソッドは Lapack を呼び出します。Lapack は (Lapack / BLAS の多くの関数と共に) 独自のスレッド プールを開始して計算を高速化します。残念ながら、サブプロセスがフォークされた後はスレッドが継承されないため、ゾンビが作成されます。
セロリの問題に関する議論は次のとおりです: https://github.com/celery/celery/issues/1842
しかし、前回の投稿で指摘したように、それはセロリのせいではありません。
OpenBLAS の問題に関する問題については、長い議論があります: https://github.com/xianyi/OpenBLAS/issues/294
OpenBLAS のデフォルト ビルドがフォーク セーフになったため、これが今後問題にならないことを願っています: http://numpy-discussion.10968.n7.nabble.com/Default-builds-of-OpenBLAS-development-branch -are-now-fork-safe-td36523.html
(2014 年 2 月 9 日の時点で、バージョンをアップグレードするか、最新の開発ビルドをインストールする必要がある場合があります)。