УНИТе

Портал > Документация > Компилиране, инсталиране и използване на оптимизирана версия на Numexpr за Python под CentOS 7 и 8

Компилиране, инсталиране и използване на оптимизирана версия на Numexpr за Python под CentOS 7 и 8

Съдържание:

  1. Предварителна информация
  2. Изтегляне на изходния код и компилирането му с Intel Compilers
  3. Зареждане на модула numexpr в Python

 

1. Предварителна информация

Numexpr (съкратено от "Numerical Expressions") е модул-калкулатор за числено пресмятане на формули, зададени в текстов вид. Този модул е разширение на NumPy. Целта на този документ е да покаже как да бъде изграден този модул алтернативно (алтернативно на този, наличен в пакетните хранилища на CentOS 7), с цел постигна на висока производителност, чрез използване на компилаторите от пакета Intel Compilers и библиотеката Math Kernel Library (MKL).

Документът обхваща системната версия на Python (за CentOS 7 това е 2.7, докато в CentOS 8 това е 3.6) и версии на Python 3.x за CentOS 7, предоставяни от пакетното хранилище SCLo. Добавена е и поддръжка за Python 3.8, компилиран и инсталиран съгласно документа "Компилиране, инсталиране и използване на Python 3.8 под CentOS 8".

 

2. Изтегляне на изходния код и компилирането му с Intel Compilers

За да може да изпълните процедурата по компилация и инсталация посочена по-долу, трябва да имате достъп до компилаторите и библиотеките от Intel Compilers и до версията на NumPy, компилирана и инсталирана съгласно инструкциите в "Компилиране, инсталиране и използване на оптимизирана версия на NumPy за Python под CentOS 7 и 8".

Програмният код на Numexpr може да бъде изтеглен от следния адрес (архива с кода е най-долу на страницата, а файла е с разширение "tar.gz"):

https://pypi.org/project/numexpr/#files

Създайте дирекория за разпакетиране и компилиране на кода. Изтеглете кода на Numexpr (по-долу за пример е използвана версия 2.7.0, а по времето, по което вие ще изпълнявате тази процедура, версията най-вероятно ще е по-висока), разпакетирайте го и влезте в създадената след разпакетирането директория:

$ mkdir ~/build
$ cd ~/build
$ wget https://files.pythonhosted.org/packages/87/91/9e6305ec0f0560bf2c3730ad0b5ff3c8d6b48b442a830ff506bc6c829ac0/numexpr-2.7.0.tar.gz
$ tar xvf numexpr-2.7.0.tar.gz
$ cd numexpr-2.7.0

