Apptainer

Bu belge TRUBA altyapısında Apptainer/Singularity platformunun kullanımını kolaylaştırmak için oluşturulmuştur. Bu kılavuz aşağıdakileri kapsamaktadır:

Giriş

Apptainer/Singularity, YBH sistemlerinde kullanılan popüler bir konteyner platformudur. Apptainer kullanarak dizüstü bilgisayarınızda ya da sanal makinenizde oluşturacağınız, program ve yazılım parçalarını taşınabilir ve üretilebilir bir şekilde paketlenen konteynerlar istenilen başka bir makinede, ofis bilgisayarında, ya da dünyanın pek çok YBH merkezlerinde bile hiç bir kurulum gerçekleştirmeden işlerin çalıştıtırabilir olmasına imkan sağlar. Sistemlerimizde konteyner platformunu kullanmak için apptainer (önceki adı ile singularity) mevcuttur. Konteyner oluşturma işlemleri yerel ya da sanal bilgisayarınızda istenilen mimaride yapılabilir. Kurulum ve daha fazlası için ilgili kılavuz ve konteyner kullanımı için ilgili öğretici dokümantasyon takip edilebilir. Bu şekilde yerel bilgisayarınızda oluşturulan konteynerları TRUBA’da herhangi bir kuruluma ihtiyaç duymadan kullanabilir ve işlerinizi konteyner içerisinde koşturabilirsiniz.

Hazır Kullanım

Aşağıda popüler konteyner sağlayıcılarını bulabilirsiniz:

Temel apptainer kullanımı apptainer <COMMAND> ... şeklinde olmaktadır.

İpucu

COMMAND için popüler seçenekler:
  • build: Konteyner oluşturmamızı sağlar.

  • shell: Konteyner içinde etkileşimli bir kabuk başlatmanıza olanak sağlar.

  • exec: Konteyner çalıştırmanın varsayılan yoludur. Konteyner içinde ki terminale gönderilen komutları çalıştırır.

  • run: Konteyner hazırlanırken ön tanımlı bir çalışma komut dosyasındaki adımları çalıştırır.

apptainer build <Konteyner-ismi.sif> <Onceden-Insa-Edilmis-Konteyner-URL, Def or Sif files>

ile yukarıda bahsedilen konteyner sağlayıcılarından istenilen program için hazırlanmış olan konteyner elde edilebilir. Sonrasında

apptainer exec <Filename.sif> <Program> <Betik> <Arg1> ...

ile apptainer içerisinde kurulu olan programı verilen betik ve Arg1 parametresi ile konteyner içerisinde çalıştırabiliriz.

Not

Örneğin, ubuntu 22.04 için bir konteyner oluşturmak ve içerisinde bulunan işletim sistemi bilgilerini yazdırmak aşağıdakini örnek alabiliriz:

apptainer build ubuntu-22.04.sif docker://ubuntu:22.04
apptainer exec ubuntu-22.04.sif cat /etc/os-release

Uyarı

Yukarıdaki sağlayıcılardan indirme işlemleri yapmadan önce önbellek için bir dizin belirtmeniz

export APPTAINER_CACHEDIR=/onbellek/icin/dizin
export APPTAINER_TMPDIR=/tmp/icin/dizin

ve gerektiğinde

apptainer cache clean

ile temizlemeniz gerekebilir. Daha fazla detay için ilgili kılavuz ziyaret edilebilir. Yukarıdaki adımlar yerine önbellekte tutulmasını istemiyorsak --disable-cache parametresini de kullanabiliriz.

Konteyner dışından klasör bağlama veya dışarda bırakma

İşlerinizi çalıştırırken konteyner içerisinde ev dizinine erişimi engellemek istersek --no-home parametresi kullanabiliriz. Aksine, ev dizini olarak --home /path/on/host ile farklı bir yer de gösterilebilir.

Konteyneri apptainer shell image-name.sif ile çalıştırılırsa ls komutu konteynerin çalıştırıldığı dizin otomatik olarak bağlandığı görülmektedir. Varsayılan olarak, $HOME, $PWD, /tmp, /sys gibi klasörleri otomatik olarak konteyner içine bağlanır. Detay için ilgili kılavuza bakılabilir. İstenilirse --bind kaynak_klasör:hedef_klasör ile dışarda bulunan kaynak_klasör içerde bulunan hedef_klasör isminde bir dizine bağlantı kurulabilir. Konteyner içinde hedef_klasör olmak zorunda değil, yok ise o isimde bir klasör oluşturur. Bunların aksine, konteyner dışında bulunması istenilen dizin ise --no-mount /no/access/path parametresi ile yapılabilir.

