Git Rehberi: AI ve Makine Öğrenmesi Projelerinde Versiyon Kontrolü
Yazar: Burak Balkı | Kategori: AI & Machine Learning | Okuma Süresi: 9 dk
Bu kapsamlı rehber, Git'in dağıtık mimarisini, AI ve ML projelerindeki spesifik kullanım senaryolarını, Git LFS ile büyük veri yönetimini ve profesyonel iş a...
## Git Nedir? Dağıtık Versiyon Kontrol Sistemi Mimarisi
**Git**, modern yazılım geliştirme süreçlerinin kalbinde yer alan, hız ve veri bütünlüğü odaklı, **dağıtık bir versiyon kontrol sistemidir (DVCS)**. 2005 yılında Linus Torvalds tarafından Linux çekirdeği geliştirme süreci için tasarlanan Git, geleneksel merkezi sistemlerin (SVN gibi) aksine, her geliştiricinin yerel makinesinde projenin tam bir kopyasını ve geçmişini barındırmasına olanak tanır.
AI ve Machine Learning (ML) ekosisteminde Git, sadece kodun değil, aynı zamanda model mimarilerinin ve eğitim betiklerinin izlenebilirliğini sağlar. Git'in temelinde yanan yapı bir **DAG (Directed Acyclic Graph)** yani yönlü asiklik grafiktir. Her bir commit, projenin o anki durumunun bir anlık görüntüsünü (snapshot) temsil eder ve bir önceki commit'e referans verir.
## Git Kurulumu ve AI Geliştirme Ortamı Yapılandırması
Git'i sisteminize kurmak, profesyonel bir ML iş akışının ilk adımıdır. Kurulum sonrası kimlik bilgilerinin tanımlanması, commit'lerin kime ait olduğunun takibi açısından kritiktir.
```bash
# Git kurulumu (Ubuntu/Debian)
sudo apt update
sudo apt install git
# Global kullanıcı yapılandırması
git config --global user.name "Ad Soyad"
git config --global user.email "email@example.com"
# Varsayılan editör seçimi (Örn: VS Code)
git config --global core.editor "code --wait"
```
AI projelerinde `.gitignore` dosyası hayati önem taşır. Büyük veri setlerinin (`.csv`, `.h5`, `.pth`) veya geçici model ağırlıklarının yanlışlıkla repoya gönderilmesini engellemek için bu dosya titizlikle hazırlanmalıdır.
## Git Nesne Modeli: Blobs, Trees, Commits ve Tags
Git'in iç yapısını anlamak, karmaşık hataları çözmek için gereklidir. Git verileri dört ana nesne tipinde saklar:
1. **Blobs (Binary Large Objects):** Dosya içeriklerini saklar. Dosya adı veya izinleri burada yer almaz, sadece veri vardır.
2. **Trees:** Dosya sistemi dizinlerini temsil eder. Blob'lara ve diğer Tree nesnelerine işaret eder, dosya adlarını depolar.
3. **Commits:** Belirli bir Tree nesnesine, yazara, zamana ve bir önceki commit'e (parent) referans verir.
4. **Tags:** Belirli bir commit'e verilen kalıcı bir isimdir (Örn: `v1.0-alpha-model`).
| Nesne Tipi | Fonksiyonu | ML Projesindeki Karşılığı |
| :--- | :--- | :--- |
| **Blob** | Veri Saklama | `train.py` içeriği |
| **Tree** | Yapılandırma | Proje dizin hiyerarşisi |
| **Commit** | Snapshot | Modelin belirli bir eğitim aşaması |
| **Tag** | Etiketleme | Yayına alınan model versiyonu |
## Temel Git Komutları ve ML İş Akışları
Bir ML projesine başlarken kullanılan temel komutlar, projenin yaşam döngüsünü yönetir. `git init` ile başlayan süreç, `git push` ile uzak sunucuya aktarılır.
```bash
# Yeni bir depo başlatma
git init ai-project-repo
# Değişiklikleri izleme alanına (staging area) ekleme
git add preprocess.py
# Değişiklikleri kaydetme
git commit -m "Feat: Veri ön işleme betiğine normalizasyon eklendi"
# Mevcut durumu kontrol etme
git status
```
AI projelerinde deneylerin takibi için açıklayıcı commit mesajları yazmak, geriye dönük analizlerde büyük kolaylık sağlar. Her commit, atomik (tek bir amaca hizmet eden) olmalıdır.
## Dallanma (Branching) Stratejileri ve Model Deneyleri
Git'in en güçlü özelliklerinden biri dallanmadır. ML projelerinde farklı hiperparametre setlerini veya model mimarilerini denemek için dallar kullanılır.
```bash
# Yeni bir deney dalı oluşturma
git checkout -b experiment/resnet-50-optimization
# Dalları listeleme
git branch
# Ana dala geri dönme
git checkout main
# Deney dalını birleştirme
git merge experiment/resnet-50-optimization
```
> **Not:** `git merge` yerine `git rebase` kullanımı, daha temiz ve lineer bir geçmiş oluşturmanıza yardımcı olur, ancak paylaşılan dallarda dikkatli kullanılmalıdır.
## AI Projelerinde Git LFS (Large File Storage) Kullanımı
Standart Git depoları, büyük ikili (binary) dosyaları yönetmek için tasarlanmamıştır. GB boyutundaki veri setleri veya model ağırlıkları (`.pt`, `.ckpt`) için **Git LFS** kullanılmalıdır. LFS, büyük dosyaları uzak bir depoda saklar ve Git içinde sadece bu dosyalara işaret eden pointer dosyaları tutar.
```bash
# Git LFS kurulumu ve etkinleştirme
git lfs install
# Belirli dosya türlerini LFS ile takip etme
git lfs track "*.weights"
git lfs track "*.h5"
# Nelerin takip edildiğini görme
git lfs ls-files
```
Bu yöntem, deponun boyutunun şişmesini önler ve `git clone` işlemlerini hızlandırır.
## İşbirliği ve Uzak Depo (Remote Repository) Yönetimi
Ekip çalışmasında GitHub, GitLab veya Bitbucket gibi platformlar kullanılır. Uzak depolarla etkileşim `fetch`, `pull` ve `push` komutları üzerinden yürütülür.
```bash
# Uzak depoyu ekleme
git remote add origin https://github.com/user/ai-model.git
# Değişiklikleri gönderme
git push -u origin main
# Uzak depodaki değişiklikleri alma
git pull origin main
```
## Git Hooks ile Otomasyon ve Model Validasyonu
Git Hooks, belirli olaylar (commit, push vb.) gerçekleşmeden önce çalışan betiklerdir. AI projelerinde, kodun PEP8 standartlarına uygunluğunu veya veri setinin eksiksizliğini kontrol etmek için kullanılır.
```bash
# .git/hooks/pre-commit dosyası örneği
#!/bin/sh
# Unit testleri çalıştır
pytest tests/test_data_loader.py
if [ $? -ne 0 ]; then
echo "Testler başarısız, commit engellendi!"
exit 1
fi
```
## AI Projeleri İçin Git Best Practices (En İyi Uygulamalar)
1. **Büyük Verileri Repoda Tutmayın:** Veri setleri için DVC (Data Version Control) veya Git LFS kullanın.
2. **Anlamlı Commit Mesajları:** `git commit -m "fixed"` yerine `git commit -m "Fix: Learning rate scheduler logic error in Trainer class"` tercih edin.
3. **Küçük ve Sık Commit:** Büyük değişiklikleri tek bir commit'te toplamak yerine, mantıksal parçalara bölün.
4. **Feature Branch Kullanımı:** Her yeni özellik veya deney için yeni bir dal açın.
5. **Hassas Verileri Gizleyin:** `.env` dosyalarını ve API anahtarlarını asla repoya eklemeyin.
## Git Performans Optimizasyonu ve Büyük Depoların Yönetimi
Büyük ölçekli ML projelerinde Git performansı düşebilir. Bu durumda `git gc` (garbage collection) komutu ile gereksiz dosyalar temizlenebilir ve veri yapısı optimize edilebilir.
```bash
# Gereksiz dosyaları temizle ve depoyu optimize et
git gc --prune=now --aggressive
# Depo boyutunu kontrol et
du -sh .git
```
## Yaygın Git Hataları ve Çözüm Yolları
**Hata 1: Yanlışlıkla büyük bir dosyayı commit etmek.**
*Çözüm:* `git rm --cached ` komutu ile dosyayı izleme alanından çıkarın ve `.gitignore` dosyasına ekleyin.
**Hata 2: Merge Conflict (Birleştirme Çatışması).**
*Çözüm:* Çatışan dosyaları açın, manuel olarak düzenleyin ve tekrar commit edin.
```bash
# Çatışma durumunda durumu görme
git status
# Çatışmayı çözdükten sonra
git add resolved_file.py
git commit
```
## Sık Sorulan Sorular (SSS)
1. **Git ve GitHub arasındaki fark nedir?**
Git yerel bir araçtır; GitHub ise Git depolarını barındıran bulut tabanlı bir platformdur.
2. **Git LFS kullanmadan büyük model dosyalarını nasıl saklarım?**
DVC (Data Version Control) gibi araçlar, S3 veya Google Cloud Storage ile entegre çalışarak daha iyi bir alternatif sunabilir.
3. **Commit mesajını nasıl değiştirebilirim?**
Henüz push yapmadıysanız `git commit --amend` komutunu kullanabilirsiniz.
4. **Yanlışlıkla sildiğim bir dalı geri getirebilir miyim?**
Evet, `git reflog` komutu ile silinen dalın son commit ID'sini bulup tekrar oluşturabilirsiniz.
5. **Git merge ve rebase arasındaki temel fark nedir?**
Merge, iki dalın geçmişini birleştirir ve yeni bir merge commit oluşturur; rebase ise mevcut dalın commit'lerini hedef dalın üzerine yeniden yazar.
## Özet ve Sonuç
Git, AI ve Machine Learning projelerinde sadece bir versiyon kontrol aracı değil, aynı zamanda işbirliği ve projenin sürdürülebilirliği için temel bir altyapıdır. Teknik derinliği anlamak, dal stratejilerini doğru uygulamak ve Git LFS gibi modern çözümleri kullanmak, karmaşık ML modellerinin geliştirme sürecini standartlaştırır. Profesyonel bir geliştirici olarak Git hakimiyeti, kodunuzun ve modellerinizin güvenliğini ve izlenebilirliğini garanti altına alır.