и стартирайте процеса на компилиране и инсталиране на кода:

  • python 2.7 (системен за CentOS 7):

    $ mkdir -p /usr/unite/python-2.7.5-numexpr-2.7.0-icc/lib64/python2.7/site-packages
    $ PYTHONPATH=/usr/unite/python-2.7.5-numexpr-2.7.0-icc/lib64/python2.7/site-packages:/usr/unite/python-2.7.5-numpy-1.16.1-icc/lib64/python2.7/site-packages CC=icc CXX=icpc python setup.py install --prefix="/usr/unite/bin/python-2.7.5-numexpr-2.7.0-icc"
  • python 2.7 (възможен за добавяне в CentOS 8):

    $ mkdir -p /usr/unite/python-2.7.15-numexpr-2.7.0-icc/lib64/python2.7/site-packages
    $ PYTHONPATH=/usr/unite/python-2.7.15-numexpr-2.7.0-icc/lib64/python2.7/site-packages:/usr/unite/python-2.7.15-numpy-1.16.1-icc/lib64/python2.7/site-packages LDFLAGS="-lirc" CXX=icpc CC=icc python2 setup.py install --prefix=/usr/unite/python-2.7.15-numexpr-2.7.0-icc
    
  • rh-python 3.4 (инсталиран от пакетните хранилища на SCLo за CentOS 7):

    $ scl enable rh-python34 bash
    $ mkdir -p /usr/unite/rh-python34-numexpr-2.7.0-icc/lib64/python3.4/site-packages
    $ PYTHONPATH=/usr/unite/rh-python34-numexpr-2.7.0-icc/lib64/python3.4/site-packages:/usr/unite/rh-python34-numpy-1.16.5-icc/lib64/python3.4/site-packages CC=icc CXX=icpc python setup.py install --prefix="/usr/unite/bin/rh-python34-numexpr-2.7.0-icc"
  • rh-python 3.5 (инсталиран от пакетните хранилища на SCLo за CentOS 7):

    $ scl enable rh-python35 bash
    $ mkdir -p /usr/unite/rh-python35-numexpr-2.7.0-icc/lib64/python3.4/site-packages
    $ PYTHONPATH=/usr/unite/rh-python35-numexpr-2.7.0-icc/lib64/python3.4/site-packages:/usr/unite/rh-python35-numpy-1.16.5-icc/lib64/python3.5/site-packages CC=icc CXX=icpc python setup.py install --prefix="/usr/unite/bin/rh-python35-numexpr-2.7.0-icc"
  • rh-python 3.6 (инсталиран от пакетните хранилища на SCLo за CentOS 7):

    $ scl enable rh-python36 bash
    $ mkdir -p /usr/unite/rh-python36-numexpr-2.7.0-icc/lib64/python3.6/site-packages
    $ PYTHONPATH=/usr/unite/rh-python36-numexpr-2.7.0-icc/lib64/python3.6/site-packages:/usr/unite/rh-python36-numpy-1.17.2-icc/lib64/python3.6/site-packages CC=icc CXX=icpc python setup.py install --prefix="/usr/unite/bin/rh-python36-numexpr-2.7.0-icc"
  • python 3.6 (системен за CentOS 8):

    mkdir -p /usr/unite/python-3.6.8-numexpr-2.7.0-icc/lib64/python3.6/site-packages
    $ PYTHONPATH=/usr/unite/python-3.6.8-numexpr-2.7.0-icc/lib64/python3.6/site-packages:/usr/unite/python-3.6.8-numpy-1.17.2-icc/lib64/python3.6/site-packages LDFLAGS="-lirc" CXX=icpc CC=icc python3 setup.py install --prefix=/usr/unite/python-3.6.8-numexpr-2.7.0-icc
  • python 3.8 (добавка за CentOS 8, ако се следва документа "Компилиране, инсталиране и използване на Python 3.8 под CentOS 8"):

    $ mkdir -p /usr/unite/python-3.8.0-gcc-c8-numexpr-2.7.0-icc/lib/python3.8/site-packages
    $ PYTHONPATH=/usr/unite/python-3.8.0-gcc-c8-numexpr-2.7.0-icc/lib/python3.8/site-packages:/usr/unite/python-3.8.0-gcc-c8-numpy-1.17.2-icc/lib/python3.8/site-packages LDFLAGS="-lirc" CXX=icpc CC=icc PATH=/usr/unite/python-3.8.0-gcc-c8/bin:$PATH LD_LIBRARY_PATH=/usr/unite/python-3.8.0-gcc-c8/lib:$LD_LIBRARY_PATH python3 setup.py install --prefix=/usr/unite/python-3.8.0-gcc-c8-numexpr-2.7.0-icc

 

3. Зареждане на модула numexpr в Python

