/ Blog

HPC'de Konteyner Kullanımı: Singularity ve Apptainer Rehberi

HPC ortamında Singularity/Apptainer konteyner kullanımı: kurulum, imaj oluşturma, SLURM entegrasyonu.

Bilimsel yazılımların HPC kümelerinde çalıştırılması her zaman kolay olmamıştır. Farklı kümelerde birbirinden farklı işletim sistemi sürümleri, eksik kütüphaneler ya da çakışan bağımlılıklar araştırmacıları saatlerce süren kurulum süreçleriyle boğuşmak zorunda bırakır. Konteyner teknolojisi bu sorunu kökten çözmektedir: uygulamayı tüm bağımlılıklarıyla birlikte tek bir taşınabilir imaj içinde paketleyerek “bende çalışıyor ama kümede çalışmıyor” sorununu ortadan kaldırır.

Docker bu alanda öncü olmuş olsa da HPC ortamları için tasarlanmamıştır. Docker, root yetkisi gerektirmesi ve güvenlik modeli nedeniyle çok kullanıcılı paylaşımlı sistemlerde ciddi riskler oluşturur. İşte tam bu noktada Singularity ve onun topluluk tarafından sürdürülen devamı Apptainer devreye girer.

Singularity ve Apptainer: Nedir, Farkları Nelerdir?

Singularity, 2015 yılında Lawrence Berkeley Ulusal Laboratuvarı’nda HPC kullanımı göz önünde bulundurularak geliştirilmiştir. Temel tasarım ilkeleri şunlardır:

  • Kullanıcı, konteyner içinde de dışarıdakiyle aynı UID’ye sahiptir; root yetkisi gerekmez
  • İmaj dosyaları tek bir .sif dosyasıdır; dosya sistemi üzerindeki yük minimumdur
  • MPI, InfiniBand ve GPU desteği kutudan çıkar çıkmaz (out-of-the-box) çalışır
  • SLURM gibi iş zamanlayıcılarıyla sorunsuz entegrasyon sağlar

2021 yılında Sylabs şirketi Singularity’nin geliştirmesini ticari bir yapıya taşıyınca, Linux Foundation bünyesinde Apptainer projesi kuruldu. Apptainer, Singularity 3.x kodunun açık kaynaklı devamıdır ve API düzeyinde büyük ölçüde uyumludur. Çoğu kümede singularity komutu artık Apptainer’a sembolik bağlantıyla yönlendirilmektedir.

ÖzellikDockerSingularity / Apptainer
Root yetkisi gerekir mi?Evet (daemon)Hayır
İmaj formatıKatmanlı (overlay)Tek dosya (.sif)
HPC iş zamanlayıcısı desteğiSınırlıTam
GPU (CUDA) desteğinvidia-docker ile--nv bayrağıyla
MPI entegrasyonuKarmaşıkDoğrudan
Kullanıcı yalıtımıPID namespaceHost UID korunur

Apptainer Kurulumu

Çoğu modern HPC kümesinde Apptainer önceden yüklüdür. Kümede apptainer --version veya singularity --version komutuyla kontrol edebilirsiniz. Kendi sisteminize kurmak için:

# RHEL/Rocky Linux 8-9
sudo dnf install -y epel-release
sudo dnf install -y apptainer

# Ubuntu 22.04+
sudo apt-get install -y software-properties-common
sudo add-apt-repository -y ppa:apptainer/ppa
sudo apt-get update
sudo apt-get install -y apptainer

# Kurulum doğrulama
apptainer --version
# apptainer version 1.3.x

İmaj Oluşturma

Docker Hub’dan Hazır İmaj Çekme

Singularity/Apptainer, Docker Hub ve diğer OCI kayıt defterlerindeki imajları doğrudan .sif formatına dönüştürebilir:

# Docker Hub'dan Python imajı
apptainer pull python3.11.sif docker://python:3.11-slim

# NGC (NVIDIA GPU Cloud) üzerinden PyTorch
apptainer pull pytorch.sif docker://nvcr.io/nvidia/pytorch:24.01-py3

