УНИТе

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

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

Съдържание:

  1. Предварителна информация
  2. Изтегляне на изходния код на OpenMM и компилирането му с Intel Compilers и GNU Compilers
  3. Тестове за проверка на качеството на компилирания код на библиотеките и Python-интерфейса
  4. Взаимодействие с pymbar
  5. Тестове за скорост на изпълнение

 

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

OpenMM е пакет, който съдържа библиотеки за реализиране на молекулярни симулации или за извършване на изчисления свръзани с резултати подобни симулации, получени от други инструменти, а така също и предлага Python модули, чрез които библиотеките могат да се свържат към приложни скриптове. Целта на този документ е да предложи рецепта за компилиране и инсталиране на кода на памета чрез използване на компилаторите от пакета Intel Compilers и GNU Compilers.

 

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

2.1. Предварителни настройки и необходими пакети

Ако ще компилирате изходния код с Intel Compilers, убедете се, че имате достъп до изпълнимите файлове на компилаторите icc, icpc и ifort. В случай, че ще компилирате изходния код с GNU Compilers (това се налага, ако нямате на разположение Intel Compilers или имате специфично изискване, което налага използването на точно тези компилатори), убедете се, че имате инсталирани компилаторите gcc, g++ и gfortran. Реално, Fortran компилатор ще ви е нужен само за специфичните тестове, които може да извършите след като инсталирате компилираната библиотека.

Убедете, че имате инсталиран пакета cmake3 и ако го нямате, инсталирайте го от пакетните хранилища на дистрибуцията:

  • CentOS 7

    $ sudo yum install cmake3
  • CentOS 8

    $ sudo dnf install cmake

За да компилирате Python интерфейсния модул, чрез който библиотеките могат да се извикват от Python код, трябва да имате инсталиран Python 3. Препоръчително е Python 3 дистрибуцията да е тази, която се предлага от Intel.

В системата трябва да са налични и достъпни CUDA библиотеките (обикновено те се намират в /usr/local/cuda, но местоположението им може да е различно в различните системи). Тези библиотеки предлагат и съответната специфична версия на OpenCL, нужна за взаимодействието на OpenMM с GPU устройства.

2.2. Изтегляне и разпакетиране на изходния код

Изходният код на библиотеката може да бъде изтеглен от страницата на проекта:

https://github.com/openmm/openmm/releases

Препоръчително е да изтеглите и компилирате последната стабилна версия на кода на проекта. За примера тук се предполага, че това е 7.4.1. По времето, по което вие посетите страницата на проекта, там може да има по-нова стабилна версия. Изтеглянето и разпакетирането на кода може да стнане по следния начин:

$ mkdir ~/build
$ cd ~/build
$ wget https://github.com/openmm/openmm/archive/7.4.1.tar.gz -O openmm-7.4.1.tar.gz
$ tar xvf openmm-7.4.1.tar.gz

Влезте в новосъздадената при разпакетирането директория:

$ cd ~/build/openmm-7.4.1

създайте поддиректорията build и влезте в нея:

$ mkdir build
$ cd build

2.3. Конфигуриране на компилационния процес и компилиране на изходния код и инсталирането на продукта

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

  • ако компилирането се извършва с Intel Compilers:

    Първо заредете всички променливи на средата, чрез които се задават пътищата до компилаторите и библиотеките:

    $ source /usr/unite/intel/compilers_and_libraries/linux/bin/compilervars.sh intel64

    и след това стартирайте конфигурирането:

    $ FC=ifort FCFLAGS="-xHost" CC=icc CFLAGS="-xHost" CXX=icpc CXXFLAGS="-xHost" cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/unite/openmm-7.4.1-intel
  • ако компилирането се извършва с GNU Compilers:

    $ cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/unite/openmm-7.4.1-gnu

Най-важното съобщение, което трябва да получите като резултат от конфигурирането е това, което показва дали са намерени CUDA и OpenCL библиотеките. То ще изглежда така:

-- Found CUDA: /usr/local/cuda (found version "10.2") 
-- Found OPENCL: /usr/local/cuda/lib64/libOpenCL.so

Ако библиотеките не бъдат намерени, трябва да се върнете една стъпка назад и да проверите защо те не могат да бъдат намерени.

След като всичко дотук е протекло успешно, може да пристъпите към компилирането на кода:

$ make -j6

Ако компилацията завърши успешно, проверете дали компилирания двоичен код на библиотеките наистина работи според очакванията:

