УНИТе

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

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

Съдържание:

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

 

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

SciPy е модул (библиотека) за Python 2.x и 3.x, позволяващ използването на числени методи и специални функции в Python, като разширение и надстройка на NumPy. Целта на този документ е да покаже как да бъде изграден този модул алтернативно (алтернативно на този, наличен в пакетните хранилища на CentOS 7 и 8), с цел постигане на висока производителност, чрез използване на компилаторите от пакета Intel Compilers.

Документът обхваща системната версия на 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 и свързване към MKL

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

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

Компилирането и инсталирането на SciPy става по следния начин:

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

    Създайте дирекория за разпакетиране и компилиране на кода. Изтеглете кода на SciPy (версия 1.2.2 е последната, която поддържа Python 2.7), разпакетирайте го и влезте в създадената след разпакетирането директория:

    $ mkdir ~/build
    $ cd ~/build
    $ wget https://github.com/scipy/scipy/archive/v1.2.2.tar.gz -O scipy-1.2.2.tar.gz
    $ tar xvf scipy-1.2.2.tar.gz
    $ cd scipy-1.2.2

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

    $ echo "[mkl]" > site.cfg
    $ echo "libraries = mkl_rt" >> site.cfg
    $ mkdir -p /usr/unite/python-2.7.5-scipy-1.2.2-icc/lib64/python2.7/site-packages
    $ PYTHONPATH=/usr/unite/python-2.7.5-scipy-1.2.2-icc/lib64/python2.7/site-packages:/usr/unite/python-2.7.5-numpy-1.16.1-icc/lib64/python2.7/site-packages:/usr/unite/python-2.7.5-Cython-0.29.14-icc/lib64/python2.7/site-packages CXX=icpc CC=icc FC=ifort F95=ifort F90=ifort F77=ifort PATH=/usr/unite/python-2.7.5-Cython-0.29.14-icc/bin:$PATH python setup.py install --prefix=/usr/unite/python-2.7.5-scipy-1.2.2-icc
  • python 2.7 (възможен за добавяне в CentOS 8):

    Създайте дирекория за разпакетиране и компилиране на кода. Изтеглете кода на SciPy (версия 1.2.2 е последната, която поддържа Python 2.7), разпакетирайте го и влезте в създадената след разпакетирането директория:

    $ mkdir ~/build
    $ cd ~/build
    $ wget https://github.com/scipy/scipy/archive/v1.2.2.tar.gz -O scipy-1.2.2.tar.gz
    $ tar xvf scipy-1.2.2.tar.gz
    $ cd scipy-1.2.2

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

    $ echo "[mkl]" > site.cfg
    $ echo "libraries = mkl_rt" >> site.cfg
    $ mkdir -p /usr/unite/python-2.7.15-scipy-1.2.2-icc/lib64/python2.7/site-packages
    $ PYTHONPATH=/usr/unite/python-2.7.15-scipy-1.2.2-icc/lib64/python2.7/site-packages:/usr/unite/python-2.7.15-numpy-1.16.1-icc/lib64/python2.7/site-packages:/usr/unite/python-2.7.15-Cython-0.29.14-icc/lib64/python2.7/site-packages CXX=icpc CC=icc FC=ifort F95=ifort F90=ifort F77=ifort PATH=/usr/unite/python-2.7.15-Cython-0.29.14-icc/bin:$PATH python setup.py install --prefix=/usr/unite/python-2.7.15-scipy-1.2.2-icc
  • rh-python 3.4 (инсталиран от пакетните хранилища на SCLo за CentOS 7):

    Създайте дирекория за разпакетиране и компилиране на кода. Изтеглете кода на SciPy (версия 1.2.2 е последната, която поддържа Python 3.4), разпакетирайте го и влезте в създадената след разпакетирането директория:

    $ mkdir ~/build
    $ cd ~/build
    $ wget https://github.com/scipy/scipy/archive/v1.2.2.tar.gz -O scipy-1.2.2.tar.gz
    $ tar xvf scipy-1.2.2.tar.gz
    $ cd scipy-1.2.2

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

    $ echo "[mkl]" > site.cfg
    $ echo "libraries = mkl_rt" >> site.cfg
    $ mkdir -p /usr/unite/rh-python34-scipy-1.2.2-icc/lib64/python3.4/site-packages
    $ PYTHONPATH=/usr/unite/rh-python34-scipy-1.2.2-icc/lib64/python3.4/site-packages:/usr/unite/rh-python34-numpy-1.16.5-icc/lib64/python3.4/site-packages:/usr/unite/rh-python34-Cython-0.29.14-icc/lib64/python3.4/site-packages CXX=icpc CC=icc FC=ifort F95=ifort F90=ifort F77=ifort python setup.py install --prefix=/usr/unite/rh-python34-scipy-1.2.2-icc
  • rh-python 3.5 (инсталиран от пакетните хранилища на SCLo за CentOS 7):

    Създайте дирекория за разпакетиране и компилиране на кода. Изтеглете кода на SciPy (версия 1.2.2 е последната, която поддържа Python 3.5), разпакетирайте го и влезте в създадената след разпакетирането директория:

    $ mkdir ~/build
    $ cd ~/build
    $ wget https://github.com/scipy/scipy/archive/v1.2.2.tar.gz -O scipy-1.2.2.tar.gz
    $ tar xvf scipy-1.2.0.tar.gz
    $ cd scipy-1.2.0

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

    $ echo "[mkl]" > site.cfg
    $ echo "libraries = mkl_rt" >> site.cfg
    $ mkdir -p /usr/unite/rh-python35-scipy-1.2.2-icc/lib64/python3.5/site-packages
    $ PYTHONPATH=/usr/unite/rh-python35-scipy-1.2.2-icc/lib64/python3.5/site-packages:/usr/unite/rh-python35-numpy-1.16.5-icc/lib64/python3.5/site-packages:/usr/unite/rh-python35-Cython-0.29.14-icc/lib64/python3.5/site-packages CXX=icpc CC=icc FC=ifort F95=ifort F90=ifort F77=ifort python setup.py install --prefix=/usr/unite/rh-python35-scipy-1.2.2-icc
  • rh-python 3.6 (инсталиран от пакетните хранилища на SCLo за CentOS 7):

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

    $ mkdir ~/build
    $ cd ~/build
    $ wget https://github.com/scipy/scipy/archive/v1.3.2.tar.gz -O scipy-1.3.2.tar.gz
    $ tar xvf scipy-1.3.2.tar.gz
    $ cd scipy-1.3.2

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

    $ echo "[mkl]" > site.cfg
    $ echo "libraries = mkl_rt" >> site.cfg
    $ mkdir -p /usr/unite/rh-python36-scipy-1.3.2-icc/lib64/python3.6/site-packages
    $ PYTHONPATH=/usr/unite/rh-python36-scipy-1.3.2-icc/lib64/python3.6/site-packages:/usr/unite/rh-python36-Cython-0.29.13-icc/lib64/python3.6/site-packages python setup.py config --compiler=intelem --fcompiler=intelem build_clib --compiler=intelem --fcompiler=intelem build_ext --compiler=intelem --fcompiler=intelem install --prefix=/usr/unite/rh-python36-scipy-1.3.2-icc
  • python 3.6 (системен за CentOS 8):

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

    $ mkdir ~/build
    $ cd ~/build
    $ wget https://github.com/scipy/scipy/archive/v1.3.2.tar.gz -O scipy-1.3.2.tar.gz
    $ tar xvf scipy-1.3.2.tar.gz
    $ cd scipy-1.3.2

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

    $ echo "[mkl]" > site.cfg
    $ echo "libraries = mkl_rt" >> site.cfg
    $ mkdir -p /usr/unite/python-3.6.8-scipy-1.3.2-icc/lib64/python3.6/site-packages
    $ PYTHONPATH=/usr/unite/python-3.6.8-scipy-1.3.2-icc/lib64/python3.6/site-packages:/usr/unite/python-3.6.8-Cython-0.29.14-icc/lib64/python3.6/site-packages:/usr/unite/python-3.6.8-numpy-1.17.2-icc/lib64/python3.6/site-packages python3 setup.py config --compiler=intelem --fcompiler=intelem build_clib --compiler=intelem --fcompiler=intelem build_ext --compiler=intelem --fcompiler=intelem install --prefix=/usr/unite/python-3.6.8-scipy-1.3.2-icc
  • python 3.8: (добавка за CentOS 8, ако се следва документа "Компилиране, инсталиране и използване на Python 3.8 под CentOS 8"):

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

    $ mkdir ~/build
    $ cd ~/build
    $ wget https://github.com/scipy/scipy/archive/v1.3.2.tar.gz -O scipy-1.3.2.tar.gz
    $ tar xvf scipy-1.3.2.tar.gz
    $ cd scipy-1.3.2

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

    $ echo "[mkl]" > site.cfg
    $ echo "libraries = mkl_rt" >> site.cfg
    $ mkdir -p /usr/unite/python-3.8.0-gcc-c8-scipy-1.3.2-icc/lib/python3.8/site-packages
    $ PYTHONPATH=/usr/unite/python-3.8.0-gcc-c8-scipy-1.3.2-icc/lib/python3.8/site-packages:/usr/unite/python-3.8.0-gcc-c8-Cython-0.29.14-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 setup.py config --compiler=intelem --fcompiler=intelem build_clib --compiler=intelem --fcompiler=intelem build_ext --compiler=intelem --fcompiler=intelem install --prefix=/usr/unite/python-3.8.0-gcc-c8-scipy-1.3.2-icc

 