# Belirli bir dizine kaydet
apptainer pull --dir /scratch/images pytorch.sif docker://pytorch/pytorch:2.3.0-cuda12.1-cudnn8-runtime

Definition Dosyasıyla Özel İmaj Oluşturma

Tekrarlanabilir ve belgelenmiş ortamlar için .def (definition) dosyaları kullanılır:

# dosya: myapp.def
Bootstrap: docker
From: ubuntu:22.04

%labels
    Author hesap@kurum.edu
    Version 1.0.0
    Description Özel analiz ortamı

%environment
    export LC_ALL=C
    export PATH=/opt/myapp/bin:$PATH
    export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

%post
    # Sistem paketleri
    apt-get update && apt-get install -y \
        python3 python3-pip \
        libhdf5-dev \
        git curl wget \
        && rm -rf /var/lib/apt/lists/*

    # Python bağımlılıkları
    pip3 install --no-cache-dir \
        numpy scipy matplotlib \
        h5py pandas scikit-learn

    # Uygulama kurulumu
    git clone https://github.com/kurum/myapp.git /opt/myapp
    cd /opt/myapp && pip3 install -e .

%runscript
    exec python3 "$@"

%test
    python3 -c "import numpy; print('NumPy:', numpy.__version__)"

Bu tanım dosyasından imaj oluşturmak için root veya --fakeroot gereklidir:

# Fakeroot ile (küme kullanıcıları için)
apptainer build --fakeroot myapp.sif myapp.def

# Sandbox modunda (geliştirme/hata ayıklama için)
apptainer build --sandbox --fakeroot myapp_sandbox/ myapp.def
apptainer shell --writable myapp_sandbox/
# ... değişiklikler yapın ...
apptainer build myapp.sif myapp_sandbox/

Konteyner Çalıştırma

Temel Kullanım

# İmaj içinde komut çalıştırma
apptainer exec myapp.sif python3 analiz.py --input veri.csv

# İmajın runscript'ini tetikle
apptainer run myapp.sif script.py

# İnteraktif kabuk
apptainer shell myapp.sif

# Ortam değişkenlerini aktar
CUDA_VISIBLE_DEVICES=0 apptainer exec --nv myapp.sif python3 egitim.py

Dizin Bağlama (Bind Mounts)

Konteyner varsayılan olarak $HOME, /tmp ve mevcut dizini otomatik bağlar. Ek dizinler için:

# Tek dizin bağlama
apptainer exec --bind /scratch/veri:/data myapp.sif python3 isle.py

# Birden fazla dizin
apptainer exec \
    --bind /scratch/girdi:/input \
    --bind /scratch/cikti:/output \
    --bind /scratch/model:/model \
    myapp.sif python3 calistir.py

GPU Kullanımı

# NVIDIA GPU (CUDA)
apptainer exec --nv pytorch.sif python3 -c "import torch; print(torch.cuda.is_available())"

# AMD GPU (ROCm)
apptainer exec --rocm myapp_rocm.sif python3 hesapla.py

SLURM ile Entegrasyon

Konteyner kullanımı SLURM job script’lerine sorunsuz entegre olur:

#!/bin/bash
#SBATCH --job-name=konteyner_is
#SBATCH --partition=gpu
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=8
#SBATCH --gres=gpu:a100:2
#SBATCH --mem=64G
#SBATCH --time=04:00:00
#SBATCH --output=logs/%j.out
#SBATCH --error=logs/%j.err

# Modüller (gerekirse)
module load apptainer/1.3.0

# İmaj yolu
IMAGE=/scratch/images/pytorch.sif

# Veri dizinleri
INPUT_DIR=/scratch/$USER/veri
OUTPUT_DIR=/scratch/$USER/sonuclar
mkdir -p $OUTPUT_DIR

echo "İş başladı: $(date)"
echo "Node: $SLURMD_NODENAME"
echo "GPU: $CUDA_VISIBLE_DEVICES"

# Konteyneri çalıştır
apptainer exec --nv \
    --bind $INPUT_DIR:/data/input \
    --bind $OUTPUT_DIR:/data/output \
    $IMAGE \
    python3 /app/egitim.py \
        --epochs 100 \
        --batch-size 256 \
        --input /data/input \
        --output /data/output

echo "İş tamamlandı: $(date)"

Çok Düğümlü MPI İşleri

Apptainer, host sisteminin MPI kütüphanesini kullanarak çok düğümlü işleri yönetir. Bu “hybrid MPI” yaklaşımı için konteyner içindeki MPI sürümü, host’takiyle uyumlu olmalıdır:

#!/bin/bash
#SBATCH --job-name=mpi_konteyner
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=32
#SBATCH --time=02:00:00

module load openmpi/4.1.5
module load apptainer/1.3.0

# srun ile MPI başlat; her rank kendi konteynerini açar
srun apptainer exec \
    --bind /scratch:/scratch \
    /scratch/images/mpi_app.sif \
    /opt/app/mpi_hesap

İmaj Yönetimi ve En İyi Uygulamalar

İmajları merkezi bir konumda saklayın. Küme yöneticileri genellikle /scratch/shared/containers veya /opt/singularity/images gibi paylaşımlı alanlar tahsis eder. Kişisel kopyalar oluşturmak yerine bu merkezi depoyu kullanmak disk alanından tasarruf sağlar.

İmajları sürümlendirin. pytorch_latest.sif yerine pytorch_2.3.0-cuda12.1.sif gibi anlamlı isimler verin. Sonuçların tekrarlanabilirliği için hangi imaj sürümüyle çalıştığınızı kaydedin.

Büyük veri setlerini konteyner dışında tutun. İmaj boyutunu küçük tutmak hem depolama hem de taşınabilirlik açısından kritiktir. Veri dizinlerini her seferinde --bind ile bağlayın.

Test ortamı olarak sandbox kullanın. Yeni bağımlılıklar denerken önce sandbox modunda çalışın, kararlı hale gelince .sif imajı oluşturun:

# Sandbox'a paket ekle
apptainer exec --writable --fakeroot myapp_sandbox/ pip3 install yeni-paket

# Test et
apptainer exec myapp_sandbox/ python3 -c "import yeni_paket"

# Üretim imajını oluştur
apptainer build --fakeroot myapp_v2.sif myapp_sandbox/

Yaygın Sorunlar ve Çözümleri

“Permission denied” hatası: Bind mount edilen dizinlerin kullanıcı tarafından okunabilir/yazılabilir olduğunu kontrol edin. Konteyner içindeki kullanıcı, dışarıdakiyle aynı UID’ye sahiptir.

Kütüphane bulunamadı (CUDA): --nv bayrağını kullandığınızdan ve SLURM script’inde gres=gpu talep ettiğinizden emin olun. nvidia-smi komutunu konteynerde çalıştırarak GPU görünürlüğünü doğrulayın.

MPI sürüm uyumsuzluğu: Host’taki MPI sürümünü mpirun --version ile öğrenin ve konteyner içinde aynı ana sürümü (major version) kullanın. OpenMPI 4.x ile derlenmiş bir uygulama, OpenMPI 3.x host üzerinde çalışmayabilir.

İmaj oluşturmada fakeroot hatası: Küme yöneticisinin fakeroot özelliğini etkinleştirmesi gerekebilir. Alternatif olarak, yerel makinenizde imajı oluşturup kümeye kopyalayabilirsiniz.

Sonuç

Singularity ve Apptainer, HPC ortamlarında yazılım yönetimini köklü biçimde basitleştiren olgun teknolojilerdir. Tek imaj dosyası yaklaşımı, kullanıcı güvenlik modeli ve native GPU/MPI desteğiyle bu araçlar araştırma yazılımlarının taşınabilirliğini ve tekrarlanabilirliğini sağlamaktadır. Doğru iş akışıyla — merkezi imaj deposu, sürümlendirme ve SLURM entegrasyonu — konteyner kullanımı hem bireysel araştırmacıların hem de sistem yöneticilerinin yükünü önemli ölçüde azaltır.

Mevasis olarak HPC ortamlarında konteyner altyapısı kurulumu ve Singularity/Apptainer entegrasyonu konusunda size destek olmaktan memnuniyet duyarız. İletişim için formu doldurun.