УНИТе

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

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

Съдържание:

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

 

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

H5py е модул (библиотека) за Python 2.x и 3.x, позволяващ използването на HDF5 в Python. Целта на този документ е да покаже как да бъде изграден този модул алтернативно (алтернативно на този, наличен в пакетните хранилища на 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

За да можете да компилирате кода на h5py вие трябва да сте изпълнили успешно инструкциите в следните документи и да разполагате с достъп до продукта на компилацията:

ВНИМАНИЕ! Модулът h5py ще използва тази библиотека libhdf5.so, която може да намери първа!

Последното означава, че е възможно задавайки различни стойности на променливата на средата LD_LIBRARY_PATH да накарате модула h5py да зарежда една или друга версия на библиотеката.

Трябва да разполагате и с достъп до mpiicc - MPI версията на C-компилатора от пакета Intel Compilers.

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

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

Създайте дирекория за разпакетиране и компилиране на кода. Изтеглете кода на h5py, разпакетирайте го и влезте в създадената след разпакетирането директория:

$ mkdir ~/build
$ cd ~/build
$ wget https://files.pythonhosted.org/packages/5f/97/a58afbcf40e8abecededd9512978b4e4915374e5b80049af082f49cebe9a/h5py-2.10.0.tar.gz
$ tar xvf h5py-2.10.0.tar.gz
$ cd h5py-2.10.0

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

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

    $ mkdir -p /usr/unite/python2.7-h5py-2.10.0-mpi-icc/lib64/python2.7/site-packages
    $ HDF5_MPI=ON HDF5_DIR=/usr/unite/hdf5-1.10.5-mpi-icc PYTHONPATH=/usr/unite/python2.7-h5py-2.10.0-mpi-icc/lib64/python2.7/site-packages:/usr/unite/python2.7-mpi4py-3.0.3-icc/lib64/python2.7/site-packages:/usr/unite/python2.7-numpy-1.16.1-icc/lib64/python2.7/site-packages:/usr/unite/python2.7-Cython-0.29.13-icc/lib64/python2.7/site-packages CC=mpiicc python setup.py install --prefix="/usr/unite/python2.7-h5py-2.10.0-mpi-icc"
  • python 2.7 (възможен за добавяне в CentOS 8):

    $ sudo dnf install python2-six
    $ mkdir -p /usr/unite/python-2.7.15-h5py-2.10.0-icc-mpi/lib64/python2.7/site-packages
    $ HDF5_MPI=ON HDF5_DIR=/usr/unite/hdf5-1.10.5-icc-mpi PYTHONPATH=/usr/unite/python-2.7.15-h5py-2.10.0-icc-mpi/lib64/python2.7/site-packages:/usr/unite/python-2.7.15-mpi4py-3.0.3-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 CC=mpiicc python2 setup.py install --prefix="/usr/unite/python-2.7.15-h5py-2.10.0-icc-mpi"
  • rh-python 3.4: (инсталиран от пакетните хранилища на SCLo за CentOS 7):

    $ mkdir -p mkdir -p /usr/unite/rh-python34-h5py-2.10.0-mpi-icc/lib64/python3.4/site-packages
    $ HDF5_MPI=ON HDF5_DIR=/usr/unite/hdf5-1.10.5-mpi-icc PYTHONPATH=/usr/unite/rh-python34-h5py-2.10.0-mpi-icc/lib64/python3.4/site-packages:/usr/unite/rh-python34-mpi4py-3.0.3-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.13-icc/lib64/python3.4/site-packages CC=mpiicc python setup.py install --prefix="/usr/unite/rh-python34-h5py-2.10.0-mpi-icc"
  • rh-python 3.5: (инсталиран от пакетните хранилища на SCLo за CentOS 7):

    $ mkdir -p mkdir -p /usr/unite/rh-python35-h5py-2.10.0-mpi-icc/lib64/python3.5/site-packages
    $ HDF5_MPI=ON HDF5_DIR=/usr/unite/hdf5-1.10.5-mpi-icc PYTHONPATH=/usr/unite/rh-python35-h5py-2.10.0-mpi-icc/lib64/python3.5/site-packages:/usr/unite/rh-python35-mpi4py-3.0.3-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.13-icc/lib64/python3.5/site-packages CC=mpiicc python setup.py install --prefix="/usr/unite/rh-python35-h5py-2.10.0-mpi-icc"
  • rh-python 3.6: (инсталиран от пакетните хранилища на SCLo за CentOS 7):

    $ mkdir -p mkdir -p /usr/unite/rh-python36-h5py-2.10.0-mpi-icc/lib64/python3.6/site-packages
    $ HDF5_MPI=ON HDF5_DIR=/usr/unite/hdf5-1.10.5-mpi-icc PYTHONPATH=/usr/unite/rh-python36-h5py-2.10.0-mpi-icc/lib64/python3.6/site-packages:/usr/unite/rh-python36-mpi4py-3.0.3-icc/lib64/python3.6/site-packages:/usr/unite/rh-python36-numpy-1.17.2-icc/lib64/python3.6/site-packages:/usr/unite/rh-python36-Cython-0.29.13-icc/lib64/python3.6/site-packages CC=mpiicc python setup.py install --prefix="/usr/unite/rh-python36-h5py-2.10.0-mpi-icc"
  • python 3.6 (системен за CentOS 8):

    $ mkdir -p /usr/unite/python-3.6.8-h5py-2.10.0-mpi-icc/lib64/python3.6/site-packages
    $ HDF5_MPI=ON HDF5_DIR=/usr/unite/hdf5-1.10.5-mpi-icc PYTHONPATH=/usr/unite/python-3.6.8-h5py-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:/usr/unite/python-3.6.8-mpi4py-3.0.3-icc/lib64/python3.6/site-packages python3 setup.py CC=mpiicc python setup.py install --prefix="/usr/unite/python2.7-h5py-2.10.0-mpi-icc"
  • python 3.8: (добавка за CentOS 8, ако се следва документа "Компилиране, инсталиране и използване на Python 3.8 под CentOS 8"):

    $ mkdir -p /usr/unite/python-3.8.0-gcc-c8-h5py-2.10.0-mpi-icc/lib/python3.8/site-packages
    $ HDF5_MPI=ON HDF5_DIR=/usr/unite/hdf5-1.10.5-mpi-icc PYTHONPATH=/usr/unite/python-3.8.0-gcc-c8-h5py-2.10.0-mpi-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:/usr/unite/python-3.8.0-gcc-c8-mpi4py-3.0.3-icc/lib64/python3.6/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 CC=mpiicc python setup.py install --prefix=/usr/unite/python-3.8.0-gcc-c8-h5py-2.10.0-mpi-icc

 

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

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

  • 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

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

    $ LD_LIBRARY_PATH=/usr/unite/hdf5-1.10.5-icc-mpi/lib:$LD_LIBRARY_PATH PYTHONPATH=/usr/unite/python-2.7.5-h5py-2.10.0-icc-mpi/lib64/python2.7/site-packages:/usr/unite/python-2.7.15-mpi4py-3.0.3-icc/lib64/python2.7/site-packages python2 -c "import h5py; print(h5py.__path__[0])"

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

    /usr/unite/python-2.7.5-h5py-2.10.0-icc-mpi/lib64/python2.7/site-packages/h5py-2.10.0-py2.7-linux-x86_64.egg/h5py

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

    $ LD_LIBRARY_PATH=/usr/unite/hdf5-1.10.5-icc-mpi/lib:$LD_LIBRARY_PATH PYTHONPATH=/usr/unite/python2.7-h5py-2.10.0-mpi-icc/lib64/python2.7/site-packages:/usr/unite/python2.7-mpi4py-3.0.3-icc/lib64/python2.7/site-packages python -c "import h5py.version; print(h5py.version.version)"

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

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

    За да проверите дали зареждате правилния модул h5py, изведете пътя до него:

    source /opt/intel/compilers_and_libraries/linux/bin/compilervars.sh intel64
    $ LD_LIBRARY_PATH=/usr/unite/hdf5-1.10.5-icc-mpi/lib:$LD_LIBRARY_PATH PYTHONPATH=/usr/unite/python-2.7.15-h5py-2.10.0-icc-mpi/lib64/python2.7/site-packages:/usr/unite/python-2.7.15-mpi4py-3.0.3-icc/lib64/python2.7/site-packages python2 -c "import h5py; print(h5py.__path__[0])"

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

    /usr/unite/python-2.7.15-h5py-2.10.0-mpi-icc/lib64/python2.7/site-packages/h5py-2.10.0-py2.7-linux-x86_64.egg/h5py

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

    source /opt/intel/compilers_and_libraries/linux/bin/compilervars.sh intel64
    $ LD_LIBRARY_PATH=/usr/unite/hdf5-1.10.5-icc-mpi/lib:$LD_LIBRARY_PATH PYTHONPATH=/usr/unite/python-2.7.15-h5py-2.10.0-icc-mpi/lib64/python2.7/site-packages:/usr/unite/python-2.7.15-mpi4py-3.0.3-icc/lib64/python2.7/site-packages python2 -c "import h5py.version; print(h5py.version.version)"

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

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

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

    $ scl enable rh-python34 bash

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

    $ LD_LIBRARY_PATH=/usr/unite/hdf5-1.10.5-mpi-icc/lib:$LD_LIBRARY_PATH PYTHONPATH=/usr/unite/rh-python34-h5py-2.10.0-mpi-icc/lib64/python3.4/site-packages:/usr/unite/rh-python34-mpi4py-3.0.3-icc/lib64/python3.4/site-packages python -c "import h5py; print(h5py.__path__[0])"

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

    /usr/unite/rh-python34-h5py-2.10.0-mpi-icc/lib64/python3.4/site-packages/h5py-2.10.0-py3.4-linux-x86_64.egg/h5py

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

    $ LD_LIBRARY_PATH=/usr/unite/hdf5-1.10.5-mpi-icc/lib:$LD_LIBRARY_PATH PYTHONPATH=/usr/unite/rh-python34-h5py-2.10.0-mpi-icc/lib64/python3.4/site-packages:/usr/unite/rh-python34-mpi4py-3.0.3-icc/lib64/python3.4/site-packages python -c "import h5py.version; print(h5py.version.version)"

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

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

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

    $ scl enable rh-python35 bash

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

    $ LD_LIBRARY_PATH=/usr/unite/hdf5-1.10.5-mpi-icc/lib:$LD_LIBRARY_PATH PYTHONPATH=/usr/unite/rh-python35-h5py-2.10.0-mpi-icc/lib64/python3.5/site-packages:/usr/unite/rh-python35-mpi4py-3.0.3-icc/lib64/python3.5/site-packages python -c "import h5py; print(h5py.__path__[0])"

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

    /usr/unite/rh-python35-h5py-2.10.0-mpi-icc/lib64/python3.5/site-packages/h5py-2.10.0-py3.5-linux-x86_64.egg/h5py

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

    $ LD_LIBRARY_PATH=/usr/unite/hdf5-1.10.5-mpi-icc/lib:$LD_LIBRARY_PATH PYTHONPATH=/usr/unite/rh-python35-h5py-2.10.0-mpi-icc/lib64/python3.5/site-packages:/usr/unite/rh-python35-mpi4py-3.0.3-icc/lib64/python3.5/site-packages python -c "import h5py.version; print(h5py.version.version)"

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

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

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

    $ scl enable rh-python36 bash

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

    $ LD_LIBRARY_PATH=/usr/unite/hdf5-1.10.5-mpi-icc/lib:$LD_LIBRARY_PATH PYTHONPATH=/usr/unite/rh-python36-h5py-2.10.0-mpi-icc/lib64/python3.6/site-packages:/usr/unite/rh-python36-mpi4py-3.0.3-icc/lib64/python3.6/site-packages python -c "import h5py; print(h5py.__path__[0])"

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

    /usr/unite/rh-python36-h5py-2.10.0-mpi-icc/lib64/python3.6/site-packages/h5py-2.10.0-py3.6-linux-x86_64.egg/h5py

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

    $ LD_LIBRARY_PATH=/usr/unite/hdf5-1.10.5-mpi-icc/lib:$LD_LIBRARY_PATH PYTHONPATH=/usr/unite/rh-python36-h5py-2.10.0-mpi-icc/lib64/python3.6/site-packages:/usr/unite/rh-python36-mpi4py-3.0.3-icc/lib64/python3.6/site-packages python -c "import h5py.version; print(h5py.version.version)"

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

    2.10.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 става успешно:

    $ LD_LIBRARY_PATH=/usr/unite/hdf5-1.10.5-mpi-icc/lib:$LD_LIBRARY_PATH PYTHONPATH=/usr/unite/python-3.6.8-h5py-2.10.0-mpi-icc/lib64/python3.6/site-packages:/usr/unite/python-3.6.8-numpy-1.17.2-icc/lib64/python3.6/site-packages:/usr/unite/python-3.6.8-mpi4py-3.0.3-icc/lib64/python3.6/site-packages python3 -c "import scipy; print(scipy.__path__[0])"

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

    /usr/unite/python-3.6.8-h5py-2.10.0-mpi-icc/lib64/python3.8/site-packages/h5py-2.10.0-py3.6-linux-x86_64.egg/h5py

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

    $ LD_LIBRARY_PATH=/usr/unite/hdf5-1.10.5-mpi-icc/lib:$LD_LIBRARY_PATH PYTHONPATH=/usr/unite/python-3.6.8-h5py-2.10.0-mpi-icc/lib64/python3.6/site-packages:/usr/unite/python-3.6.8-numpy-1.17.2-icc/lib64/python3.6/site-packages:/usr/unite/python-3.6.8-mpi4py-3.0.3-icc/lib64/python3.6/site-packages python3 -c "import h5py.version; print(h5py.version.version)"

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

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

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

    $ LD_LIBRARY_PATH=/usr/unite/python-3.8.0-gcc-c8/lib:/usr/unite/hdf5-1.10.5-mpi-icc/lib:$LD_LIBRARY_PATH PYTHONPATH=/usr/unite/python-3.8.0-gcc-c8-h5py-2.10.0-mpi-icc/lib/python3.8/site-packages:/usr/unite/python-3.8.0-gcc-c8-numpy-1.17.2-icc/lib/python3.8/site-packages:/usr/unite/python-3.8.0-gcc-c8-mpi4py-3.0.3-icc/lib/python3.8/site-packages PATH=/usr/unite/python-3.8.0-gcc-c8/bin:$PATH python3 -c "import h5py; print(h5py.__path__[0])"

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

    /usr/unite/python-3.8.0-gcc-c8-h5py-2.10.0-mpi-icc/lib64/python3.8/site-packages/h5py-2.10.0-py3.8-linux-x86_64.egg/h5py

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

    $ LD_LIBRARY_PATH=/usr/unite/python-3.8.0-gcc-c8/lib:/usr/unite/hdf5-1.10.5-mpi-icc/lib:$LD_LIBRARY_PATH PYTHONPATH=/usr/unite/python-3.8.0-gcc-c8-h5py-2.10.0-mpi-icc/lib/python3.8/site-packages:/usr/unite/python-3.8.0-gcc-c8-numpy-1.17.2-icc/lib/python3.8/site-packages:/usr/unite/python-3.8.0-gcc-c8-mpi4py-3.0.3-icc/lib/python3.8/site-packages PATH=/usr/unite/python-3.8.0-gcc-c8/bin:$PATH python3 -c "import h5py.version; print(h5py.version.version)"

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

    2.10.0

 


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

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