Предоставление аргументов NumPy site.cfg в pip
Я использую NumPy, созданный на основе библиотеки Intel Math Kernel Library. Я использую virtualenv и обычно использую pip для установки пакетов.
Однако, чтобы NumPy мог найти библиотеки MKL, необходимо создать файл site.cfg в исходном каталоге NumPy до его компиляции, а затем вручную собрать и установить. Я мог бы написать весь этот процесс, но я надеялся на более простое решение.
У меня есть стандартный файл site.cfg, который можно использовать для этой цели под контролем версий. Есть ли какие-либо параметры командной строки pip, которые скажут ему скопировать определенный файл в исходный каталог перед сборкой пакета?
В качестве альтернативы, есть ли переменные окружения, которые можно установить вместо указания путей к библиотекам в файле site.cfg? Вот файл site.cfg, который я использую. Он был почти дословно взят с сайта Intel.
[mkl]
library_dirs = /opt/intel/composer_xe_2013.1.117/mkl/lib/intel64
include_dirs = /opt/intel/composer_xe_2013.1.117/mkl/include
mkl_libs = mkl_rt
lapack_libs =
Для справки я использую Ubuntu, Python 2.7 и NumPy 1.6.
2 ответа
Из источника ( https://github.com/numpy/numpy/blob/master/site.cfg.example):
Для облегчения автоматической установки, такой как easy_install, домашний каталог пользователя также будет проверен на наличие файла ~ /.numpy-site.cfg.
Это работоспособное решение? Вам по-прежнему нужно предварительно загружать домашние каталоги с глобальным.numpy-site.cfg, но вам не нужно будет копаться в сборке или установке после этого.
Я закончил тем, что собрал скрипт, чтобы автоматизировать это. Вот оно, в случае, если это может помочь кому-то еще. Я протестировал его в Python 2.7, но он должен работать в другом месте без значительных изменений.
from __future__ import unicode_literals
import io
import os.path
import re
import subprocess
import urllib2
# This downloads, builds, and installs NumPy against the MKL in the
# currently active virtualenv
file_name = 'numpy-1.6.2.tar.gz'
url = ('http://sourceforge.net/projects/numpy/files/NumPy/1.6.2/'
'numpy-1.6.2.tar.gz/download')
def main():
# download NumPy and unpack it
file_data = urllib2.urlopen(url).read()
with io.open(file_name, 'wb') as fobj:
fobj.write(file_data)
subprocess.check_call('tar -xvf {0}'.format(file_name), shell=True)
base_name = re.search(r'(.*)\.tar\.gz$', file_name).group(1)
os.chdir(base_name)
# write out a site.cfg file in the build directory
site_cfg = (
'[mkl]\n'
'library_dirs = /opt/intel/composer_xe_2013.1.117/mkl/lib/intel64\n'
'include_dirs = /opt/intel/composer_xe_2013.1.117/mkl/include\n'
'mkl_libs = mkl_rt\n'
'lapack_libs =\n')
with io.open('site.cfg', 'wt', encoding='UTF-8') as fobj:
fobj.write(site_cfg)
# build and install NumPy
subprocess.check_call('python setup.py build', shell=True)
subprocess.check_call('python setup.py install', shell=True)
if __name__ == '__main__':
main()
Ваша цель установки NumPy для использования Math Kernel Library от Intel теперь намного проще, так как Intel создала пипсы для установки MKL + NumPy:
pip uninstall numpy -y # if the standard numpy is present
pip install intel-numpy
так же как intel-scipy
, intel-scikit-learn
, pydaal
, tbb4py
, mkl_fft
, mkl_random
и пакеты нижнего уровня, если вам нужны только они. Опять же, вы должны сначала удалить стандартные пакеты, если они уже установлены в вашем virtualenv.
НОТА:
Если стандартные пакеты NumPy, SciPy и Scikit-Learn уже установлены, пакеты должны быть удалены перед установкой вариантов этих пакетов Intel® (intel-numpy и т. Д.), Чтобы избежать конфликтов. Как упоминалось ранее, pydaal использует intel-numpy, поэтому важно сначала удалить стандартную библиотеку Numpy (если она установлена), а затем установить pydaal.
На ваш вопрос о том, как настроить NumPy (например, использовать OpenBLAS):
- Загрузить https://github.com/numpy/numpy/blob/master/site.cfg.example
- Отредактируйте соответствующие строки, например
[openblas]
libraries = openblas
library_dirs = /opt/OpenBLAS/lib
include_dirs = /opt/OpenBLAS/include
- Сохранить как
~/.numpy-site.cfg
Установить NumPy из источника без загрузки вручную (
--force-reinstall
позволит ему заменить существующий пакет):pip install numpy --no-binary numpy --force-reinstall
Бонус: тот же файл
~/.numpy-site.cfg
работает для установки scipy на OpenBLAS:pip install scipy --no-binary scipy
или установите их вместе:
pip install numpy scipy --no-binary numpy,scipy --force-reinstall