$ cd tests
$ make test

Резултатът от усшения тест ще изглежда по следния начин:

Running tests...
Test project /home/vesso/build/openmm-7.4.1/build/tests
    Start 1: TestEnforcePeriodicBox
1/9 Test #1: TestEnforcePeriodicBox ...........   Passed    0.06 sec
    Start 2: TestFindExclusions
2/9 Test #2: TestFindExclusions ...............   Passed    0.01 sec
    Start 3: TestFindMolecules
3/9 Test #3: TestFindMolecules ................   Passed    0.01 sec
    Start 4: TestParser
4/9 Test #4: TestParser .......................   Passed    0.02 sec
    Start 5: TestSplineFitter
5/9 Test #5: TestSplineFitter .................   Passed    0.01 sec
    Start 6: TestSystem
6/9 Test #6: TestSystem .......................   Passed    0.01 sec
    Start 7: TestVectorExpression
7/9 Test #7: TestVectorExpression .............   Passed    0.00 sec
    Start 8: TestVectorize
8/9 Test #8: TestVectorize ....................   Passed    0.00 sec
    Start 9: TestVectorize8
9/9 Test #9: TestVectorize8 ...................   Passed    0.01 sec

100% tests passed, 0 tests failed out of 9

Total Test time (real) =   0.12 sec

Ако в резултата от теста виждате "100% tests passed", може да пристъпите към инсталиране на компилираните библиотеки (ще бъдат инсталирани в директорията, която е била указана преди това като стойност на CMAKE_INSTALL_PREFIX):

$ make install

2.4. Компилиране и инсталиране на Python-интерфейса

Модулът simtk осъществява комуникацията между Python и библиотеките на OpenMM (този код е нужен за да може функциите и процедурите от тези библиотеки да се извикват в програмен код интерпретиран от Python). За за да го компилирате и инсталирате влезте в поддиректория python (поддиректория на build, в която сте извършили процеса на настройка и компилация):

cd ~/build/openmm-7.4.1/build/python

и в нея изпълнете командните редове за компилиране и инсталиране на модула, в зависимост от това какъв компилатор сте използвали за компилиране на OpenMM библиотеките:

  • ако за компилиране на OpenMM библиотеката са използвани Intel Compilers:

    $ CC=icc CXX=icpc CFLAGS=-xHost CXXFLAGS=-xHost PATH=/opt/intel/intelpython3/bin:$PATH OPENMM_INCLUDE_PATH=/usr/unite/openmm-7.4.1-intel/include OPENMM_LIB_PATH=/usr/unite/openmm-7.4.1-intel/lib python3 setup.py build
    $ PATH=/opt/intel/intelpython3/bin:$PATH OPENMM_INCLUDE_PATH=/usr/unite/openmm-7.4.1-intel/include OPENMM_LIB_PATH=/usr/unite/openmm-7.4.1-intel/lib PYTHONPATH=/usr/unite/python-3.7.4-simtk-intel/lib/python3.7/site-packages python3 setup.py install --prefix=/usr/unite/python-3.7.4-simtk-intel
    
  • ако за компилиране на OpenMM библиотеката са използвани GNU Compilers:

    $ PATH=/opt/intel/intelpython3/bin:$PATH OPENMM_INCLUDE_PATH=/usr/unite/openmm-7.4.1-gnu/include OPENMM_LIB_PATH=/usr/unite/openmm-7.4.1-gnu/lib python3 setup.py build
    $ PATH=/opt/intel/intelpython3/bin:$PATH OPENMM_INCLUDE_PATH=/usr/unite/openmm-7.4.1-gnu/include OPENMM_LIB_PATH=/usr/unite/openmm-7.4.1-gnu/lib PYTHONPATH=/usr/unite/python-3.7.4-simtk-gnu/lib/python3.7/site-packages python3 setup.py install --prefix=/usr/unite/python-3.7.4-simtk-gnu
    

Алтернативен вариант на компилиране на модула е да използвате Python 3, който се предлага от дистрибуцията, но от гледна точка на производителността е добре да се придържате към използването на Intel Python 3.

 

3. Тестове за проверка на качеството на компилирания код на библиотеките и Python-интерфейса

Извършването на тестовете е препоръчително, тъй като резултата от тяхното изпълнение е индикация дали двоичния код на OpenMM бибилиотеките е компилиран правилно.