Зареждането на модула numexpr, компилиран по описанието по-горе, става по следни начин:

  • python 2.7 (системен за CentOS 7):

    В началото, проверете дали наистина използвате системния за CentOS 7 пакет Python 2.7:

    $ rpm -qf `which python`

    Ако текущия за bash сесията интерпретатор python е системния, ще получите следния резултат (възможно е във вашия случай числото след 2.7.5 във версията на пакета, да е различно от 86):

    python-2.7.5-86.el7.x86_64

    В случай, че наистина получите горния резултат, то може да проверите дали зареждането на модула numexpr става успешно:

    $ PYTHONPATH=/usr/unite/python-2.7.5-numexpr-2.7.0-icc/lib64/python2.7/site-packages:/usr/unite/python-2.7.5-numpy-1.16.1-icc/lib64/python2.7/site-packages python -c "import numexpr; print(numexpr.__path__[0])"

    Трябва да получите като резултат пътя до модула, който съдържа директорията, която е зададена първа PYTHONPATH (оцветена е в жълто в примерния резултат по-долу):

    /usr/unite/python-2.7.5-numexpr-2.7.0-icc/lib64/python2.7/site-packages/numexpr-2.7.0-py2.7-linux-x86_64.egg/numexpr

    Още едно ниво на проверка е да изведете версията на модула:

    $ PYTHONPATH=/usr/unite/python-2.7.5-numexpr-2.7.0-icc/lib64/python2.7/site-packages:/usr/unite/python-2.7.5-numpy-1.16.1-icc/lib64/python2.7/site-packages python -c "import numexpr.version; print(numexpr.version.version)"

    Трябва да получите номера на версията, който сте инсталирали преди това:

    2.7.0
  • python 2.7 (възможен за добавяне в CentOS 8):

    Първото ниво за проверка е дали зареждането на модула numexpr става успешно:

    $ PYTHONPATH=/usr/unite/python-2.7.15-numexpr-2.7.0-icc/lib64/python2.7/site-packages:/usr/unite/python-2.7.15-numpy-1.16.1-icc/lib64/python2.7/site-packages2 python2 -c "import numexpr; print(numexpr.__path__[0])"

    Трябва да получите като резултат пътя до модула, който съдържа директорията, която е зададена първа PYTHONPATH (оцветена е в жълто в примерния резултат по-долу):

    /usr/unite/python-2.7.15-numexpr-2.7.0-icc/lib64/python2.7/site-packages/numexpr-2.7.0-py2.7-linux-x86_64.egg/numexpr

    Още едно ниво на проверка е да изведете версията на модула:

    $ PYTHONPATH=/usr/unite/python-2.7.15-numexpr-2.7.0-icc/lib64/python2.7/site-packages:/usr/unite/python-2.7.15-numpy-1.16.1-icc/lib64/python2.7/site-packages2 python2 -c "import numexpr.version; print(numexpr.version.version)"

    Трябва да получите номера на версията, който сте инсталирали преди това:

    2.7.0
  • rh-python 3.4: (инсталиран от пакетните хранилища на SCLo за CentOS 7):

    Заредете (ако не сте го направили вече), променливите на средата, осигуряващи използването на интерпретатора python от пакетната колекция rh-python 3.4:

    $ scl enable rh-python34 bash

    В случай, че не получите съобщение за грешка, може да пристъпите към проверка дали зареждането на модула numexpr става успешно:

    $ PYTHONPATH=/usr/unite/rh-python34-numexpr-2.7.0-icc/lib64/python3.4/site-packages:/usr/unite/rh-python34-numpy-1.16.5-icc/lib64/python3.4/site-packages python -c "import numexpr; print(numexpr.__path__[0])"

    Трябва да получите като резултат пътя до модула, който съдържа директорията, която е зададена първа в PYTHONPATH (оцветена е в жълто в примерния резултат по-долу):

    /usr/unite/rh-python34-numexpr-2.7.0-icc/lib64/python3.4/site-packages/numexpr-2.7.0-py3.4-linux-x86_64.egg/numexpr

    Още едно ниво на проверка е да изведете версията на модула:

    $ PYTHONPATH=/usr/unite/rh-python34-numexpr-2.7.0-icc/lib64/python3.4/site-packages:/usr/unite/rh-python34-numpy-1.16.5-icc/lib64/python3.4/site-packages -c "import numexpr.version; print(numexpr.version.version)"

    Трябва да получите номера на версията, който сте инсталирали преди това:

    2.7.0
  • rh-python 3.5: (инсталиран от пакетните хранилища на SCLo за CentOS 7):

    Заредете (ако не сте го направили вече), променливите на средата, осигуряващи използването на интерпретатора python от пакетната колекция rh-python 3.5:

    $ scl enable rh-python35 bash

    В случай, че не получите съобщение за грешка, може да пристъпите към проверка дали зареждането на модула numexpr става успешно:

    $ PYTHONPATH=/usr/unite/rh-python35-numexpr-2.7.0-icc/lib64/python3.5/site-packages:/usr/unite/rh-python35-numpy-1.16.5-icc/lib64/python3.5/site-packages python -c "import numexpr; print(numexpr.__path__[0])"

    Трябва да получите като резултат пътя до модула, който съдържа директорията, която е зададена първа в PYTHONPATH (оцветена е в жълто в примерния резултат по-долу):

    /usr/unite/rh-python35-numexpr-2.7.0-icc/lib64/python3.5/site-packages/numexpr-2.7.0-py3.5-linux-x86_64.egg/numexpr

    Още едно ниво на проверка е да изведете версията на модула:

    $ PYTHONPATH=/usr/unite/rh-python35-numexpr-2.7.0-icc/lib64/python3.5/site-packages:/usr/unite/rh-python35-numpy-1.16.5-icc/lib64/python3.5/site-packages -c "import numexpr.version; print(numexpr.version.version)"

    Трябва да получите номера на версията, който сте инсталирали преди това:

    2.7.0
  • rh-python 3.6: (инсталиран от пакетните хранилища на SCLo за CentOS 7):

    Заредете (ако не сте го направили вече), променливите на средата, осигуряващи използването на интерпретатора python от пакетната колекция rh-python 3.6:

    $ scl enable rh-python36 bash

    В случай, че не получите съобщение за грешка, може да пристъпите към проверка дали зареждането на модула numexpr става успешно:

    $ PYTHONPATH=/usr/unite/rh-python36-numexpr-2.7.0-icc/lib64/python3.6/site-packages:/usr/unite/rh-python36-numpy-1.17.2-icc/lib64/python3.6/site-packages python -c "import numexpr; print(numexpr.__path__[0])"

    Трябва да получите като резултат пътя до модула, който съдържа директорията, която е зададена първа в PYTHONPATH (оцветена е в жълто в примерния резултат по-долу):

    /usr/unite/rh-python36-numexpr-2.7.0-icc/lib64/python3.6/site-packages/numexpr-2.7.0-py3.6-linux-x86_64.egg/numexpr

    Още едно ниво на проверка е да изведете версията на модула:

    $ PYTHONPATH=/usr/unite/rh-python36-numexpr-2.7.0-icc/lib64/python3.6/site-packages:/usr/unite/rh-python36-numpy-1.17.2-icc/lib64/python3.6/site-packages -c "import numexpr.version; print(numexpr.version.version)"

    Трябва да получите номера на версията, който сте инсталирали преди това:

    2.7.0
  • python 3.6 (системен за CentOS 8):

    В началото, проверете дали наистина използвате системния за CentOS 8 пакет Python36:

    $ rpm -qf `which python3`

    Ако текущият за bash сесията интерпретатор python3 е системния, ще получите следния резултат (възможно е във вашия случай числото след 3.6.8 във версията на пакета, да е различно от -2.module_el8.0.0+33+0a10c0e1.x86_64):

    python36-3.6.8-2.module_el8.0.0+33+0a10c0e1.x86_64

    В случай, че наистина получите горния резултат, то може да проверите дали зареждането на модула numpy става успешно:

    $ PYTHONPATH=/usr/unite/python-3.6.8-numexpr-2.7.0-icc/lib64/python3.6/site-packages:/usr/unite/python-3.6.8-numpy-1.17.2-icc/lib64/python3.6/site-packages python3 -c "import numexpr; print(numexpr.__path__[0])"

    Трябва да получите като резултат пътя до модула, който съдържа директорията, която е зададена като стойност на PYTHONPATH (оцветена е в жълто в примерния резултат по-долу):

    /usr/unite/python-3.6.8-numexpr-2.7.0-icc/lib64/python3.6/site-packages/numexpr-2.7.0-py3.6-linux-x86_64.egg/numexpr

    Още едно ниво на проверка е да изведете версията на модула:

    $ PYTHONPATH=/usr/unite/python-3.6.8-numexpr-2.7.0-icc/lib64/python3.6/site-packages:/usr/unite/python-3.6.8-numpy-1.17.2-icc/lib64/python3.6/site-packages python3 -c "import numexpr; print(numexpr.version.version)"

    Трябва да получите номера на версията, която сте инсталирали преди това:

    2.7.0
  • python 3.8: (добавка за CentOS 8, ако се следва документа "Компилиране, инсталиране и използване на Python 3.8 под CentOS 8"):

    Първото ниво на проверка е да изведете пътя до модула върху файловата система:

    $ PYTHONPATH=/usr/unite/python-3.8.0-gcc-c8-numexpr-2.7.0-icc/lib/python3.8/site-packages:/usr/unite/python-3.8.0-gcc-c8-numpy-1.17.2-icc/lib/python3.8/site-packages PATH=/usr/unite/python-3.8.0-gcc-c8/bin:$PATH LD_LIBRARY_PATH=/usr/unite/python-3.8.0-gcc-c8/lib:$LD_LIBRARY_PATH python3 -c "import numexpr; print(numexpr.__path__[0])"

    Трябва да получите като резултат пътя, който съдържа директорията, която е зададена като стойност на PYTHONPATH (оцветена е в жълто в примерния резултат по-долу):

    /usr/unite/python-3.8.0-gcc-c8-numexpr-2.7.0-icc/lib/python3.8/site-packages/numexpr-2.7.0-py3.8-linux-x86_64.egg/numexpr

    Още едно ниво на проверка е да изведете версията на модула:

    $ PYTHONPATH=/usr/unite/python-3.8.0-gcc-c8-numexpr-2.7.0-icc/lib/python3.8/site-packages:/usr/unite/python-3.8.0-gcc-c8-numpy-1.17.2-icc/lib/python3.8/site-packages PATH=/usr/unite/python-3.8.0-gcc-c8/bin:$PATH LD_LIBRARY_PATH=/usr/unite/python-3.8.0-gcc-c8/lib:$LD_LIBRARY_PATH python3 -c "import numexpr; print(numexpr.version.version)"

    Трябва да получите номера на версията, която сте инсталирали преди това:

    2.7.0

 


Последна актуализация: 29 октомври 2019

2019 УНИТе, Веселин Колев