3. Проверка дали модула scipy се зарежда успешно от Python

Проверката дали модула scipy се зарежда успешно от версията на Python, спрямо която е компилиран, може да стане по следния начин:

  • 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

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

    $ PYTHONPATH=/usr/unite/python-2.7.5-scipy-1.2.2-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 scipy; print(scipy.__path__[0])"

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

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

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

    $ PYTHONPATH=/usr/unite/python-2.7.5-scipy-1.2.2-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 scipy.version; print(scipy.version.version)"

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

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

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

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

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

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

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

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

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

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

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

    $ scl enable rh-python34 bash

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

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

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

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

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

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

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

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

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

    $ scl enable rh-python35 bash

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

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

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

    /usr/unite/rh-python35-numpy-1.2.2-icc/lib64/python3.5/site-packages/scipy-1.2.2-py3.5-linux-x86_64.egg/numpy

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

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

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

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

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

    $ scl enable rh-python36 bash

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

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

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

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

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

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

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

    1.3.2
  • 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-scipy-1.3.2-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 scipy; print(scipy.__path__[0])"

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

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

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

    $ PYTHONPATH=/usr/unite/python-3.6.8-scipy-1.3.2-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 scipy; print(scipy.version.full_version)"

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

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

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

    $ PYTHONPATH=/usr/unite/python-3.8.0-gcc-c8-scipy-1.3.2-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 scipy; print(scipy.__path__[0])"

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

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

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

    $ PYTHONPATH=/usr/unite/python-3.8.0-gcc-c8-scipy-1.3.2-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 scipy; print(scipy.version.full_version)"

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

    1.3.2

 


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

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