Singularity
Einstaka hugbúnaður mun virka betur í öðrum umhverfm, til dæmis AlphaFold
Hvad er Singularity?
Singularity er gámapallur, svipað og Docker. Það gerir notendum okkar kleift að búa til og keyra gáma á þann hátt að hægt sé að afrita öll hugbúnaðarstykki pakkans. Notendur geta smíðað gám á heimatölvunni sinni og síðan keyrt hann á Elju eða náð í umhverfi sem fyrir eru úr Singularity Library eða [Docker Hub](https://hub. docker.com)
Singularity grunnnotkun
Singularity býður upp á gámakerfi líkt og Docker. Til að nota Singularity á Elju verður þú fyrst að hefja gagnvirka lotu:
$ srun --job-name "Singularity Job" --partition 48cpu_192mem --time 01:00:00 --pty bash
Sjáðu hér til að læra meira um gagnvirkar lotur.
Að sækja myndir
Þegar gagnvirk lota er virk getur þú notað singularity
skipunina:
$ singularity --version
singularity-ce version 3.11.4-1.el8
Það eru bæði til innfæddar Singularity myndir, sem eru í boði á Singularity gáma safninu, skipunin pull
hleðúr niður myndini í skráarkerfið þitt.
$ singularity pull library://sylabsed/linux/alpine
Þú getur einnig notað pull
til að sækja Docker myndir frá Docker Hub, í því tilfelli mun pull
hlaða niður myndinni frá Docker og setja það saman í lög sem eru síðan samsett í nothæfa Singularity skrá.
$ singularity pull docker://godlovedc/lolcow
Að sækja Docker myndir minnkar líkurnar á að hægt sé að endurgera umhverfið. Sem dæmi; ef þú sækir Docker mynd í dag og svo aftur eftir sex mánuði eru ekki hægt að ábyrgjast að myndinn sé sú sama. Ef eitthvað af grunn lögunum hefur breyst í myndinni mun öll myndinn vera breytt. Ef mikil áhersla er lögð á að endurgera nákvæmlega sama umhverfið reyndu þá að byggja umhverfið þitt frá gámasafni Singularity.
Þú getur einnig notað build
skipunina til að hlaða niður forbyggðum myndum. Þegar build er notað verður þú að gefa gámnum nafn eins og sést hér:
$ singularity build ubuntu.sif library://ubuntu
$ singularity build lolcow.sif docker://godlovedc/lolcow
Ólíkt pull
mun build
breyta myndinni í nýjustu útgáfu af Singularity myndi eftir að henni hefur verið hlaðið niður.
Samskipti við myndir
Þé getur nota search
skipunina til að staðsetja hópa, söfn og gáma sem þú hefur áhuga á af Gámasafninu.
$ singularity search metaerg
Found 1 container images for amd64 matching "metaerg":
library://rbazile/default/metaerg:1.0.4,amd64,latest
Til að keyra gáminn getur þú anarsvegar keyrt hann gagnvirkt eða framkvæmt skipanir á hann.
$ singularity shell lolcow_latest.sif
Singularity> cowsay This is from a shell
______________________
< This is from a shell >
----------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Shell virkar líka með library://
, docker://
og shub://
slóðum. Þetta býr til tímabundinn gám sem hverfur þegar skelinni hefur verið lokað.
singularity shell library://sylabsed/examples/lolcow
INFO: Using cached image
Singularity> cowsay This container will self destruct when it is exited
________________________________________
/ This container will self destruct when \
\ it is exited /
----------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Framkvæma skipanir
exec
skipunin leyfir að framkvæma sérsniðnar skipanir innan gámsins með því að skilgreina .sif
skrána. Sem dæmi:
singularity exec lolcow_latest.sif cowsay i am cat
__________
< i am cat >
----------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
exec
virkar einnig með library://
, docker://
og shub://
slóðum. Þetta býr til tímabundinn gám sem eyðist eftir að skipunin hefur verið keyrð.
singularity exec library://sylabsed/examples/lolcow cowsay "THIS CONTAINER WILL BE DESTROYED"
INFO: Using cached image
__________________________________
< THIS CONTAINER WILL BE DESTROYED >
----------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Að keyra gáminn
Singularity gámar innihalda keyrsluskriftur. Þetta er notendaskilgreind skrifta sem skilgrenir þær aðgerðir sem gámur ætti að framkvæma þegar hann er keyrður. Þessi skrifta fer í gangi með run
skipuninin, eða með því að kalla á gámin eins og hann væri keyranleg skrá.
$ singularity run lolcow_latest.sif
_____________________________________
/ You have been selected for a secret \
\ mission. /
-------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
$ ./lolcow_latest.sif
____________________________________
/ Q: What is orange and goes "click, \
\ click?" A: A ball point carrot. /
------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
run
virkar einnig með library://
og docker:///
slóðum. Þetta býr til tímabundinn gám sem eyðist eftir að hann klárar.
singularity run library://sylabsed/examples/lolcow
INFO: Using cached image
______________________________________
/ April 1 \
| |
| This is the day upon which we are |
| reminded of what we are on the other |
| three hundred and sixty-four. |
| |
| -- Mark Twain, "Pudd'nhead Wilson's |
\ Calendar" /
--------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Vinna með skrár
$ echo "Hello from inside the container" > $HOME/hostfile.txt
$ singularity exec lolcow_latest.sif cat $HOME/hostfile.txt
Hello from inside the container
Þetta virkar vegna þess að hostfile.txt
er til á heimasvæði notandans. Singularity festi /home/$USER
, /tmp
og $PWD
inn í gáminn við keyrslu.
Þú getur tekið fram aðrara möppur og fest þær inn í þinn gám með --bind
skipuninni, til dæmin /scratch/$USER/data
$ echo "Do science!" > /scratch/$USER/data/text.txt
$ singularity exec --bind /scratch/$USER/data:/mnt lolcow_latest.sif cat /mnt/text.text
Do science!
Í þessu tilfelli er /scratch/$USER/data
mappan bundinn við /mnt
innann gámsins.
Pípur og áframsendingar virka líka með Singularity skipunninn eins og með öðrum Unix skipunum:
cat /scratch/$USER/data/text.txt | singularity exec lolcow_latest.sif cowsay
_____________
< Do science! >
-------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Að smíða þinn egin gám
Í þessum hluta munum við fara yfir hvernig þú getur smíðað glænýjan sérsniðinn gám.
Að byggja gáma krefst sudo réttinda og því er ekki hægt að keyra það á Elja. Mælt er með því að smíða gámana á einkavélinni þinni og afrita þá yfir á Elja
Til að búa til Singularity gám verður þú fyrst að hlaðá niðúr Singularity á þína vél þár sem sumar skipanir krefjast sudo réttinda, og nota síðan build skipuninna til að gera gámin meðfærilegan. Singularity er í boðí fyrir Windows, MacOS og Linux, frekari upplýsingar er að finna hér.
Við byrjum á því að búa til skrifanlegan gám, einnig þekktur sem sandkassi. Við munu nota shell skipunina með valmöguleikanum -writable
og gagnvirkt fikta við gámin.
Við munum síðan bæta við breytingunum okkar við skilgreiningar skrá (.def) og nota hana til að endurbyggja gámin.
$ mkdir lolcow
$ cd lolcow
$ touch lolcow.def
$ vim lolcow.def
Skilgreiningar skráinn (.def) mun innihalda eftirfarandi línur:
BootStrap: debootstrap
OSVersion: stable
MirrorURL: http://ftp.us.debian.org/debian/
%runscript
echo "This is what happens when you run the container..."
%post
echo "Hello from inside the container"
apt-get -y --allow-unauthenticated install vim
Með þessari skilgreiningar skrá sem byrjunarpúnkt getum við byrjað að byggja okkar lolcow.img gám. build
skipuninn þarfnast sudo réttinda!
$ sudo singularity build --sandbox lolcow lolcow.def
Singularity mun smíða gám að nafni lolcow með lolcow.def skilgreiningarskránni. Valmöguleikinn --sandbox
segir Singularity að við viljum byggja sérstaka týpu af gám, sandkassa, í þróunarskyni.
Næst munum við nota shell --writable
valmöguleikan til að gera breytingar á gámnum okkar.
$ sudo singularity shell --writable lolcow
Valmöguleikin --writable
gerir okkur kleift að gera breytingar á gámnum. Þessar breytingar verða vistaðar innan gámsins og munu haldast óbréttar milli notkunar.
Nú skulum við setja upp hugbúnað innan gámsins.
Singularity> apt-get update
Singularity> apt-get install -y fortune cowsay lolcat
Næst skulum við sjá hvort vi ð getum keyrt þennan hugbúnað.
Singularity> fortune | cowsay | lolcat
bash: lolcat: command not found
bash: cowsay: command not found
bash: fortune: command not found
Við sjáum að ekkert af þessum forritum er í $PATH
við getum notað find
til þess að finna hvar þessi forrit eru geymd og bæta þeirri möppu í $PATH
.
Singularity> find /usr -name cowsay
/usr/games/cowsay
Singularity> export PATH=$PATH:/usr/games
Singularity> fortune | cowsay | lolcat
_______________________________
< Be careful! Is it classified? >
-------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Athugið: Ef þið fáið viðvaranir frá Perl um að 'locale' sé rangur geturðu lagað það með : export LC_ALL=C
.
Nú getum við smiðað loka SIF skrána. Til að kemba (e. debug) getum við notað shell
til að keyra Singularity gáminn gagnvirkt, en til þess að gera breytingar á gámnum er mælt með að hafa þær allar í skilgreiningar skranni þinni. Méð því að halda breytingunum í skilgreiningarskránni verður gámurinn endurnýtanlegur.
Uppfærum nú skilgreiningarskrána með þeim breytingum sem við höfum gert.
$ vim lolcow.def
Svona lítur uppfærða skilgreiningarskráin út:
BootStrap: debootstrap
OSVersion: stable
MirrorURL: http://ftp.us.debian.org/debian/
%runscript
fortune | cowsay | lolcat
%post
apt-get update
apt-get -y install fortune cowsay lolcat
%environment
export LC_ALL=C
export PATH=$PATH:/usr/games
Nú getum við endurbyggt gámin með skilgreiningarskránni.
$ sudo singularity build lolcow.sif lolcow.def
Takið eftir að við höfum fjarlægt --sandbox
valmöguleikan og bætt .sif framlenginguni á skrána. SIF skrá er þjöppuð og óbreytileg sem gerir það að góðum valkost fyrir umhverfi til útgáfu.
Nú ættum við að geta keyrt útgáfu gáminn okkar.
$ singularity run lolcow.sif
______________________________________
/ A robin redbreast in a cage Puts all \
| Heaven in a rage. |
| |
\ -- Blake /
--------------------------------------
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
Færa gám yfir á Elju
Nú þegar við erum búin smíða gámin og viljum keyra hann á HPC þyrpinguni. Til þess að gera það þurfum við að nota scp
$ scp -i ~/.ssh/<Your private SSH key> /path/to/containers/lolcow.sif <username>@elja.hi.is:~/containers
Gámurinn verður nú fluttur yfir á Elju og verðúr aðgengilegur á heimasvæðinu þinu. Nú ættir þú að geta keyrt gáminn á reiknihnútum með hjálp SLURM
Keyra Singularity með SLURM
GPU Dæmi
Fyrst þurfum við að hefja gagnvirka keyrslu og síðan getum við hlaðið niður þeim Singularity myndum sem okkur hentar. Í þessu dæmi er það hello-world.sif: Hvernig á áð hefja gagnvirkar keyrslur
$ srun --job-name "InteractiveGPU" --partition gpu-1xA100 --time 0-01:00 --pty bash
$ singularity pull --name lolcow.sif library://sylabsed/examples/lolcow_latest
Til að fá aðgengi að Nvidia GPU driflinum innan Singularity gámsins þurfum við að nota valmöguleikan --nv
þegar við keyrum gáminn. Til að staðfetsa að þú hafur aðgengi að umbeðnum skjákortum getur þú keyrt nvidia-smi
innan gámsins:
$ singularity exec --nv lolcow.sif /bin/bash
Singularity> nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI x96.26 Driver Version: 396.26 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla K20Xm Off | 00000000:88:00.0 Off | 0 |
| N/A 37C P0 61W / 235W | 0MiB / 5700MiB | 65% Default |
+-------------------------------+----------------------+----------------------+
Singularity gámar og SLURM verkefni
Þú getur notað Singularity myndir sem ógagnvirkar lotu skriftur eins og hver önnur skipun. Ef gámurinn inniheldir keyrslu-skriftu þá getur þú notað singularity run
til að keyra Singularity keyrslu-skriftuna í lotuni. Þú getur einnig notað Singularity exec til að keyra handahófskenndar skipanir (eða skriftur) innan gámsins.
Dæmi:
#!/bin/bash
#SBATCH -J singularity_job
#SBATCH --mail-type=ALL
#SBATCH --mail-user=<Your E-mail> # for example uname@hi.is
#SBATCH --partition=48cpu_192mem # request node from a specific partition
#SBATCH --nodes=2 # number of nodes
#SBATCH --ntasks-per-node=48 # 48 cores per node (96 in total)
#SBATCH --mem-per-cpu=3900 # MB RAM per cpu core
#SBATCH --time=0-04:00:00 # run for 4 hours maximum (DD-HH:MM:SS)
#SBATCH --hint=nomultithread # Suppress multithread
#SBATCH --output=slurm_job_output.log
#SBATCH --error=slurm_job_errors.log # Logs if job crashes
# Singularity command line options
singularity pull library://sylabsed/examples/lolcow:latest
singularity run lolcow_latest.sif
Ef lotu-skriftan hér að ofan er nefnd singularity_job.sbatch
, sem dæmi, er hægt að leggja fram lotu-keyrsluna eins og vanalega með sbatch
.
$ sbatch singularity_job.sbatch