Singularity konteineru iespējas

Par šo materiālu

Šī pamācība ir tapusi kā atbalsta materiāls 2021. gada 5. marta tiešsaistes semināram “Singularity konteineru iespējas”. Gan pasākums, gan šī pamācība ir tapuši, pateicoties EuroHPC projekta “National Competence Centres in the framework of EuroHPC” (EuroCC) atbalstam. Šis projekts tika uzsākts jau 2020. gada 1. septembrī, un Latviju tajā pārstāv Rīgas Tehniskās universitātes HPC centrs kopā ar Latvijas Universitātes Skaitliskās modelēšanas institūtu. Projekta EuroCC mērķis ir izveidot Eiropā superskaitļošanas kompetences centru tīklu. Projektā iesaistītas 33 valstis, projekts ilgs 2 gadus ar kopējo finansējumu vairāk nekā 56 milj. EUR.

Projekta laikā izveidoto kompetences centru uzdevums būs veidot vienotu atbalsta struktūru, lai veicinātu superskaitļošanas iespēju izmantošanu augstākajā izglītībā, pētniecībā, publiskajā administrācijā un industrijā. Kompetences centri apkopos visās ES valstīs pieejamās kompetences, pieredzi un skaitļošanas resursus.

Ievads un problēmas nostādne

Lietojot augstas veiktspējas skaitļošanas (HPC) resursus, nereti kļūst aktuāli izmantot kādu nestandarta programmatūru, kas nav pieejama instalētu, lietošanai gatavu programmatūras moduļu formā. Šādā situācijā var lūgt administratoru palīdzību programmatūras uzstādīšanā. Tomēr nereti tas pilnībā neatrisina problēmu:

  • Vēlamā programmatūra var nebūt savietojama ar klasterī lietoto operētājsistēmu.
  • Nepieciešams uzstādīt daudz un dažādas programmatūras pakotnes ar specifiskām versijām.
  • Lietotājs var vēlēties lietot identisku vidi uz dažādiem klasteriem/darbstacijām.

Aprakstītajā situācijā ļoti piemēroti ir lietot programmatūru konteineru veidā – pilnībā komplektētu un iekapsulētu programmatūras vidi, kas ļauj izpildīt sev vēlamos aprēķinu uzdevumus dažādās sistēmās. Lai lietotu vajadzīgo programmatūras vidi (konteineru), atliek tikai pārkopēt/iegūt sev vēlamo konteinera failu.

Pamatfunkcionalitātes demonstrējums

Zemāk sniegts piemērs programmatūras konteineru pamata funkcionalitātei uz LU SMI HPC klastera. Piemērs apskata gadījumu, kad lietotāja mapē jau glabājas konteiners ar Anaconda Python (rīks ar virkni Python rīku, kas tipiski tiek pielietots HPC datu apstrādei ar Python).

# Pārliecinās, ka uz pamata sistēmas OS ir tikai vecs, nepilnīgs Python (2.x.x..)
python --version

# Var lietot administratoru uzstādītu, visiem pieejamu moduli
# Konstatē, ka tiešām ir jauns un iespējām bagāts Anaconda Python (3.x.x..)
module avail
module load anaconda3/anaconda-2020.11
python --version

# Taču ir alternatīva, gadījumam, ja šī vide nebūtu pieejama – konteineri!
# Atvieno iepriekš ielādētos moduļus
module purge

# Ielādē moduli 'singularity'
module load singularity/3.4.1

# Pielieto iepriekš saglabātu konteineru (izpilda atsevišķu komandu)
# Konstatē, ka tiešām ir jauns un iespējām bagāts Anaconda Python (3.x.x..)
singularity exec ~/mani_konteineri/mana_anaconda.simg python --version

# Pielieto iepriekš saglabātu konteineru (sāk lietot paša konteinera ‘shell’)
singularity shell ~/mani_konteineri/mana_anaconda.simg
python --version