ВАЖНО! Може да извършите теста без значение кой компилатор използвате, защото библиотеките, компилирани с Intel Compilers могат да бъдат свързвани към изпълним код компилиран с GNU Compilers и обратно.

Директорията с тестов код се намира в (тези пътища във файловата система са зададени при инсталацията, виж по-горе):

  • ако OpenMM библиотеката е компилирана с Intel Compilers:

    /usr/unite/openmm-7.4.1-intel/examples
  • ако OpenMM библиотеката е компилирана с GNU Compilers:

    /usr/unite/openmm-7.4.1-gnu/examples

Примерите по-долу са за тестовия код в /usr/unite/openmm-7.4.1-intel/examples, но същите тестове могат да бъдат направени и в директория /usr/unite/openmm-7.4.1-gnu/examples.

Всички от тестовете илюстрирани по-долу генерират траектория на симулация, която е запазена във формат PDB (всяка рамка от траекторията е една MODEL секция в PDB файла):

  • 1D-движение на аргонов атом:

    • компилиране и изпълнение на теста с Intel Fotran

      $ ifort -xHost -I/usr/unite/openmm-7.4.1-intel/include -L/usr/unite/openmm-7.4.1-intel/lib -lOpenMM -o HelloArgonInFortran HelloArgonInFortran.f90
      $ LD_LIBRARY_PATH=/usr/unite/openmm-7.4.1-intel/lib:$LD_LIBRARY_PATH ./HelloArgonInFortran > argon_intel_ifort.pdb
    • компилиране и изпълнение на теста с Intel C

      $ icc -xHost -I/usr/unite/openmm-7.4.1-intel/include -L/usr/unite/openmm-7.4.1-intel/lib -lOpenMM -o HelloArgonInC HelloArgonInC.c
      $ LD_LIBRARY_PATH=/usr/unite/openmm-7.4.1-intel/lib:$LD_LIBRARY_PATH ./HelloArgonInC > argon_intel_icc.pdb
    • компилиране и изпълнение на теста с Intel C++

      $ icpc -xHost -I/usr/unite/openmm-7.4.1-intel/include -L/usr/unite/openmm-7.4.1-intel/lib -lOpenMM -o HelloArgon HelloArgon.cpp
      $ LD_LIBRARY_PATH=/usr/unite/openmm-7.4.1-intel/lib:$LD_LIBRARY_PATH ./HelloArgon > argon_intel_icpc.pdb
    • компилиране и изпълнение на теста с GNU Fotran

      $ gfortran -O3 -I/usr/unite/openmm-7.4.1-intel/include -L/usr/unite/openmm-7.4.1-intel/lib -lOpenMM -o HelloArgonInFortran HelloArgonInFortran.f90
      $ LD_LIBRARY_PATH=/usr/unite/openmm-7.4.1-intel/lib:$LD_LIBRARY_PATH ./HelloArgonInFortran > argon_gnu_gfortran.pdb
    • компилиране и изпълнение на теста с GNU C

      $ gcc -O3 -I/usr/unite/openmm-7.4.1-intel/include -L/usr/unite/openmm-7.4.1-intel/lib -lOpenMM -o HelloArgonInC HelloArgonInC.c
      $ LD_LIBRARY_PATH=/usr/unite/openmm-7.4.1-intel/lib:$LD_LIBRARY_PATH ./HelloArgonInC > argon_gnu_gcc.pdb
    • компилиране и изпълнение на теста с GNU C++

      $ g++ -O3 -I/usr/unite/openmm-7.4.1-intel/include -L/usr/unite/openmm-7.4.1-intel/lib -lOpenMM -o HelloArgon HelloArgon.cpp
      $ LD_LIBRARY_PATH=/usr/unite/openmm-7.4.1-intel/lib:$LD_LIBRARY_PATH ./HelloArgon > argon_gnu_g++.pdb
  • 3D-движение на Na и Cl йони в неявно представен разтворител (модел на непрекъсната среда на разтворителя):

    • компилиране и изпълнение на теста с Intel Fotran

      $ ifort -xHost -I/usr/unite/openmm-7.4.1-intel/include -L/usr/unite/openmm-7.4.1-intel/lib -lOpenMM -o HelloSodiumChlorideInFortran HelloSodiumChlorideInFortran.f90
      $ LD_LIBRARY_PATH=/usr/unite/openmm-7.4.1-intel/lib:$LD_LIBRARY_PATH ./HelloSodiumChlorideInFortran > sodium_intel_ifort.pdb
    • компилиране и изпълнение на теста с Intel C

      $ icc -xHost -I/usr/unite/openmm-7.4.1-intel/include -L/usr/unite/openmm-7.4.1-intel/lib -lOpenMM -o HelloSodiumChlorideInC HelloSodiumChlorideInC.c
      $ LD_LIBRARY_PATH=/usr/unite/openmm-7.4.1-intel/lib:$LD_LIBRARY_PATH ./HelloSodiumChlorideInC > sodium_intel_icc.pdb
    • компилиране и изпълнение на теста с Intel C++

      $ icpc -xHost -I/usr/unite/openmm-7.4.1-intel/include -L/usr/unite/openmm-7.4.1-intel/lib -lOpenMM -o HelloSodiumChloride HelloSodiumChloride.cpp
      $ LD_LIBRARY_PATH=/usr/unite/openmm-7.4.1-intel/lib:$LD_LIBRARY_PATH ./HelloSodiumChloride > sodium_intel_icpc.pdb
    • компилиране и изпълнение на теста с GNU Fortran

      $ gfortran -O3 -I/usr/unite/openmm-7.4.1-intel/include -L/usr/unite/openmm-7.4.1-intel/lib -lOpenMM -o HelloSodiumChlorideInFortran HelloSodiumChlorideInFortran.f90
      $ LD_LIBRARY_PATH=/usr/unite/openmm-7.4.1-intel/lib:$LD_LIBRARY_PATH ./HelloSodiumChlorideInFortran > sodium_gnu_gfortran.pdb
    • компилиране и изпълнение на теста с GNU C

      $ gcc -O3 -I/usr/unite/openmm-7.4.1-intel/include -L/usr/unite/openmm-7.4.1-intel/lib -lOpenMM -o HelloSodiumChlorideInC HelloSodiumChlorideInC.c
      $ LD_LIBRARY_PATH=/usr/unite/openmm-7.4.1-intel/lib:$LD_LIBRARY_PATH ./HelloSodiumChlorideInC > sodium_gnu_gcc.pdb
    • компилиране и изпълнение на теста с GNU C++

      $ g++ -O3 -I/usr/unite/openmm-7.4.1-intel/include -L/usr/unite/openmm-7.4.1-intel/lib -lOpenMM -o HelloSodiumChloride HelloSodiumChloride.cpp
      $ LD_LIBRARY_PATH=/usr/unite/openmm-7.4.1-intel/lib:$LD_LIBRARY_PATH ./HelloSodiumChloride > sodium_gnu_g++.pdb
  • 3D-движение на TIP3P водни молекули:

    • компилиране и изпълнение на теста с Intel C++

      $ icpc -xHost -I/usr/unite/openmm-7.4.1-intel/include -L/usr/unite/openmm-7.4.1-intel/lib -lOpenMM -o HelloWaterBox HelloWaterBox.cpp
      $ LD_LIBRARY_PATH=/usr/unite/openmm-7.4.1-intel/lib:$LD_LIBRARY_PATH ./HelloWaterBox > water_intel_icpc.pdb
    • компилиране и изпълнение на теста с GNU C++

      $ g++ -O3 -I/usr/unite/openmm-7.4.1-intel/include -L/usr/unite/openmm-7.4.1-intel/lib -lOpenMM -o HelloWaterBox HelloWaterBox.cpp
      $ LD_LIBRARY_PATH=/usr/unite/openmm-7.4.1-intel/lib:$LD_LIBRARY_PATH ./HelloWaterBox > water_gnu_g++.pdb
  • 3D-движение на една молекула етан:

    • компилиране и изпълнение на теста с Intel C++

      $ icpc -xHost -I/usr/unite/openmm-7.4.1-intel/include -L/usr/unite/openmm-7.4.1-intel/lib -lOpenMM -o HelloEthane HelloEthane.cpp
      $ LD_LIBRARY_PATH=/usr/unite/openmm-7.4.1-intel/lib:$LD_LIBRARY_PATH ./HelloWaterBox > ethane_intel_icpc.pdb
    • компилиране и изпълнение на теста с GNU C++

      $ g++ -O3 -I/usr/unite/openmm-7.4.1-intel/include -L/usr/unite/openmm-7.4.1-intel/lib -lOpenMM -o HelloEthane HelloEthane.cpp
      $ LD_LIBRARY_PATH=/usr/unite/openmm-7.4.1-intel/lib:$LD_LIBRARY_PATH ./HelloWaterBox > ethane_gnu_g++.pdb

