Bu proje, Docker, MLflow, DVC, Jenkins ve Git kullanarak basit ama gerçekçi bir MLOps pipeline örneği sunar. Amaç, bir üniversite öğrencisinin uçtan uca temel bir MLOps mimarisini deneyerek öğrenmesini sağlamaktır.
Bu projede üç ana bileşen vardır:
-
MLflow Tracking Server
mlflowservisi ile Docker içinde çalışır.- SQLite backend ve yerel klasörde artefakt saklama kullanır.
- Host makineden
http://localhost:5000adresi üzerinden erişilir.
-
Eğitim Uygulaması (app)
- Basit bir Python/Scikit-learn uygulaması.
- Kaggle API ile bir veri seti indirir (DVC
downloadaşaması). - DVC ile iki aşamalı pipeline tanımlıdır:
download: Kaggle'dan veri indirmetrain: model eğitimi ve metrik hesaplama
- Metrikleri ve modeli hem dosya olarak hem de MLflow'a loglar.
-
Jenkins CI/CD
jenkinsservisi ile Docker içinde çalışır.- Kod değiştiğinde pipeline çalıştırarak:
- Bağımlılıkları kurar.
dvc reproile (Kaggle indirme + eğitim) pipeline'ını çalıştırır.- Metrikleri gösterir ve artefaktları arşivler.
- DVC remote'a artefaktları push eder.
- Git deposuna otomatik commit + push yapar.
- Aynı Docker ağı üzerinden
http://mlflow:5000adresindeki MLflow servisine erişebilir.
- Docker / Docker Desktop
- Git
- (İsteğe bağlı) DVC'nin lokal kurulu olması (
pip install dvc[all]) - Kaggle hesabı ve Kaggle API anahtarı
- Yeni bir klasör oluşturun ve proje adını verin:
mkdir mlops-mlflow-dvc-jenkins
cd mlops-mlflow-dvc-jenkins-
Bu repodaki dosyaları buraya kopyalayın.
-
Git deposu oluşturun:
git init
git add .
git commit -m "İlk MLOps iskeleti"- DVC'yi başlatın:
dvc init
git add .dvc .dvcignore
git commit -m "DVC init"Not: DVC remote (örneğin S3, Azure, GDrive veya lokal bir klasör) eklemek için bir sonraki bölümdeki adımlara bakın.
Bu proje, Kaggle API üzerinden veri indirmek için tasarlanmıştır. İndirme işlemi:
app/src/download_data.pyscripti- DVC
downloadstage'i - Jenkins pipeline içindeki
DVC ile Kaggle İndir + Eğitimaşaması
tarafından kullanılır.
Kaggle API'yi kullanmak için bir Kaggle hesabınız olmalı ve API anahtarı oluşturmalısınız.
- Kaggle sitesine gidin (https://www.kaggle.com/) ve giriş yapın.
- Sağ üstteki profil menüsünden: Account sayfasına gidin.
- Aşağıda API bölümünde "Create New API Token" butonuna tıklayın.
kaggle.jsondosyasını bilgisayarınıza indirecektir.
Yerel makinenizde:
export KAGGLE_USERNAME="kullanici_adiniz"
export KAGGLE_KEY="kaggle_api_anahtariniz"veya ~/.kaggle/kaggle.json dosyasını uygun şekilde kaydedebilirsiniz.
Jenkins içinde:
- Jenkins web arayüzüne gidin.
- Manage Jenkins → Manage Credentials → (Global) → Add Credentials.
- İki adet "Secret text" credential tanımlayın:
kaggle-username-id→ içinde Kaggle kullanıcı adınızkaggle-key-id→ içinde Kaggle API anahtarınız
- Jenkinsfile içindeki
withCredentialsbloğu bu ID'leri kullanır.
params.yaml dosyasında Kaggle veri setini ve dosya adını şu şekilde tanımlarsınız:
kaggle:
dataset: "owner/dataset-slug" # Örnek: "zynicide/wine-reviews"
file: "file.csv" # Örnek: "winemag-data-130k-v2.csv"
train:
test_size: 0.2
random_state: 42
n_estimators: 100
max_depth: 5
target_column: "target"kaggle.datasetvekaggle.filealanlarının Kaggle üzerindeki veri seti ile birebir uyumlu olması gerekir.- Örneğin Kaggle sayfasında:
https://www.kaggle.com/datasets/zynicide/wine-reviewsisedataset: "zynicide/wine-reviews"
- Örneğin Kaggle sayfasında:
train.target_columnalanı, veri setinizdeki hedef kolonun ismi ile aynı olmalıdır.- Örneğin bir sınıflandırma problemi için
quality,label,targetgibi.
- Örneğin bir sınıflandırma problemi için
download stage, Kaggle'dan veriyi indirip data/raw/kaggle_raw.csv dosyasına kaydeder. train stage ise bu dosyayı kullanarak modeli eğitir.
Önce imajları build edin:
docker compose builddocker compose up -d mlflow- MLflow arayüzü:
http://localhost:5000
Kaggle environment değişkenlerini terminalinizde ayarladıktan sonra:
export KAGGLE_USERNAME="kullanici_adiniz"
export KAGGLE_KEY="kaggle_api_anahtariniz"
docker compose run --rm app dvc reproveya daha basit olarak sadece eğitim scriptini çalıştırmak isterseniz:
docker compose run --rm app python src/train.pyNot: Tam DVC pipeline için önerilen yol
dvc reprokomutunu kullanmaktır; böylecedownloadvetrainaşamaları sırayla çalışır.
Bu adımlar:
download_data.pyile Kaggle veri setini indirir (DVCdownloadaşaması).train.pyile modeli eğitir ve:models/model.pklmetrics.json- MLflow run (MLflow arayüzünde görülebilir) üretir.
Veri ve model artefaktlarını Git yerine DVC remote üzerinde saklamak daha doğrudur. Örneğin:
- Lokal klasör
- S3 bucket
- Azure Blob Storage
- Google Drive
Örnek DVC remote tanımlama:
dvc remote add -d origin /path/to/dvc-storage
dvc remote default origin
git add .dvc/config
git commit -m "DVC remote eklendi"Bu ayarları yaptıktan sonra:
dvc pushkomutu veri/model artefaktlarını remote'a yükler.
Jenkins pipeline içindeki "DVC Snapshot ve Remote Push" stage'i, aynı işlemi CI tarafında yapar:
dvc statusile değişiklikleri kontrol eder.dvc pushile güncel artefaktları remote'a gönderir.
Önemli: DVC remote URL'sini ve olası erişim credential'larını kendi ortamınıza göre ayarlamalısınız.
Jenkins pipeline, başarılı bir çalıştırmadan sonra otomatik olarak:
- DVC dosyalarını ve diğer değişen dosyaları
git add .ile ekler. git commit -m "CI: update DVC snapshot [skip ci]"ile commit atar.git push origin mainbenzeri bir komutla uzak repoya push eder.
Bunun için:
- Git remote'u ayarlayın:
git remote add origin <SENIN_GIT_REMOTE_URLIN>
git branch -M main
git push -u origin main- Jenkins'te Git credential tanımlayın:
- Manage Jenkins → Manage Credentials → (Global) → Add Credentials
- Tür olarak:
- HTTPS kullanıyorsanız: "Username with password" (kullanıcı adı + token/şifre)
- SSH kullanıyorsanız: "SSH Username with private key"
- Örneğin
git-credentials-idadında bir credential oluşturun.
- Jenkinsfile içindeki
withCredentialsbloğu bu ID'yi kullanır:
- Kullanıcı adı ve token/şifre,
GIT_USERNAMEveGIT_PASSWORDdeğişkenlerine atanır. git pushkomutu bu bilgileri kullanarak uzak repoya push eder.
Uyarı: Gerçek projelerde erişim yetkilerini dikkatli yönetin, sadece gerekli izinlere sahip token/anahtarları kullanın.
- Jenkins servisini Docker ile başlatın:
docker compose up -d jenkins- Tarayıcıdan Jenkins arayüzüne gidin:
- Adres:
http://localhost:8080
-
Gerekirse ilk kurulum ve kullanıcı oluşturma adımlarını tamamlayın.
-
Yeni bir pipeline job oluşturun:
- New Item > bir ad verin (örn.
mlops-demo-pipeline) > Pipeline seçin. - Pipeline sekmesinde:
- Definition: "Pipeline script from SCM"
- SCM: Git
- Repository URL: Bu repo'nun Git adresi
- Script Path:
Jenkinsfile
- Job'ı kaydedip çalıştırın.
Pipeline aşamaları:
- Kodları Getir
- Git repo'dan kodu çeker.
- Python ve Bağımlılıkları Kur
app/requirements.txtiçindeki Python paketlerini kurar.
- DVC ile Kaggle İndir + Eğitim
dvc reproiledownloadvetrainstage'lerini çalıştırır.dvc metrics showile metrikleri konsola yazar.
- MLSecOps Denetimi (Şablon)
- İleride eklenecek güvenlik kontrolleri için yer tutucu.
- DVC Snapshot ve Remote Push
dvc statusile kontrol,dvc pushile DVC remote'a artefakt gönderimi.
- Artefaktları Arşivle
metrics.json,dvc.lockvemodels/model.pkldosyalarını build artefaktı olarak saklar.
- Git Push (CI Sonrası)
- Değişiklikleri commit ve push eder.
MLflow arayüzü http://localhost:5000 adresinden açılır. Buradan:
demo-mlops-pipelinedeneyini,- Her çalıştırma (run) için:
- Hiperparametreler
- Metrikler (accuracy, f1_score)
- Model artefaktı
görüntülenebilir.
Bu proje, gerçek bir üretim ortamının basitleştirilmiş bir versiyonudur:
- Docker Compose ile MLflow, eğitim uygulaması ve Jenkins aynı ağda yönetilir.
- MLflow ile deney ve model versiyonları takip edilir.
- DVC ile veri ve eğitim pipeline'ı yeniden üretilebilir hale getirilir.
- Kaggle API ile dış veri kaynaklarından otomatik veri indirme sağlanır.
- Jenkins ile CI/CD süreci (otomatik eğitim, DVC push ve Git push) kurulur.
- MLSecOps için bir denetim aşaması şablon olarak eklenmiştir (daha sonra genişletilebilir).
Bu iskeleti, kendi Kaggle veri setiniz, hiperparametreleriniz ve güvenlik kontrollerinizle genişleterek daha ileri seviye MLOps senaryoları deneyebilirsiniz.