2

3D データ (x、y、z) のランダム サンプルがあります。ここで、x と y は空間次元であり、z は平面上の位置の関数です: z = f(x,y)。サンプルから補間された値を使用して、通常のグリッドでこの関数を評価したいと思います。

サンプルの各セットは異なるファイルにあり、個別に補間する必要があります (各ファイルは異なる時点です)。これらのファイルの処理を高速化するために、マルチプロセッシング (mp) モジュールを使用して、mp プールを使用してそれらを並行して処理したいと考えています。

ただし、mp プールによって呼び出される関数内で mp.griddata を使用しようとすると、プロセスが griddata 関数に到達したときにハングします。同じ関数を連続して実行する場合は問題ありません。また、これは特定の numpy/scipy ビルドでのみ発生します。私の numpy.show_config() が次の場合:

blas_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib']
    language = f77
lapack_info:
    libraries = ['lapack']
    library_dirs = ['/usr/lib']
    language = f77
atlas_threads_info:
  NOT AVAILABLE
blas_opt_info:
    libraries = ['blas']
    library_dirs = ['/usr/lib']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]
atlas_blas_threads_info:
  NOT AVAILABLE
lapack_opt_info:
    libraries = ['lapack', 'blas']
    library_dirs = ['/usr/lib']
    language = f77
    define_macros = [('NO_ATLAS_INFO', 1)]
atlas_info:
  NOT AVAILABLE
lapack_mkl_info:
  NOT AVAILABLE
blas_mkl_info:
  NOT AVAILABLE
atlas_blas_info:
  NOT AVAILABLE
mkl_info:
  NOT AVAILABLE

すべて正常に動作します。

しかし、設定が次の場合:

lapack_info:
    libraries = ['openblas']
    library_dirs = ['/u/ccor/local/lib']
    language = f77
atlas_threads_info:
    libraries = ['openblas']
    library_dirs = ['/u/ccor/local/lib']
    define_macros = [('ATLAS_WITHOUT_LAPACK', None)]
    language = c
    include_dirs = ['/usr/include']
blas_opt_info:
    libraries = ['openblas']
    library_dirs = ['/u/ccor/local/lib']
    define_macros = [('ATLAS_INFO', '"\\"None\\""')]
    language = c
    include_dirs = ['/usr/include']
atlas_blas_threads_info:
    libraries = ['openblas']
    library_dirs = ['/u/ccor/local/lib']
    define_macros = [('ATLAS_INFO', '"\\"None\\""')]
    language = c
    include_dirs = ['/usr/include']
lapack_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/u/ccor/local/lib']
    define_macros = [('ATLAS_WITHOUT_LAPACK', None)]
    language = f77
    include_dirs = ['/usr/include']
lapack_mkl_info:
  NOT AVAILABLE
blas_mkl_info:
  NOT AVAILABLE
mkl_info:
  NOT AVAILABLE

子プロセスがハングします。

2 番目の構成は、LibOpenBLAS と numpy を手動でコンパイルすることにより、多くのコアを持つマシン用に BLAS ライブラリを最適化しようとして作成されました。どちらの場合も、python 2.7.3 を使用して virtualenv にいます。

また、ぶら下がりは、griddata が 'linear' または 'cubic' 補間で使用されている場合にのみ発生します。「最も近い」は正常に機能します。

問題を説明して切り分けるためのコードを次に示します。データはファイルから読み取る代わりにランダムに生成され、結果は例として任意に蓄積されます。

import multiprocessing as mp
import numpy
from scipy import interpolate

def interpolate_grid(it, n_points, grid_dim):

    print 'interpolating: ', it

    numpy.random.seed(it)

    points = 2*numpy.random.random((n_points,2))-0.5
    values = numpy.random.random(n_points)
    x,y = numpy.mgrid[0:1:grid_dim*1j,0:1:grid_dim*1j]
    grid_pnts = numpy.vstack([x.flatten(), y.flatten()]).T
    interp_vals = interpolate.griddata(points, values, grid_pnts, 'cubic')
    print 'done interpolating: ', it
    return interp_vals

def interpolation_test(n_runs = 10, n_points = 1000, grid_dim = 10, parallel = True):

    class Sum(object):
        def __init__(self, grid_dim):
            self.acc = numpy.zeros(grid_dim*grid_dim)

        def accumulate(self, val):
            self.acc += val

    acc = Sum(grid_dim)

    if parallel:
        pool = mp.Pool(mp.cpu_count())
        for i in xrange(n_runs):
            pool.apply_async(interpolate_grid, 
                            args = [i, n_points, grid_dim], 
                            callback = acc.accumulate)
        pool.close()
        pool.join()

    else:
        for i in xrange(n_runs):
            acc.acc += interpolate_grid(i, n_points, grid_dim)

    return acc.acc

def main():

    ser_result = interpolation_test(parallel = False)
    par_result = interpolation_test(parallel = True)

    assert (numpy.abs(par_result-ser_result) < 1e-14).all()
    print 'serial and parallel results the same'

if __name__ == '__main__':
    main()

編集: scikit-learn のインストール ページでこれを見つけました:している。」

OpenBLAS の代わりに ATLAS を使用して回避策を見つけました。

aptitude install libatlas-base-dev
ATLAS=/usr/lib
pip install numpy

OpenBLAS ほど高速ではありませんが、私のアプリケーションにとってより重要なマルチプロセッシングで動作し、基本的な numpy インストールよりもはるかに高速です。OpenBLAS とマルチプロセッシングが「うまく連携しない」理由について、「自分が何をしているかを知っている」人はコメントしたいと思いますか? または、どうすれば彼らを上手にプレイさせることができるでしょうか? scikit-learn サイトの警告は、それが可能であることを暗示しているようです。

4

0 に答える 0