Numpy SVD, похоже, распараллеливается в Mac OSX, но не на моей виртуальной машине Ubuntu.

Я хочу запустить следующий скрипт:

#python imports
import time

#3rd party imports
import numpy as np
import pandas as pd

def pd_svd(pd_dataframe):
    np_dataframe = pd_dataframe.values
    return np.linalg.svd(pd_dataframe)

if __name__ == '__main__':
    li_times = []
    for i in range(1, 3):
        start = time.time()
        pd_dataframe = pd.DataFrame(np.random.random((3000, 252 * i)))
        pd_svd(pd_dataframe)
        li_times.append(str(time.time() - start))
    print li_times

Я попробовал это на своем Macbook Air 2011 с OSX 10.9.4 и на 16-ядерной облачной виртуальной машине под управлением Ubuntu 12.0.4. По какой-то причине это занимает примерно 4 секунды на моем Macbook Air и около 15 секунд на моей виртуальной машине. Я проверил процессы, используя top, и оказалось, что на моей виртуальной машине Ubuntu он не использует параллелизм, а на моем Macbook Air — использует.

Ниже приведен результат моего топа на MBA:

введите здесь описание изображения

А вот на моей виртуальной машине Ubuntu:

введите здесь описание изображения

Есть идеи, почему мой Macbook Air намного быстрее для SVD? В частности, при сравнении numpy облачная виртуальная машина была НАМНОГО быстрее и, похоже, использовала параллелизм (не делала top, но была в несколько раз быстрее).

Редактировать:

Вот вывод np.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

person mlstudent    schedule 17.08.2014    source источник
comment
Версия numpy в вашей облачной виртуальной машине, вероятно, не связана с многопоточной библиотекой BLAS. Каков результат np.show_config()?   -  person ali_m    schedule 17.08.2014
comment
Привет, спасибо за помощь. Я обновил его.   -  person mlstudent    schedule 17.08.2014


Ответы (1)


Я подозреваю, что версия numpy на вашей облачной виртуальной машине связана только с эталонной библиотекой CBLAS (*/usr/lib/libblas/libblas.so.3.0). Это однопоточный и намного медленнее, чем другие оптимизированные реализации BLAS, такие как OpenBLAS и ATLAS.

Вы можете подтвердить это, используя ldd, чтобы проверить, какие библиотеки динамически связаны с numpy во время выполнения:

~$ ldd /usr/lib/python2.7/dist-packages/numpy/core/_dotblas.so

Вероятно, вы увидите такую ​​строку:

...
libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f98445e3000)
...

/usr/lib/libblas.so.3 — это символическая ссылка. Если вы проследуете по цепочке ссылок, используя readlink, вы, вероятно, увидите что-то вроде этого:

~$ readlink -f /usr/lib/libblas.so.3
/usr/lib/libblas/libblas.so.3.0

Это медленная однопоточная библиотека CBLAS. Предполагая, что у вас есть root-доступ, самым простым решением, вероятно, будет установка OpenBLAS через apt-get:

~$ sudo apt-get install libopenblas-base libopenblas-dev

Когда я установил этот пакет на свой сервер, он обновил символическую ссылку /usr/lib/libblas.so.3, чтобы она указывала на библиотеку OpenBLAS, а не на CBLAS:

~$ readlink -f /usr/lib/libblas.so.3
/usr/lib/openblas-base/libblas.so.3

Надеюсь, этого будет достаточно, чтобы вы могли работать с более быстрой библиотекой BLAS.

Если по какой-либо причине вы не можете решить эту проблему с помощью apt-get, я ранее написал несколько инструкций по сборке numpy и OpenBLAS из исходного кода , который вы можете найти здесь. Я также написал несколько инструкций здесь для ручной символической ссылки на другую библиотеку BLAS с помощью update-alternatives.


* Пути, на которые я ссылаюсь в своем ответе, являются значениями по умолчанию для сервера под управлением Ubuntu 14.10, где я установил numpy, используя apt-get. Они могут немного отличаться в зависимости от вашей версии Ubuntu и способа установки numpy.

person ali_m    schedule 17.08.2014
comment
Не удается получить архитектуру, когда я использую apt-get, а затем пытаюсь импортировать numpy (GotoBLAS: Ошибка инициализации архитектуры. Функция инициализации не найдена.), И когда я пытаюсь собрать ее из исходного кода через cd OpenBLAS && make FC=gfortran ( getarch_2nd.c:12:35: ошибка: 'SGEMM_DEFAULT_UNROLL_M' необъявлено (первое использование в этой функции)) - person mlstudent; 17.08.2014
comment
Хм, похоже, у него проблемы с определением архитектуры ЦП из-за аппаратной виртуализации. Я никогда не пробовал компилировать OpenBLAS внутри виртуальной машины, но я думаю, что вы сможете заставить его работать, задав целевую архитектуру во время компиляции с помощью переменной среды TARGET= (см. здесь). Вы должны определить целевую архитектуру, взглянув на less /proc/cpuinfo. - person ali_m; 17.08.2014
comment
Ваш анализ был полностью правильным. Это не работало на виртуальной машине, которую я использовал, поэтому я использовал другую виртуальную машину с более новой версией Ubuntu (14.04), и это сработало. Я принимаю. - person mlstudent; 19.08.2014
comment
@AlexanderMoreno Круто, рад, что тебе удалось это исправить. Для будущих читателей было бы неплохо, если бы вы упомянули, какая виртуальная машина доставляла вам проблемы. - person ali_m; 19.08.2014