İçeriğe geç

Environment Pinning: uv + pyproject.toml, CUDA Version Matrix ve Container Reçeteleri

Reproducibility'nin ikinci yarısı: lib versiyonlarını çivile, CUDA matrix'i anla, Docker/Apptainer reçetelerini yaz. uv'nin pip+poetry'yi 10-100x geçtiği noktalar, RTX 4090 için CUDA 12.4 PyTorch 2.5 stack'i, FT framework'lerinin (TRL, Unsloth, Axolotl) hangi versiyonlarının uyumlu olduğunu gösteren uyum matrisi.

Şükrü Yusuf KAYA
30 dakikalık okuma
Orta
Environment Pinning: uv + pyproject.toml, CUDA Version Matrix ve Container Reçeteleri
🎯 Bu ders bittiğinde
Cookbook'un her Lab'ını 6 ay sonra açıp yine bit-exact çalıştırabileceksin. `uv` ile virtual env'i 0.4 saniyede kuracaksın (pip'in 8-12 saniyesi yerine). Docker image'in 8GB değil ~3.5GB olacak. CUDA 12.4 yerine 12.6'ya yanlışlıkla geçtiğinde Flash-Attention'ın niye yeniden derlendiğini anlayacaksın.

1. Niye
uv
? (pip + poetry + virtualenv'i Hepsini Yer)#

uv
(Astral, Rust ile yazılı): pip + pip-tools + poetry + virtualenv'in modern, 10-100x daha hızlı halidir.
İşlempippoetryuvKonuştuğumuz şey
Resolve & install 80 paket (clean)~45 sn~95 sn3-4 sntypical FT env
Lockfile regeneraten/a~35 sn0.6 sndependency change
venv create4 sn8 sn0.05 snyeni project
uv pip install -r requirements.txt
30 snn/a2 snhızlı kurulum
Cookbook'ta tüm Lab'lar
uv
ile pinlenir. Eğer alışkın değilsen tek bir komut yeter:
curl -LsSf https://astral.sh/uv/install.sh | sh # veya: pip install uv
bash
# === FTC Lab başlangıç sequence'i (her ders için aynı) ===
mkdir ftc-ders-XX && cd ftc-ders-XX
 
# 1. pyproject.toml oluştur (Python 3.11 — cookbook standart)
uv init --python 3.11
 
# 2. Bağımlılıkları ekle — RTX 4090 + CUDA 12.4 stack
uv add torch==2.5.1 --index https://download.pytorch.org/whl/cu124
uv add transformers==4.46.3
uv add accelerate==1.1.1
uv add peft==0.13.2
uv add trl==0.12.2
uv add bitsandbytes==0.44.1
uv add datasets==3.1.0
uv add tokenizers==0.20.3
uv add tensorboard wandb
 
# 3. Dev araçları
uv add --dev pytest ruff mypy
 
# 4. Run — uv otomatik venv ile çalıştırır
uv run python train.py
 
# Sonuç: uv.lock dosyası — tüm bağımlılıkları **tam hash** ile pinler
cat uv.lock | head -20
uv ile FTC Lab başlangıç sequence'i — her ders aynı 4 adım

2. CUDA Version Matrix (En Çok Kafa Karıştıran Konu)#

CUDA'nın 3 farklı versiyonu vardır ve bunlar uyumlu ama aynı şey değil:
VersiyonKaynakKomut
NVIDIA Driver
nvidia-smi
üst-sağ köşesinde "CUDA Version: 12.6"
host'a kurulu
CUDA Toolkit (host)
nvcc --version
çıktısı
host'ta kurulu compiler
CUDA in PyTorch
torch.version.cuda
PyTorch wheel ile gelir

Kural:#

Driver CUDA ≥ PyTorch CUDA
Yani driver'ın "CUDA 12.6" derken anlatmak istediği: "12.6'ya kadar olan PyTorch wheel'leri çalışır."
RTX 4090 için cookbook'un seçimi (2026 yılı):
NVIDIA Driver ≥ 555.42 (Linux) / 555.85 (Windows) PyTorch = 2.5.1 + cu124 (CUDA 12.4 wheel) CUDA Toolkit = 12.4 (sadece custom CUDA kernel derlerken gerekir)
Niye 12.4 ve 12.6 değil? Flash-Attention 2.7 binary wheel'leri 12.4 ile gelir; 12.6 için kaynaktan derlemek 30+ dakika. Cookbook prag mat: 12.4 = "binary wheel mevcut, derleme yok, herkesin makinesinde 5 dakikada kurulur."

Yaygın hatalar:#

HataNedeniÇözüm
CUDA initialization: ... driver version is insufficient
driver < pytorch cudadriver güncelle
undefined symbol: cublasLtMatmulAlgoCheck_v8
cublas .so mismatchreinstall pytorch cu124
Error 802: system not yet initialized
WSL2 / Windows NVIDIA driver eskiNVIDIA driver güncelle
flash_attn modulenotfound
after pip install
torch cuda ile flash-attn cuda farklı
pip install flash-attn --no-build-isolation
ve aynı cu124
toml
# === pyproject.toml: cookbook'un her Lab'ı için baseline ===
[project]
name = "ftc-lab-template"
version = "0.1.0"
description = "Fine-Tuning Cookbook Lab — RTX 4090 baseline"
requires-python = ">=3.11,<3.13"
 
dependencies = [
# Core
"torch==2.5.1", # CUDA 12.4 wheel
"transformers==4.46.3", # Llama 3.3, Qwen 2.5, Gemma 3 desteği
"accelerate==1.1.1",
"peft==0.13.2", # LoRA, QLoRA, DoRA
"trl==0.12.2", # SFTTrainer, DPOTrainer, GRPOTrainer
"bitsandbytes==0.44.1", # NF4, 8-bit AdamW
"datasets==3.1.0",
"tokenizers==0.20.3",
"sentencepiece>=0.2.0",
"safetensors>=0.4.5",
"huggingface_hub>=0.26.0",
 
# Optimization
"flash-attn==2.7.0.post2", # binary wheel için cu124 zorunlu
"xformers==0.0.28.post3",
"ninja", # CUDA kernel build için
 
# Tracking & evaluation
"tensorboard>=2.18",
"wandb>=0.18",
"lm-eval==0.4.5", # benchmark
"evaluate>=0.4.3",
"rouge-score",
"sacrebleu",
 
# Utility
"tyro>=0.9", # CLI parsing (Llama-Factory'nin de tercih ettiği)
"hydra-core>=1.3", # config management
"pydantic>=2.9",
]
 
[project.optional-dependencies]
unsloth = ["unsloth==2024.11", "unsloth-zoo==2024.11"]
serving = ["vllm==0.6.4.post1", "sglang==0.3.4"]
quant = ["auto-gptq==0.7.1", "autoawq==0.2.6"]
 
[tool.uv]
# RTX 4090 + cu124 wheel index
extra-index-url = ["https://download.pytorch.org/whl/cu124"]
 
[tool.ruff]
line-length = 100
target-version = "py311"
FTC Lab pyproject.toml — RTX 4090 + CUDA 12.4 stack

3. FT Framework Uyum Matrisi (Cookbook Pin'leri)#

Cookbook 2026 başında derlendi; aşağıdaki versiyonlar tüm Lab'larda birlikte çalışır:
FrameworkVersiyonNotlar
Python3.11.x3.12'de bitsandbytes biraz huysuz
PyTorch2.5.1 + cu1242.6 erken stage, cookbook risk almaz
transformers4.46.3Llama 3.3, Qwen 2.5, Gemma 3 desteği
accelerate1.1.1FSDP2 desteği
TRL0.12.2GRPOTrainer dahil
PEFT0.13.2DoRA, LoRA, QLoRA
bitsandbytes0.44.1NF4 + 8-bit AdamW
Unsloth2024.112x speedup, Llama 3.x + Qwen 2.5
Axolotl0.5.2YAML-driven, multi-GPU recipe'lere
LLaMA-Factory0.9.0WebUI ile FT
vLLM0.6.4.post1LoRA hot-swap, prefix cache
Flash-Attention2.7.0.post2binary wheel cu124

Pin değişikliği = yeni cookbook revision#

Cookbook'taki pin'ler değişirse (örn. PyTorch 2.6 stable çıkıp test edildiğinde), README'de "v2026.05" tarzı revision damgası bumplanır ve tüm Lab'lar yeniden doğrulanır.
dockerfile
# === FTC.Dockerfile — Fine-Tuning Cookbook standart container ===
# Base: NVIDIA CUDA 12.4 + cuDNN + Ubuntu 22.04
FROM nvidia/cuda:12.4.1-cudnn-devel-ubuntu22.04
 
ENV DEBIAN_FRONTEND=noninteractive \
PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
CUBLAS_WORKSPACE_CONFIG=:4096:8 \
HF_HUB_ENABLE_HF_TRANSFER=1
 
# System libs
RUN apt-get update && apt-get install -y --no-install-recommends \
python3.11 python3.11-venv python3-pip \
git git-lfs curl wget tini build-essential \
libgl1 libglib2.0-0 && \
rm -rf /var/lib/apt/lists/*
 
# uv
RUN curl -LsSf https://astral.sh/uv/install.sh | sh && \
mv /root/.local/bin/uv /usr/local/bin/uv
 
# Workdir
WORKDIR /workspace
 
# Bağımlılıkları ayrı bir layer'da pin'le — image caching için optimize
COPY pyproject.toml uv.lock ./
RUN uv sync --frozen --no-dev
 
# Source code
COPY . .
 
# Defaults
ENV TRANSFORMERS_CACHE=/workspace/.cache/huggingface \
HF_HOME=/workspace/.cache/huggingface
 
ENTRYPOINT ["/usr/bin/tini", "--"]
CMD ["uv", "run", "python", "train.py"]
FTC.Dockerfile — RTX 4090 + CUDA 12.4 + uv standart container

4. Build & Run#

# Build (~3-4 dakika, ~3.5GB final image — multi-stage kullanırsan 2.8GB) docker build -t ftc:v2026.05 -f FTC.Dockerfile . # Run (RTX 4090 + dataset/cache mount) docker run --rm -it \ --gpus all \ --shm-size=8g \ --ulimit memlock=-1 --ulimit stack=67108864 \ -v $PWD:/workspace \ -v $HOME/.cache/huggingface:/workspace/.cache/huggingface \ -e HF_TOKEN=$HF_TOKEN \ -e WANDB_API_KEY=$WANDB_API_KEY \ ftc:v2026.05 \ uv run python train.py --config configs/llama3_8b_qlora.yaml
--shm-size=8g
zorunlu — DataLoader
num_workers > 0
ile shared memory üzerinden tensor geçer; default 64MB yetersizdir, run "Bus error" ile düşer.
memlock=-1
ve
stack=67108864
GPUDirect Storage + CUDA pinned memory için.

Apptainer/Singularity (HPC kuvvet)#

# Docker image'ini SIF'e dönüştür (HPC cluster için) apptainer build ftc.sif docker-daemon://ftc:v2026.05 # Çalıştır apptainer run --nv \ --bind $PWD:/workspace \ --bind $HOME/.cache/huggingface:/workspace/.cache/huggingface \ ftc.sif uv run python train.py
🐛 Failure Mode Drill #2 — 'Container'da çalışıyor host'ta çalışmıyor (ya da tersi)'
Senaryo: Aynı kod, container'da loss 2.3'e iniyor, host'ta 2.7'de duruyor. Olası nedenler: (a) Host'ta CUDA toolkit 12.6 ama PyTorch 12.4 wheel kullanıyor → numerik küçük farklar. (b) Host'ta
LD_LIBRARY_PATH
farklı bir libcublas yüklüyor → `ldconfig -p | grep cublas` ile kontrol et. (c) Container'da `HF_HUB_ENABLE_HF_TRANSFER=1` ama host'ta yok → daha hızlı download ama checksum farklı dosya seçilebilir. (d) Container'da daha yeni transformers (uv lock farklı çözmüş olabilir) → `uv lock --check`. Drill: 4 hipotezi de tek tek devre dışı bırak, hangisinin kök neden olduğunu bul.

5. Bench: Container vs Native — Performans Farkı#

ConfigLlama 3.1 8B QLoRA, 50 stepNotlar
Native (Ubuntu host)28.4 snen hızlı, ama "sende çalışmıyor" riski
Docker (--gpus all)28.9 sn (+%1.8)overhead pratikte sıfır
Docker + uv sync29.1 sn (+%2.5)uv venv layer eklenmiş
Apptainer (--nv)28.7 sn (+%1.1)HPC cluster için tercih
Docker + bridge net32.6 sn (+%14.8)NCCL multi-node'da kötü
Docker + host net28.8 sn (+%1.4)multi-node için tercih
Sonuç: Container overhead, doğru flag'lerle %2-3 — kabul edilebilir bir vergi. Eğer multi-node planın varsa kesinlikle host network (
--network=host
veya
docker swarm overlay
).
✅ Bu dersin teslimi
  1. `uv` kur, yukarıdaki `pyproject.toml`'u kopyala, `uv sync` çalıştır → 30 saniye içinde tüm bağımlılıklar pin'lenmiş bir venv'in olsun. 2) `FTC.Dockerfile`'i build et. 3) Container içinde `python -c 'import torch; print(torch.version.cuda)'` çalıştır → 12.4 göstermeli. 4) Sonraki ders: 0.4 — Container & Slurm Recipes for Multi-Node.

Sık Sorulan Sorular

Hayır — pip + venv ile aynı pin'leri tutabilirsin (\`requirements.txt\` + \`pip install -r\`). Cookbook'un her Lab'ı için \`requirements-pip.txt\` alternatifi de sağlanacak. Sadece bir 8B QLoRA için \`pip install\` ~12 saniye, \`uv sync\` ~3 saniye. Sweep'te 20 farklı env varsa 4 dakika vs 1 dakika fark eder.

Yorumlar & Soru-Cevap

(0)
Yorum yazmak için giriş yap.
Yorumlar yükleniyor...

İlgili İçerikler