Modeli üretime almak
Jupyter notebook'ta %95 doğruluk alan modeliniz var — harika! Ama gerçek dünyada kimse notebook çalıştırmıyor. Model eğitmek yarış arabasının motorunu yapmak gibi; deployment ise o motoru bir Formula 1 aracına monte edip piste çıkarmak. Bu derste notebook'tan üretime giden yolu adım adım inşa edeceğiz.
Eğitilmiş modeli diske kaydetme işlemi **serileştirme** (serialization) olarak adlandırılı…
pickle/joblib
ONNX
Model kaydetme yöntemleri karşılaştırması
| 1 | import joblib |
| 2 | from sklearn.ensemble import RandomForestClassifier |
| 3 | |
| 4 | # Eğitim |
| 5 | model = RandomForestClassifier(n_estimators=100) |
| 6 | model.fit(X_train, y_train) |
| 7 | |
| 8 | # joblib ile kaydet (sklearn için önerilen) |
| 9 | joblib.dump(model, "model.joblib") |
| 10 | |
| 11 | # Yükleme |
| 12 | loaded_model = joblib.load("model.joblib") |
| 13 | prediction = loaded_model.predict(X_test) |
Model dosyası hazır — şimdi dış dünyayla konuşması lazım. **FastAPI**, Python'un en hızlı …
FastAPI ile minimal /predict endpoint
| 1 | from fastapi import FastAPI |
| 2 | from pydantic import BaseModel |
| 3 | import joblib |
| 4 | import numpy as np |
| 5 | |
| 6 | app = FastAPI() |
| 7 | model = joblib.load("model.joblib") |
| 8 | |
| 9 | class PredictRequest(BaseModel): |
| 10 | features: list[float] |
| 11 | |
| 12 | class PredictResponse(BaseModel): |
| 13 | prediction: int |
| 14 | probability: float |
| 15 | |
| 16 | @app.post("/predict", response_model=PredictResponse) |
| 17 | def predict(req: PredictRequest): |
| 18 | X = np.array(req.features).reshape(1, -1) |
| 19 | pred = model.predict(X)[0] |
| 20 | prob = model.predict_proba(X).max() |
| 21 | return PredictResponse(prediction=int(pred), probability=float(prob)) |
💡uvicorn main:app --reload komutuyla yerel sunucuyu başlatın. http://localhost:8000/docs adresinde otomatik oluşturulan Swagger arayüzünü göreceksiniz — test etmek için harika!
"Benim bilgisayarımda çalışıyordu" — yazılımın en tehlikeli cümlesi. **Docker**, uygulaman…
ML servisi için minimal Dockerfile
| 1 | FROM python:3.11-slim |
| 2 | |
| 3 | WORKDIR /app |
| 4 | |
| 5 | COPY requirements.txt . |
| 6 | RUN pip install --no-cache-dir -r requirements.txt |
| 7 | |
| 8 | COPY model.joblib . |
| 9 | COPY main.py . |
| 10 | |
| 11 | EXPOSE 8000 |
| 12 | |
| 13 | CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] |
⚠️Model dosyasını Docker image'a gömmek basit ama tehlikeli — her model güncellemesinde yeni image build etmeniz gerekir. Üretimde modeli harici depolama (S3, GCS) veya model registry'den yükleyin.
Model canlıya çıktı, tebrikler! Ama hikaye bitmedi — gerçek dünya verileri değişir, model …
🌡️Drift Tespiti = Sağlık Kontrolü
Modeliniz bir atlet gibi düşünün. Antrenman sırasında mükemmel form gösterebilir (test seti), ama gerçek yarışta (üretim) hava değişebilir, rakipler farklı koşabilir. Düzenli sağlık kontrolü (monitoring) olmadan performans düşüşünü fark etmezsiniz. Data drift kan değerlerinin değişmesi, concept drift ise oyun kurallarının değişmesi gibidir.
Basit data drift tespiti (Kolmogorov-Smirnov testi)
| 1 | from scipy import stats |
| 2 | import numpy as np |
| 3 | |
| 4 | def detect_drift(reference_data, production_data, threshold=0.05): |
| 5 | """Her özellik için KS testi uygula""" |
| 6 | drift_detected = {} |
| 7 | for col in reference_data.columns: |
| 8 | statistic, p_value = stats.ks_2samp( |
| 9 | reference_data[col], |
| 10 | production_data[col] |
| 11 | ) |
| 12 | drift_detected[col] = p_value < threshold |
| 13 | return drift_detected |
| 14 | |
| 15 | # Kullanım |
| 16 | drift = detect_drift(X_train, X_production) |
| 17 | print(f"Drift tespit edilen özellikler: {[k for k,v in drift.items() if v]}") |
Geleneksel yazılımda CI/CD kod değişikliklerini test edip dağıtır. ML'de ek karmaşıklık va…
GitHub Actions ile basit ML CI/CD pipeline
| 1 | name: ML Pipeline |
| 2 | |
| 3 | on: |
| 4 | push: |
| 5 | branches: [main] |
| 6 | schedule: |
| 7 | - cron: '0 0 * * 0' # Haftalık yeniden eğitim |
| 8 | |
| 9 | jobs: |
| 10 | test-and-deploy: |
| 11 | runs-on: ubuntu-latest |
| 12 | steps: |
| 13 | - uses: actions/checkout@v3 |
| 14 | |
| 15 | - name: Run tests |
| 16 | run: pytest tests/ |
| 17 | |
| 18 | - name: Train model |
| 19 | run: python train.py |
| 20 | |
| 21 | - name: Validate performance |
| 22 | run: python validate.py --min-accuracy 0.90 |
| 23 | |
| 24 | - name: Build and push Docker |
| 25 | run: | |
| 26 | docker build -t ml-model:${{ github.sha }} . |
| 27 | docker push ml-model:${{ github.sha }} |
ℹ️MLOps araçları hızla olgunlaşıyor: MLflow (experiment tracking), DVC (veri versiyonlama), Evidently (monitoring), BentoML (serving). Hepsini öğrenmeye çalışmayın — bir end-to-end pipeline kurup ihtiyaca göre araç ekleyin.
✦ Quiz
Bir e-ticaret sitesinde ürün öneri modeli 6 ay sonra performans kaybetti. Müşteri demografisi aynı kaldı ama pandemi sonrası alışveriş tercihleri değişti. Bu hangi tür drift?
✦ Quiz
Hangi model serileştirme formatı cross-platform deployment için en uygun?
✦ Quiz
Docker kullanmanın ML deployment'ta en önemli avantajı nedir?
Bağlantılı Konular