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
.sifdosyası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.
| Özellik | Docker | Singularity / Apptainer |
|---|---|---|
| Root yetkisi gerekir mi? | Evet (daemon) | Hayır |
| İmaj formatı | Katmanlı (overlay) | Tek dosya (.sif) |
| HPC iş zamanlayıcısı desteği | Sınırlı | Tam |
| GPU (CUDA) desteği | nvidia-docker ile | --nv bayrağıyla |
| MPI entegrasyonu | Karmaşık | Doğrudan |
| Kullanıcı yalıtımı | PID namespace | Host 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.