# Esot konteinera ‘shell’ vidē, var izmantot visus lietotājam pieejamos failus
ls ~

Demonstrētajā piemērā redzams, ka konteineri atrisina kādas konkrētas programmatūras vides pielietošanu. Tomēr tas nav tik smagnēji kā lietot atsevišķu virtuālo datoru (virtual machine), kas parasti uz HPC klasteriem nav iespējams vai piemērots. Jāatzīmē, ka konteineru lietošanu, protams, var specificēt rindas sistēmas uzdevumu skriptos kā jebkuras citas komandas.

Singularity un Docker salīdzinājums

Pēdējos gados programmatūras konteinerizācija ir ieguvusi popularitāti plaši lietotās platformas Docker formā – šīs platformas komūna ir izveidojusi daudz un dažādus brīvi iegūstamus konteineru paraugus DockerHub repozitorijā. Tomēr ir alternatīvs konteinerizācijas risinājums, kas piemērotāks un populārāks tieši HPC vidē: Singularity. Šim risinājumam ir vairākas priekšrocības, kas to padara par īpaši piemērotu HPC jomā:

  • Atšķirībā no Docker, Singularity konteineru lietošanai nav nepieciešamas administratora tiesības. Tas ļauj pilnvērtīgi lietot šos konteinerus HPC vidē. (Konteineru veidošanai gan vēl joprojām nepieciešamas administratora tiesības.
  • Singularity konteineri piedāvā gatavus risinājumus paralēlu aprēķinu (OpenMPI) veikšanai, kā arī GPU aprēķinu veikšanai.
  • Singularity ir savietojams ar Docker konteineriem, kas ļauj izmantot augstākminētās priekšrocības, turpinot izmantot DockerHub repozitorija iespējas.

Balstoties uz minētajām priekšrocībām, kā arī faktu, ka Singularity ir pieejams gan uz LU FMOF SMI klastera, gan RTU HPC Centra klastera, šī pamācība apskata tieši Singularity konteineru lietošanu.

DockerHub konteineru iegūšana

Iepriekš veiktais demonstrējums ar Anaconda Python konteineru bija iespējams, jo tas tika iegūts no DockerHub repozitorija. Šī konteinera faila iegūšana/uzbūvēšana veicama sekojoši:

# Ielādē moduli 'singularity'
module load singularity/3.4.1

# Iegūst konteineru pēc linka no DockerHub (tikai lejupielāde,
# aizņem dažas sekundes.
singularity pull ~/mani_konteineri/mana_anaconda.simg docker://continuumio/anaconda3

# Opcionāli – var arī ar ‘build’, kas konvertē lejuplādēto
# konteineri uz jaunāko pieejamo formātu (šajā gadījumā
# ‘build’ neprasa administratora tiesības). Aizņem aptuveni 3 min.
singularity build ~/mani_konteineri/mana_anaconda.simg docker://continuumio/anaconda3

DockerHub repozitorijā pieejama virkne dažādu konteineru, kas satur dažādās jomās tipiskiem uzdevumiem piemērotus programmatūras rīku komplektus – gan fizikāli aprēķini, gan datu apstrāde, gan IT risinājumu rīki (piem., datubāzes). Taču ir vēl vairāki repozitoriji bez DockerHub, kur brīvi pieejami citu sagatavoti programmatūras konteineri.

NosaukumsInterneta vietnesingularity pull prefikss
Singularity Libraryhttps://cloud.sylabs.io/librarysingularity pull library://
Docker Hubhttps://hub.docker.comsingularity pull docker://
Singularity Hubhttps://singularity-hub.orgsingularity pull shub://
NVIDIA GPU Cloudhttps://ngc.nvidia.comsingularity pull docker://nvcr.io/

Singularity instalēšana un savu konteineru veidošana

Par spīti plašajiem repozitoriju resursiem, dažkārt nepieciešams izveidot savu, specifisku konteineru. Līdz ar to, ka šīs darbības veikšanai nepieciešamas administratora tiesības, tās tipiski tiktu veiktas uz sava personālā datora (vai sev pieejamas virtuālās mašīnas).

Zemāk parādīts piemērs, kā to veikt gadījumā, kad nepieciešams izveidot konteineru ar ESPResSo programmatūru – specifisku rīku mīkstās vides fizikas aprēķiniem. Šīs programmatūras uzstādīšanai nepieciešama virkne dažādu papildu rīku, kurus izvietot uz klastera varētu aizņemt nelietderīgi daudz laika gan lietotājam, gan administratoriem. Šī situācija padara ESPResSo programmu par lielisku kandidātu konteinera izveides demonstrējumam.

Singularity instalēšana uz sava Linux datora

Lai varētu veidot savus konteinerus, nepieciešams instalēt Singularity uz kāda Linux datora, kur pieejamas administratora tiesības. Tiem, kas uz sava personīgā datora nelieto Linux, vērts pieminēt, ka jebkurā datorā ar Windows 10 Enterprise/Pro ir jau gatava iebūvēta iespēja laist virtuālas Linux instances. Zemāk parādītais piemērs tika realizēts uz Ubuntu 20.04 LTS virtuālā datora. Sekojot šai Singularity instalācijas pamācībai, vispirms tika instalēta virkne vajadzīgo rīku:

sudo apt-get update && sudo apt-get install -y \
    build-essential \
    libssl-dev \
    uuid-dev \
    libgpgme11-dev \
    squashfs-tools \
    libseccomp-dev \
    wget \
    pkg-config \
    git \
    cryptsetup

Lai būtu iespējams kompilēt un iegūt lietošanā Singularity, nepieciešamas programmēšanas valodas Go rīki, kurus var lejupielādēt golang.org mājaslapā. Instalācija veicama sekojoši:

# Atarhivē lejupielādēto arhīvu
tar -C /usr/local -xzf go1.16.linux-amd64.tar.gz

# Pievieno ‘go’ mapi datora PATH
export PATH=$PATH:/usr/local/go/bin

# Restartē datoru vai arī izpilda komandu:
$HOME/.profile

Var turpināt ar pašas Singularity programmas instalāciju. Pēdējās programmas versijas kods lejupielādējams no GitLab lapas.

# Atarhivē un pārvietojas uz atarhivēto direktoriju
tar -xzf singularity-3.7.1.tar.gz
cd singularity

# Instalē singularity, norādēt vēlamo vietu (šeit izvēlēts /usr/local)
./mconfig -b ./buildtree -p /usr/local
cd ./singularity/buildtree
make
sudo make install

# Pārbauda, ka Singularity veiksmīgi instalēts
singularity version

Pēc augstāk parādīto darbību veikšanas, ir veiksmīgi instalēts Singularity, un ir iespējams gan lietot Singularity uz sava datora, gan sagatavot konteinerus lietošanai citur, piemēram, HPC klasteros.

Konteinera izveide ar receptes failu

Pats savus konteinerus var veidot, izmantojot konteinera receptes failu. Tā saturs norāda ar kādu programmatūru, ar kādiem parametriem un citiem funkcionāliem aspektiem tiks uzbūvēts konteinera fails. Par to, kādi bloki un parametri var būt šo receptes failu saturā, lasīt šajā pamācībā. Tomēr ārkārtīgi vērtīgi ir iepazīties un balstīt savu darbu dažādos recepšu failu piemēros, kas apkopoti GitHub.

Zemāk parādīts piemērs receptes failam, kas izveido konteineru ar minēto ESPResSo programmatūru. Kā redzams pēc šī faila satura, tiek veiktas darbības kā ar tipisku datoru; lielākoties fails sastāv no %post sadaļas, kas ir identiska programmas ESPResSo uzstādīšanas pamācībai.

Bootstrap: docker
From: ubuntu:18.04


%help
    Container with ESPResSo
    ESPResSo means: Extensible Simulation Package for Research on Soft Matter
    Website: http://espressomd.org/wordpress/
    Main binary for using ESOResSo via this container is 'pypresso'.

%post
    # Updating repositories and packages
    apt-get update && apt-get -y upgrade
    
    # Installing all dependencies (as shown on ESPResSo website)
    apt-get -y install wget tar build-essential \
        cmake cython3 python3-numpy libboost-all-dev \
        openmpi-common fftw3-dev libhdf5-dev \
        libhdf5-openmpi-dev python3-opengl libgsl-dev
   
    # Installing ESPResSo (as shown on ESPResSo website)
    cd ~
    wget -c \
    https://github.com/espressomd/espresso/releases/download/4.1.4/espresso-4.1.4.tar.gz
    tar zxvf espresso-4.1.4.tar.gz
    mkdir /usr/bin/espresso && cd /usr/bin/espresso
    cmake ~/espresso
    cmake --build .
    
    # Cleaning up
    apt-get clean
    apt-get autoremove
   
%environment
    # Something about locale... everyone seems to be doing this.
    export LC_ALL=C
    
    # Adding ESPResSo directory to PATH, so that the command 'pypresso' is available
    export PATH=/usr/bin/espresso:$PATH

Kad receptes fails ir izveidots un saglabāts ar nosaukumu ESPResSo_container_recipe.def, tad var būvēt konteineru, izmantojot zemāk redzamo komandu.

sudo singularity build ESPResSo_container.sif ESPResSo_container_recipe.def

Šajā gadījumā process aizņēma 5-10 minūtes (pamata vides un pakešu lejupielādē, konkrētās programmatūras kompilēšana). Galu galā izveidotā konteinera faila izmērs ir aptuveni 400 MB. Kad konteinera fails ir izveidots, to var lietot, līdzīgi kā iepriekš jau demonstrēts, ar exec un shell komandām. Konteinera failu var kopēt un lietot citur, tai skaitā uz HPC datorklastera.

singularity exec ESPResSo_container.sif pypresso <pypresso skripta fails>

Konteineru lietošana ar GPU iespējām

Kaut arī konteineri ir iekapsulētas programmatūras vides, to izpildi ir iespējams sasaistīt ar pamata sistēmas resursiem: gan iespējot sistēmas GPU karšu lietošanu, gan padot ārējus programmatūras resursus (piemēram sistēmas CUDA bibliotēku lietošanai konteinera iekšienē). Zemāk ir sniegts īss piemērs Tensorflow konteinera izmantošanai ar GPU. Tensorflow ir populārs rīks, ko izmanto mašīnmācīšanās aprēķinu veikšanai.

# Ielādē moduli 'singularity'
module load singularity/3.4.1

# Ielādē CUDA bibliotēku
# Šis modulis satur informāciju kur sistēmā meklēt CUDA komandas (‘/bin’ mape),
# kā arī CUDA_HOME mainīgā saturu
module load cuda/cuda-10.2

# Lieto Docker Hub iegūto moduli, papildus norādot GPU kartes lietošanu (‘--nv’),
# kā arī piesaista CUDA bibliotēkas mapi ar ‘–bind ..’
singularity shell --nv --bind ${CUDA_HOME} \ 
                     ~/mani_konteineri/tensorflow_2.3.1-gpu.sif

Demonstrēto ārējās programmatūras padošanu konteinerim var veikt arī jebkuru citu programmatūru, kas izvietota uz klastera. Tādējādi programmatūras moduļi var tikt veidoti mazāk apjomīgi – piemēram, nav nepieciešams konteinerā iekļaut Anaconda Python, ja ir skaidri zināms, ka tas ir piesaistāms ar parametru bind. Tādā gadījumā atliek konteinerā iekļaut tikai specifisko/nestandarta programmatūras saturu.

Šīs pēdējas raksta sadaļas tematika ir plašāk apskatīta materiālā, kas tika demonstrēts 5. marta seminārā. Šis materiāls ir pieejams lejupielādei kā PDF fails: