коэффициент Сципи Пирсона, по-видимому, самопроизвольно распараллеливает вычисления - PullRequest
1 голос
/ 12 января 2020

У меня есть следующий скрипт:

#!/usr/bin/env python

import numpy as np
import scipy.stats as sts

def corr_funct(X, res, tau_vals):

    for z, tau in enumerate(tau_vals):
        x = X[:-tau]
        y = X[tau:]
        r, p = sts.pearsonr(x, y)
        res[z, 1] = r

    return res

my_list = [x for x in range(10**6)]
tau_max = 10**5

tau_vals = sorted(list(set(np.geomspace(1, tau_max, num=10**4, dtype=int))))
res = np.zeros((len(tau_vals), 2))
res[:, 0] = tau_vals

print('go for computations')

res = corr_funct(my_list, res, tau_vals)

np.save('my_res.npy', res)

Проблема в следующем: когда я его запускаю, все нормально. Когда он «идет на вычисления» и вызывает corr_funct(), происходит следующее: top говорит мне, что запущена одна программа:

enter image description here

Если вместо этого я смотрю на htop Я вижу множество запущенных потоков:

enter image description here

Процессы спят, но мне сказали, что это может замедлить вычисления. Я не понимаю, что происходит.

Чтобы сделать вещи еще более странными, я заметил, что если я заменю

def corr_funct(X, res, tau_vals):

    for z, tau in enumerate(tau_vals):
        x = X[:-tau]
        y = X[tau:]
        r, p = sts.pearsonr(x, y)
        res[z, 1] = r

    return res

на

def corr_funct(X, res, tau_vals):

    z = 0
    for tau in tau_vals:
        x = X[:-tau]
        y = X[tau:]
        r, p = sts.pearsonr(x, y)
        res[z, 1] = r
        z += 1

    return res

странное поведение больше не кажется (кажется). Я не имею ни малейшего понятия о том, что происходит, но я не вижу ничего плохого в моем коде, и тот факт, что это, кажется, из-за enumerate делает вещи еще более странными для меня.

Я не Новый способ использования enumerate, однако мне интересно: возможно ли, что это вызывает такое странное поведение?

EDIT 1.1 Я немного упростил пример

РЕДАКТИРОВАТЬ 1.2 Поведение происходит, даже если я удаляю enumerate. Просто кажется, что это «менее вероятно». Страннее и страннее для меня ...

РЕДАКТИРОВАТЬ 2 Поведение кажется (эти выводы кажутся очень убедительными) из-за scipy.stats.pearsonr(x,y). Кто-нибудь из экспертов по scipy знает почему?

EDIT 3 Вывод np.show_config следующий:

np.show_config()
blas_mkl_info:
  NOT AVAILABLE
blis_info:
  NOT AVAILABLE
openblas_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
blas_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
lapack_mkl_info:
  NOT AVAILABLE
openblas_lapack_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]
lapack_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    language = c
    define_macros = [('HAVE_CBLAS', None)]

Я лично игнорирую его значение.

1 Ответ

1 голос
/ 12 января 2020

SciPy использует NumPy, и SciPy и NumPy зависят от базовой библиотеки BLAS.

Из вывода numpy.show_config() мы видим, что ваша установка NumPy использует библиотека OpenBLAS . Чтобы изменить количество потоков, используемых OpenBLAS, измените переменную среды OPENBLAS_NUM_THREADS. Например, посмотрите, дает ли настройка OPENBLAS_NUM_THREADS=1 последовательное поведение.

Вы можете сделать это из скрипта Python с помощью

import os

os.environ['OPENBLAS_NUM_THREADS'] = 1

извне Python, это будет зависеть от ОС, которую вы используете. Например, в ОС Linux или Ma c, чтобы установить переменную среды только для выполняемой команды Python, вы можете использовать

$ OPENBLAS_NUM_THREADS=1 python myscript.py

Поиск «установки переменных среды» для получения дополнительной информации. .

Если настройка OPENBLAS_NUM_THREADS не работает, попробуйте установить OMP_NUM_THREADS=1.

Подробнее об этом читайте в https://github.com/xianyi/OpenBLAS/blob/develop/README.md#setting -the-number-of-thread-using Окружающая среда-переменные .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...