Yükleniyor...

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.