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🎯 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)#
uvuv| İşlem | pip | poetry | uv | Konuştuğumuz şey |
|---|---|---|---|---|
| Resolve & install 80 paket (clean) | ~45 sn | ~95 sn | 3-4 sn | typical FT env |
| Lockfile regenerate | n/a | ~35 sn | 0.6 sn | dependency change |
| venv create | 4 sn | 8 sn | 0.05 sn | yeni project |
uv pip install -r requirements.txt | 30 sn | n/a | 2 sn | hızlı kurulum |
Cookbook'ta tüm Lab'lar ile pinlenir. Eğer alışkın değilsen tek bir komut yeter:
uvcurl -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 stackuv add torch==2.5.1 --index https://download.pytorch.org/whl/cu124uv add transformers==4.46.3uv add accelerate==1.1.1uv add peft==0.13.2uv add trl==0.12.2uv add bitsandbytes==0.44.1uv add datasets==3.1.0uv add tokenizers==0.20.3uv add tensorboard wandb # 3. Dev araçlarıuv add --dev pytest ruff mypy # 4. Run — uv otomatik venv ile çalıştırıruv run python train.py # Sonuç: uv.lock dosyası — tüm bağımlılıkları **tam hash** ile pinlercat uv.lock | head -20uv 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:
| Versiyon | Kaynak | Komut |
|---|---|---|
| NVIDIA Driver | nvidia-smi | host'a kurulu |
| CUDA Toolkit (host) | nvcc --version | 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:#
| Hata | Nedeni | Çözüm |
|---|---|---|
CUDA initialization: ... driver version is insufficient | driver < pytorch cuda | driver güncelle |
undefined symbol: cublasLtMatmulAlgoCheck_v8 | cublas .so mismatch | reinstall pytorch cu124 |
Error 802: system not yet initialized | WSL2 / Windows NVIDIA driver eski | NVIDIA driver güncelle |
flash_attn modulenotfound | torch cuda ile flash-attn cuda farklı | pip install flash-attn --no-build-isolation |
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 indexextra-index-url = ["https://download.pytorch.org/whl/cu124"] [tool.ruff]line-length = 100target-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:
| Framework | Versiyon | Notlar |
|---|---|---|
| Python | 3.11.x | 3.12'de bitsandbytes biraz huysuz |
| PyTorch | 2.5.1 + cu124 | 2.6 erken stage, cookbook risk almaz |
| transformers | 4.46.3 | Llama 3.3, Qwen 2.5, Gemma 3 desteği |
| accelerate | 1.1.1 | FSDP2 desteği |
| TRL | 0.12.2 | GRPOTrainer dahil |
| PEFT | 0.13.2 | DoRA, LoRA, QLoRA |
| bitsandbytes | 0.44.1 | NF4 + 8-bit AdamW |
| Unsloth | 2024.11 | 2x speedup, Llama 3.x + Qwen 2.5 |
| Axolotl | 0.5.2 | YAML-driven, multi-GPU recipe'lere |
| LLaMA-Factory | 0.9.0 | WebUI ile FT |
| vLLM | 0.6.4.post1 | LoRA hot-swap, prefix cache |
| Flash-Attention | 2.7.0.post2 | binary 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.04FROM 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 libsRUN 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/* # uvRUN curl -LsSf https://astral.sh/uv/install.sh | sh && \ mv /root/.local/bin/uv /usr/local/bin/uv # WorkdirWORKDIR /workspace # Bağımlılıkları ayrı bir layer'da pin'le — image caching için optimizeCOPY pyproject.toml uv.lock ./RUN uv sync --frozen --no-dev # Source codeCOPY . . # DefaultsENV 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=8gnum_workers > 0memlock=-1stack=67108864Apptainer/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 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.
LD_LIBRARY_PATH5. Bench: Container vs Native — Performans Farkı#
| Config | Llama 3.1 8B QLoRA, 50 step | Notlar |
|---|---|---|
| Native (Ubuntu host) | 28.4 sn | en hızlı, ama "sende çalışmıyor" riski |
| Docker (--gpus all) | 28.9 sn (+%1.8) | overhead pratikte sıfır |
| Docker + uv sync | 29.1 sn (+%2.5) | uv venv layer eklenmiş |
| Apptainer (--nv) | 28.7 sn (+%1.1) | HPC cluster için tercih |
| Docker + bridge net | 32.6 sn (+%14.8) | NCCL multi-node'da kötü |
| Docker + host net | 28.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 ( veya ).
--network=hostdocker swarm overlay✅ Bu dersin teslimi
- `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
Part 0 — Engineering Foundations
Welcome to the Fine-Tuning Cookbook: System, Stage Taxonomy, and the Reproducibility Contract
Start LearningPart 0 — Engineering Foundations
Reproducibility Stack: Seeds, cuDNN Flags, and Deterministic CUDA — End the 'Works on My Machine' Problem
Start LearningPart 0 — Engineering Foundations