Препоръчително е да извършите всеки един от тестове показани по-горе и да визуализирате генерираните PDB файлове чрез VMD на ваша работна станция, на която имате инсталиран този софтуер. Имайте предвид, че поради различния начин на инициализиране на генератора на случайни числа в Intel Compiler и GNU Compilers координатите на атомите няма да съвпадат, но качествено картината, която виждате при визуализация на съответните тракетории ще е една и съща.

 

4. Взаимодействие с pymbar

Виж "Инсталиране и използване на pymbar под CentOS 7 и 8".

 

5. Тестове за скорост на изпълнение

Пристъпете към извършване на тези тестове само и единствено, ако останалите тестове предложени по-горе са успешни!

Влезте в директория /usr/unite/openmm-7.4.1-intel/examples (ако сте извършили компилацията с GNU Compilers, това ще е директория /usr/unite/openmm-7.4.1-gnu/examples). Там може да изпълните различни тестове, но от гледна точка на използване на GPU или CPU те са два типа:

  • тестове за работа с GPU (NVidia):

    $ PATH=/opt/intel/intelpython3/bin:$PATH PYTHONPATH=/usr/unite/python-3.7.4-simtk-intel/lib/python3.7/site-packages python3 benchmark.py --platform CUDA --test pme

    В рамките на този тест подразбиращия се cutoff параметър използван в реализацията на PME метода е 0.9 nm. За да видите колко ще се повиши времето за изчисления (понижи производителността) ако изберете по-голяма стойност на cutoff параметъра, използвайте 2.5 nm (това е екстремално висока стойност и няма особен смисъл да се използва в реални симулации, но е добра за тестове на натоварването):

    $ PATH=/opt/intel/intelpython3/bin:$PATH PYTHONPATH=/usr/unite/python-3.7.4-simtk-intel/lib/python3.7/site-packages python3 benchmark.py --platform CUDA --test pme --pme-cutoff=2.5

    Използването на подобна висока стойност на cutoff параметъра ще понижи производителността около 5 пъти, в сравнение с тази при 0.9 nm. Може да използвате и други тестове освен pme. По време на изпълнение на теста може да проследите колко памет заема процеаса върху GPU устройството, като изпълните успоредно:

    $ nvidia-smi

    Резултатът ще е подобен на следния:

    +-----------------------------------------------------------------------------+
    | Processes:                                                       GPU Memory |
    |  GPU       PID   Type   Process name                             Usage      |
    |=============================================================================|
    |    0     20875      C   python3                                       21MiB |
    +-----------------------------------------------------------------------------+
  • тестове за работа с CPU (паралелизацията, която се използва е OpenMP):

    $ PATH=/opt/intel/intelpython3/bin:$PATH PYTHONPATH=/usr/unite/python-3.7.4-simtk-intel/lib/python3.7/site-packages python3 benchmark.py --platform CPU --test pme

    В рамките на този тест подразбиращия се cutoff параметър използван в реализацията на PME метода е 0.9 nm. Сравнете резултата за производителността с този в случая на използване на GPU. За да видите колко ще се повиши времето за изчисления (понижи производителността) ако изберете по-голяма стойност на cutoff параметъра, използвайте 2.5 nm (това е екстремално висока стойност и няма особен смисъл да се използва в реални симулации, но е добра за тестове на натоварването):

    $ PATH=/opt/intel/intelpython3/bin:$PATH PYTHONPATH=/usr/unite/python-3.7.4-simtk-intel/lib/python3.7/site-packages python3 benchmark.py --platform CPU --test pme --pme-cutoff=2.5

    Използването на подобна висока стойност на cutoff параметъра ще понижи производителността около 5 пъти, в сравнение с тази при 0.9 nm. Сравнете резултата с този, който е получен при използване на GPU. Може да използвате и други тестове освен pme. По време на изпълнение на теста може да проследите колко памет и процесорни ресурси заема процеаса като изпълните успоредно:

    $ top

    Резултатът ще е подобен на следния:

      PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    21669 test     20   0   29.9g 335860  58476 S 1201.7   2.1   8:04.58 python3

    като под %CPU ще се вижда колко CPU треда са ангажирани в паралелизацията.

 


Последна актуализация: 4 март 2020

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