Skip to content

Environment Pinning: uv + pyproject.toml, CUDA Version Matrix, and Container Recipes

Second half of reproducibility: pin lib versions, understand the CUDA matrix, write Docker/Apptainer recipes. Where uv beats pip+poetry by 10-100x, the CUDA 12.4 / PyTorch 2.5 stack for RTX 4090, compatibility matrix for FT frameworks (TRL, Unsloth, Axolotl).

Şükrü Yusuf KAYA
30 min read
Intermediate
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.

Frequently Asked Questions

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...

Related Content