Konteyner Açma, Ekleme ve Kapatma

Yeni bir konteyner inşa etmek için bir konteyner servisi, tanım (def) ya da görüntü (image) dosyalarına ihtiyaç bulunmaktadır. İstenilirse hazır bir konteyner elde edildikten sonra konteyneri bir klasör şeklinde açıp içerisinde bulunan terminal çalıştırılarak manuel olarak program kurabilir ya da kurulu olan bir programa paket eklenebilir. Bu konteyner klasörünü daha sonra kapatılıp kullanıma sunulabilir.

İpucu

Örneğin, Docker içerisinde servis edilen R programlama dili için r-base-4.3.0 konteyneri çekilecek ve içerisine remotes paketi kurulumu yapıldıktan sonra kullanıma özelleştirilmiş bir konteyner elde etmek için gerekli komutlar şu şekilde olabilmektedir:

# Klasör olarak konteyner çekilir.
apptainer build --sandbox  r-base-4.3.0 docker://r-base:4.3.0

# SEÇENEK 1
# Konteyner yazılabilir şekilde içindeki R çalışır ve bir betik gönderilerek paket kurulur.
apptainer exec --writable --no-home r-base-4.3.0/ R -e "install.packages('remotes')"

# SEÇENEK 2
# İstenilen paketler konteyner içindeki terminal vasıtasıyle R aktif edilerek de yapılabilinir.
apptainer shell --writable --no-home r-base-4.3.0/
Apptainer> R
> install.packages('remotes')

# Kurulum bittikten sonra klasör şeklinde olan konteynerdan bir görüntü dosyası oluşturulur.
apptainer build r-base-4.3.0.sif r-base-4.3.0/

Konteyner içinde Anaconda

Conda platformunu konteyner içerisinde kullanmak için hazır anaconda ya da miniconda için servis edilen konteynerler kullanılabildiği gibi istenilen bir işletim sistemine ait bir konteyner içerisine de kurulum yapılabilir. Burada örnek olarak, hazır miniconda konteyneri oluşturulacak ve içerisine yeni bir conda ortamı oluşturma ve o ortam içerisinde python 3.9 versiyonu yükleme süreci gösterilecektir.

# Konteyner indirme işlemi
apptainer build --sandbox miniconda3-container docker://continuumio/miniconda3
# Konteyner içerisinde terminal açma
apptainer shell --no-home --writable --fakeroot miniconda3-container
apt update && apt install -y apt-utils vim
# conda aktif edebilmek için yan sekmede sunulan bilgileri vi ile ekleme
vi /.singularity.d/env/90-environment.sh
# conda base ortamı aktif etme
source /.singularity.d/env/90-environment.sh

Miniconda için ayarlamalar yapıldıktan sonra istenilirse test isminde ortam oluşturalım ve içinde python 3.9 versiyonu kurabiliriz.

apptainer shell --no-home --writable --fakeroot miniconda3-container
source /.singularity.d/env/90-environment.sh
# test isminde bir conda ortamı oluşturma
conda create --name test
conda activate test
# istenilen paket kurulumları gerçekleştirme
conda install python=3.9
# Konteyner kapatma
apptainer build miniconda3-container.sif ./miniconda3-container

Sonrasında konteyner içine girmeden test ortamı aktif edilmek ve python3.9 versiyonu kullanmak için yukarıda belirtilen conda-env-settings dosyası içinde conda ortam ismi gibi gerekli değişiklikler yapıldıktan sonra aşağıdaki gibi apptainer terminal çağrılabilir.

apptainer shell --env-file conda-env-settings miniconda3-container

Konteyner, MPI ve GPU

Konteyner içinde GPU kullanmasına olanak sağlamak için --nv parametresi kullanılarak yapılabilir. Daha fazla detay için ilgili GPU kılavuzu ziyaret edilebilir.

MPI işleri için konteyner içinde ve dışında aynı MPI programı ve versiyonu uyumlu olmalıdır. Program çalıştırırken apptainer exec mpirun -n <mpi-is-sayisi> <Konteyner> <Program> <Betik> olarak değil,

mpirun -n <mpi-is-sayisi> apptainer exec <Konteyner> <Program> <Betik>

şeklinde verilmelidir. Daha fazla detay için ilgili MPI kılavuzu ziyaret edilebilir.