Takip et

Going Live: Su Kalitesi ML API’mi Buluta 5 Dakikada Nasıl Dağıttım?

Su kalitesi verilerini yapay zeka ile analiz edip gerçek zamanlı kararlar almak hiç bu kadar kolay olmamıştı. Makine öğrenimi API’nizi buluta saniyeler içinde dağıtın ve projelerinize hız katın.

Günümüzde çevre sorunları ve halk sağlığı endişeleri, su kalitesi izlemeyi her zamankinden daha kritik hale getiriyor. Geleneksel yöntemlerle, su örneklerinin laboratuvarlarda analiz edilmesi zaman alıcı ve maliyetli bir süreçtir. Bu gecikmeler, kirlilik tespitinde veya su kaynaklarının yönetilmesinde hayati kararların alınmasını zorlaştırabilir. Peki, bu soruna yapay zeka destekli, hızlı ve ölçeklenebilir bir çözüm bulmak mümkün mü? Kesinlikle evet! Makine öğrenimi (ML) modelleri sayesinde, su kalitesi verilerini anlık olarak analiz edebilir, olası sorunları hızla tespit edebilir ve hatta gelecekteki eğilimleri tahmin edebiliriz. Ancak bu güçlü modelleri gerçek dünyada faydalı hale getirmek için, onlara erişilebilir bir arayüz sunmamız ve bulut ortamında verimli bir şekilde çalıştırmamız gerekiyor.

İşte tam bu noktada, bir Makine Öğrenimi API’sinin buluta dağıtımı devreye giriyor. Bir API (Uygulama Programlama Arayüzü) ile ML modelinizi bir web servisi olarak sunabilir, böylece diğer uygulamalar (mobil uygulamalar, web siteleri, otomasyon sistemleri) modelinizle kolayca etkileşime geçebilir. Bulut platformları ise bu API’yi yüksek erişilebilirlik, ölçeklenebilirlik ve uygun maliyetle çalıştırmanın en etkili yolunu sunar. Bu makalede, bir su kalitesi ML modelini alıp, Flask ile bir API’ye dönüştürmeyi, Docker ile paketlemeyi ve sonunda Azure gibi bir bulut platformuna sadece birkaç dakikada nasıl dağıtacağınızı adım adım keşfedeceğiz. Amacımız, karmaşık görünen bu süreci basitleştirmek ve projenizi “canlıya” almanın ne kadar hızlı ve erişilebilir olduğunu göstermek. Artık manuel kontrollerle zaman kaybetmek yerine, veriye dayalı, akıllı ve anlık kararlar alabiliriz. Hazırsanız, suyun geleceğini şekillendirmeye başlayalım!

Temel Taşlar: Su Kalitesi ML API Nedir ve Neden Önemlidir?

Makine öğrenimi projelerinin laboratuvar ortamından çıkıp gerçek dünya problemlerine çözüm sunabilmesi için erişilebilir olması esastır. İşte bu erişilebilirliği sağlayan temel yapı taşları: ML modelleri, API’ler ve bulut bilişim. Öncelikle, “Su Kalitesi ML API” terimini biraz daha açalım. Basitçe ifade etmek gerekirse, bu, su numunelerine ait çeşitli parametreleri (pH, iletkenlik, çözünmüş oksijen, bulanıklık, sıcaklık vb.) girdi olarak alan ve belirli bir su kalitesi ölçütünü (örneğin, içilebilir olup olmadığı, kirlilik seviyesi, belirli bir hastalığa yol açma potansiyeli) tahmin eden bir makine öğrenimi modelini bir web servisi aracılığıyla sunan bir arayüzdür. Bu arayüz, genellikle HTTP protokolü üzerinden çalışır ve JSON formatında veri alışverişi yapar. Diğer sistemler, bu API’ye belirli parametrelerle bir istek göndererek modelin tahmin sonucunu alabilirler.

Peki, bu neden bu kadar önemli? Bir vaka analizi ile açıklayalım: Türkiye’nin önemli şehirlerinden biri olan İzmir’deki Büyükşehir Belediyesi Su ve Kanalizasyon İdaresi (İZSU), şehrin içme suyu kaynaklarını ve arıtma tesislerinden çıkan suyu sürekli olarak izlemekle yükümlü. Geleneksel yöntemlerle, su kalitesi testleri örneklerin toplanmasını, laboratuvara taşınmasını ve günlerce süren analizleri gerektiriyordu. Bu durum, ani bir kirlilik vakasında veya mevsimsel değişikliklerde hızlı tepki verme yeteneklerini sınırlıyordu. İşte burada bir Su Kalitesi ML API’si devreye giriyor. İZSU, sensörlerden gelen anlık pH, ORP, iletkenlik, sıcaklık gibi verileri bu API’ye göndererek, suyun içilebilirlik durumunu veya kirlilik riskini saniyeler içinde tahmin edebilir. Bu sayede, potansiyel bir sorunu erken aşamada tespit edebilir, halkı bilgilendirebilir ve gerekli önlemleri hızla alabilirler. Ayrıca, API sayesinde elde edilen tahminler, su arıtma süreçlerinin optimizasyonu için de kullanılabilir, böylece enerji ve kimyasal tüketimi azaltılabilir.

Bu yaklaşımın temel avantajları şunlardır:

  • Hız ve Gerçek Zamanlılık: Karar verme süreçlerini hızlandırır, anlık tehditlere karşı erken uyarı mekanizmaları oluşturur.
  • Ölçeklenebilirlik: Bulut platformları sayesinde, istek sayısı arttığında API otomatik olarak ölçeklenebilir, performans düşüşü yaşanmaz.
  • Erişilebilirlik: Geliştiricilerin ML modeline kolayca entegre olmasını sağlar, farklı uygulamalardan (mobil, web, IoT) erişime olanak tanır.
  • Maliyet Etkinliği: Bulutun kullandıkça öde modeli, donanım yatırımı yapmadan güçlü bir altyapı kullanma imkanı sunar.
  • Otomasyon: Su kalitesi izleme ve raporlama süreçlerini otomatikleştirir, insan hatasını minimize eder.

Bu temel bileşenleri anladığımıza göre, şimdi ML modelimizi ve API’mizi nasıl hazırlayacağımıza geçebiliriz.

Hazırlık Aşaması: ML Modelimizi ve API’mizi Nasıl Oluştururuz?

Buluta dağıtım yapmadan önce, kalbinde makine öğrenimi modelinizin olduğu bir API oluşturmamız gerekiyor. Bu bölümde, su kalitesi verilerini tahmin edecek basit bir ML modelini nasıl eğiteceğinizi ve Flask mikro web çerçevesini kullanarak bu modeli bir RESTful API aracılığıyla nasıl sunacağınızı adım adım ele alacağız.

Veri Seti ve Model Seçimi: Su Kalitesi Tahmini İçin İlk Adımlar

Su kalitesi tahmini için genellikle pH, iletkenlik, çözünmüş oksijen, bulanıklık, klor seviyesi, sıcaklık gibi parametreleri içeren veri setleri kullanılır. Bu makale için, elimizde böyle bir veri setinin olduğunu ve “içilebilir” veya “içilemez” gibi ikili bir sınıflandırma tahmini yapacağımızı varsayalım. Python’da scikit-learn kütüphanesi ile basit bir model oluşturalım. Random Forest Classifier, bu tür görevler için oldukça popüler ve etkili bir seçenektir.

İlk olarak, ML modelimizi eğitelim ve daha sonra dağıtım için kaydedelim. Bir model.pkl dosyasına kaydedeceğiz. Aşağıdaki kod bloğu, bu süreci basitleştirilmiş bir şekilde göstermektedir:


import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
import joblib

# Örnek bir veri seti oluşturalım
# Gerçek senaryoda bu veriler sensörlerden veya mevcut veritabanlarından gelecektir.
data = {
    'ph': [7.5, 6.8, 8.1, 7.0, 6.5, 7.8, 7.2, 6.9, 8.0, 7.1],
    'hardness': [180, 160, 200, 175, 150, 190, 185, 165, 195, 170],
    'solids': [20000, 15000, 25000, 18000, 12000, 22000, 21000, 16000, 24000, 19000],
    'chloramines': [7.0, 6.5, 7.8, 6.8, 6.0, 7.5, 7.1, 6.6, 7.7, 6.9],
    'sulfate': [350, 320, 380, 330, 310, 360, 340, 325, 370, 335],
    'conductivity': [400, 350, 450, 380, 320, 420, 410, 360, 440, 390],
    'organic_carbon': [15.0, 12.0, 18.0, 13.0, 10.0, 16.0, 14.0, 11.0, 17.0, 12.5],
    'trihalomethanes': [70, 60, 80, 65, 55, 75, 72, 62, 78, 68],
    'turbidity': [4.0, 3.0, 5.0, 3.5, 2.5, 4.5, 4.2, 3.2, 4.8, 3.8],
    'potability': [1, 1, 0, 1, 1, 0, 1, 1, 0, 1] # 1: İçilebilir, 0: İçilemez
}
df = pd.DataFrame(data)

X = df.drop('potability', axis=1)
y = df['potability']

# Veriyi eğitim ve test setlerine ayırma
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Random Forest modelini eğitme
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

# Modeli kaydetme
joblib.dump(model, 'model.pkl')
print("ML modeliniz 'model.pkl' olarak kaydedildi.")

API Geliştirme: Flask ile Tahmin Servisi Oluşturma

Şimdi sıra geldi bu makine öğrenimi modelini bir API üzerinden sunmaya. Python ekosisteminde bunun için Flask oldukça hafif ve hızlı bir seçenektir. app.py adında bir dosya oluşturup aşağıdaki kodu içine yerleştirelim:


from flask import Flask, request, jsonify
import joblib
import pandas as pd
import logging

# Loglama ayarları
logging.basicConfig(level=logging.INFO)

app = Flask(__name__)

# Modeli yükleme
try:
    model = joblib.load('model.pkl')
    logging.info("ML modeli başarıyla yüklendi.")
except Exception as e:
    logging.error(f"Model yüklenirken hata oluştu: {e}")
    model = None # Model yüklenemezse hata durumu
    
# API sağlık kontrolü (health check)
@app.route('/health', methods=['GET'])
def health_check():
    return jsonify({"status": "healthy", "model_loaded": model is not None}), 200

@app.route('/predict', methods=['POST'])
def predict():
    if model is None:
        return jsonify({"error": "ML modeli yüklenemedi. Lütfen sunucu loglarını kontrol edin."}), 500

    try:
        data = request.get_json(force=True)
        logging.info(f"Gelen istek verisi: {data}")

        # Tahmin için gerekli özelliklerin listesi (model eğitiminde kullanılan sıra ile)
        features = [
            'ph', 'hardness', 'solids', 'chloramines', 'sulfate',
            'conductivity', 'organic_carbon', 'trihalomethanes', 'turbidity'
        ]
        
        # Gelen veriyi DataFrame'e dönüştürme ve sıralama
        input_df = pd.DataFrame([data], columns=features)
        
        prediction = model.predict(input_df)
        prediction_proba = model.predict_proba(input_df)

        result = {
            'prediction': int(prediction[0]), # 1 veya 0
            'probability_potable': round(prediction_proba[0][1], 4), # İçilebilir olma olasılığı
            'probability_not_potable': round(prediction_proba[0][0], 4) # İçilemez olma olasılığı
        }
        logging.info(f"Tahmin sonucu: {result}")
        return jsonify(result)

    except KeyError as e:
        logging.error(f"Gerekli anahtar eksik: {e}. İstekteki verileri kontrol edin.")
        return jsonify({"error": f"Gerekli bir özellik eksik: {e}. Lütfen tüm su kalitesi parametrelerini sağlayın."}), 400
    except Exception as e:
        logging.error(f"Bir hata oluştu: {e}", exc_info=True)
        return jsonify({"error": f"Tahmin sırasında beklenmedik bir hata oluştu: {e}"}), 500

if __name__ == '__main__':
    app.run(debug=True, host='0.0.0.0', port=5000)

Bu web API kodu, /predict adresine yapılan POST isteklerini dinler. Gelen JSON verisindeki su kalitesi parametrelerini alır, yüklü ML modelini kullanarak bir tahmin yapar ve bu tahmini JSON formatında geri döndürür. Ayrıca, modelin yüklenip yüklenmediğini kontrol etmek için bir /health endpoint'i de ekledik. Bu, bulut dağıtımlarında servis sağlığını izlemek için önemlidir. Bu bölümle birlikte, modelimizi bir API aracılığıyla sunmaya hazırız. Şimdi sıra, bu uygulamayı buluta taşımak için bir sonraki adıma geldi: Kapsülleme ve Taşınabilirlik.

Kapsülleme ve Taşınabilirlik: Docker ile Ortamı Nasıl Yalıtırız?

ML API'nizi buluta dağıtırken karşılaşılan en yaygın sorunlardan biri "Benim bilgisayarımda çalışıyordu!" sendromudur. Farklı işletim sistemleri, Python versiyonları, kütüphane bağımlılıkları ve çevresel ayarlar, uygulamanızın farklı ortamlarda beklenen şekilde çalışmamasına neden olabilir. İşte bu noktada Docker, bir kurtarıcı olarak devreye giriyor. Docker, uygulamanızı ve tüm bağımlılıklarını tek bir, hafif, taşınabilir "konteyner" içinde paketlemenizi sağlar. Bu sayede, uygulamanızın her yerde aynı şekilde çalışacağını garanti edersiniz.

Neden Docker Kullanmalıyız?

  1. Ortam Tutarlılığı: Geliştirme, test ve üretim ortamları arasında tutarlılığı sağlar. Bağımlılık çakışmalarını ortadan kaldırır.
  2. İzolasyon: Uygulamanız ve bağımlılıkları diğer uygulamalardan izole edilir, bu da güvenlik ve kararlılığı artırır.
  3. Taşınabilirlik: Oluşturduğunuz Docker imajı, Docker'ın kurulu olduğu herhangi bir sunucuda (yerel bilgisayar, sanal makine, bulut) çalıştırılabilir.
  4. Kolay Ölçeklendirme: Konteynerler hızlıca başlatılıp durdurulabildiğinden, uygulamanızı ölçeklendirmek çok daha kolay hale gelir.
  5. Versiyonlama: Docker imajları versiyonlanabilir, böylece uygulamanızın belirli bir sürümünü her zaman yeniden oluşturabilirsiniz.

Dockerfile Oluşturma Adımları

Uygulamamızı Dockerize etmek için, projenizin kök dizininde Dockerfile adında bir dosya oluşturmamız gerekiyor. Bu dosya, Docker'a uygulamanızı nasıl derleyeceğini ve çalıştıracağını anlatan bir dizi talimat içerir. Ayrıca, Python bağımlılıklarımızı içeren bir requirements.txt dosyasına da ihtiyacımız var.


# requirements.txt içeriği
Flask==2.3.3
scikit-learn==1.3.0
pandas==2.0.3
joblib==1.3.2
gunicorn==21.2.0 # Üretim ortamında Flask uygulamasını çalıştırmak için

Şimdi Dockerfile'ımızı oluşturalım:


# Python 3.9 Alpine sürümünü temel imaj olarak kullanın. Alpine daha hafif bir dağıtımdır.
FROM python:3.9-slim-buster

# Uygulama kodunu içerecek çalışma dizinini ayarlayın
WORKDIR /app

# Gerekli bağımlılıkları kopyalayın ve kurun
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Uygulama kodunu konteynere kopyalayın
COPY . .

# ML modelinin var olduğundan emin olun
RUN if [ ! -f "model.pkl" ]; then echo "HATA: model.pkl dosyası bulunamadı!"; exit 1; fi

# Flask uygulamasının çalışacağı portu belirleyin
EXPOSE 5000

# Uygulamayı Gunicorn ile başlatın
# Gunicorn, üretim ortamında Flask uygulamasını daha sağlam ve performanslı çalıştırmak için kullanılır.
# 'app:app' ifadesi, 'app.py' dosyasındaki 'app' değişkenini (Flask uygulaması örneği) belirtir.
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]

Bu Dockerfile adım adım şunları yapar:

  1. FROM python:3.9-slim-buster: Python 3.9'un hafif bir versiyonunu temel alır.
  2. WORKDIR /app: Konteyner içinde çalışma dizinini /app olarak belirler.
  3. COPY requirements.txt .: requirements.txt dosyasını konteynere kopyalar.
  4. RUN pip install --no-cache-dir -r requirements.txt: Gerekli Python kütüphanelerini kurar.
  5. COPY . .: Projenizdeki tüm dosyaları (app.py, model.pkl vb.) konteynerin /app dizinine kopyalar.
  6. RUN if [ ! -f "model.pkl" ]; ...: model.pkl dosyasının mevcut olduğunu doğrular. Bu, modelin dağıtım için unutulmamasını sağlar.
  7. EXPOSE 5000: Konteynerin 5000 numaralı portu dinleyeceğini belirtir (bu bir belgedir, gerçek port yönlendirmesi değildir).
  8. CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]: Uygulama başlatıldığında çalışacak komutu belirler. Gunicorn, Flask uygulamasını 5000 portunda dinleyecek şekilde başlatır.

Docker İmajını Oluşturma ve Çalıştırma

Şimdi, Dockerfile'ımızı kullanarak bir Docker imajı oluşturalım ve yerel olarak test edelim:


# Docker imajını oluşturma ('. watermark-ml-api' etiketiyle)
docker build -t watermark-ml-api .

# İmajın başarıyla oluşturulduğunu kontrol edin
docker images

# Konteyneri çalıştırma ve 5000 portunu dışarıya map'leme
docker run -p 5000:5000 watermark-ml-api

Artık uygulamanız bir Docker konteyneri içinde çalışıyor olmalı! http://localhost:5000/health adresine bir GET isteği göndererek uygulamanızın sağlıklı olup olmadığını kontrol edebilirsiniz. Bir sonraki adımda, bu Docker imajını buluta nasıl dağıtacağımızı göreceğiz. Bu kapsülleme sayesinde, "Çalışmıyor" mazeretini geride bırakıp, uygulamanızı güvenle buluta taşıyabilirsiniz.

Buluta Yükseliş: AWS/Azure/GCP'de 5 Dakikada Dağıtım Mümkün mü?

Evet, mümkün! Özellikle Docker konteynerlerini destekleyen modern bulut hizmetleri sayesinde, uygulamanızı buluta dağıtmak şaşırtıcı derecede hızlı olabilir. Bu bölümde, popüler bulut sağlayıcılarından biri olan Azure App Service'i kullanarak su kalitesi ML API'mizi nasıl 5 dakikada dağıtabileceğimizi anlatacağız. AWS Elastic Beanstalk veya Google Cloud Run gibi hizmetler de benzer kolaylıklar sunar, ancak biz örnek olarak Azure'u kullanacağız.

Neden Azure App Service (Konteynerler İçin)?

  • Basitlik: Kolay arayüzü sayesinde hızla web uygulamaları ve API'ler dağıtabilirsiniz.
  • Konteyner Desteği: Docker imajlarınızı doğrudan Docker Hub, Azure Container Registry (ACR) veya özel URL'lerden çekebilir.
  • Ölçeklenebilirlik: Yük altında otomatik ölçeklendirme, performansı garanti eder.
  • Yönetilen Hizmet: Sunucu yönetimi, yamalama, güvenlik gibi operasyonel yükleri Azure üstlenir.
  • CI/CD Entegrasyonu: GitHub, Azure DevOps gibi kaynak kontrol sistemleriyle kolay entegrasyon.

Adım Adım Dağıtım Süreci (Azure App Service Üzerinden)

Bu adımlar, Azure portalını kullandığınızı ve bir Azure hesabınız olduğunu varsayar. Eğer yoksa, ücretsiz bir hesap oluşturabilirsiniz.

  1. Docker İmajınızı Bir Konteyner Kayıt Defterine Yükleyin:

    Öncelikle, yerel olarak oluşturduğumuz watermark-ml-api Docker imajını bir konteyner kayıt defterine (örneğin, Docker Hub veya Azure Container Registry) göndermemiz gerekiyor. Bu örnekte, halka açık bir Docker Hub deposuna yüklediğimizi varsayalım. Eğer özel bir depo kullanıyorsanız kimlik doğrulama adımları gerekebilir.

    
    # Docker Hub kullanıcı adınızı (örneğin, 'myusername') kullanarak imajı etiketleyin
    docker tag watermark-ml-api myusername/watermark-ml-api:latest
    
    # Docker Hub'a giriş yapın (eğer daha önce yapmadıysanız)
    docker login
    
    # İmajı Docker Hub'a gönderin
    docker push myusername/watermark-ml-api:latest
            

    Bu işlem, internet bağlantınıza bağlı olarak birkaç dakika sürebilir. İmajınız artık bulutta, Azure'un erişebileceği bir yerde.

  2. Azure Portalına Giriş ve Yeni Bir Web Uygulaması Oluşturma:
    • Azure portalına (portal.azure.com) gidin.
    • Sol menüden "Kaynak oluştur" veya arama çubuğuna "Web App" yazın.
    • "Web Uygulaması" seçeneğini seçin ve "Oluştur" butonuna tıklayın.
  3. Temel Bilgileri Yapılandırma:
    • Abonelik: Kullandığınız Azure aboneliğini seçin.
    • Kaynak Grubu: Yeni bir kaynak grubu oluşturun (örneğin, water-quality-rg) veya mevcut birini kullanın.
    • Ad: Web uygulamanız için benzersiz bir ad girin (örneğin, water-quality-ml-api-sizinadiniz). Bu aynı zamanda API'nizin URL'sinin bir parçası olacaktır.
    • Yayımlama: Burası önemli! "Docker Kapsayıcısı" seçeneğini seçin.
    • İşletim Sistemi: "Linux" seçeneğini seçin (çünkü Docker imajımız Linux tabanlı).
    • Bölge: Size veya kullanıcılarınıza en yakın bölgeyi seçin (örneğin, "West Europe" veya "Central US").
    • Linux Planı: Yeni bir App Service Planı oluşturun veya mevcut birini kullanın. Performans ve maliyet için uygun bir SKU (örneğin, B1 Basic veya P1V2 Premium) seçin. "Free" veya "Shared" planlar Docker kapsayıcılarını desteklemez veya yeterli kaynağı sağlamaz.
  4. Docker Yapılandırması:
    • "Docker" sekmesine gidin.
    • Görüntü Kaynağı: "Docker Hub" seçeneğini seçin. (Eğer ACR kullandıysanız, o seçeneği seçmelisiniz.)
    • Erişim Türü: "Genel" olarak bırakın. (Eğer özel bir Docker Hub deposu veya ACR kullandıysanız, kimlik doğrulama gerekecektir.)
    • Görüntü ve Etiket: Daha önce Docker Hub'a yüklediğiniz imajın adını girin. Örneğin: myusername/watermark-ml-api:latest.
    • Başlangıç Komutu: Gerekirse burada bir başlangıç komutu belirtebilirsiniz, ancak bizim Dockerfile'ımızda CMD komutunu zaten ayarladığımız için genellikle boş bırakabilirsiniz. Ancak burada gunicorn --bind 0.0.0.0:8000 app:app (App Service genellikle 80 veya 8000 portlarını tercih eder, bu yüzden Dockerfile'daki EXPOSE 5000'i değiştirmek veya Gunicorn'u App Service'in beklediği porta bağlamak iyi bir uygulamadır. Örneğimizde Dockerfile'da 5000 belirttik, bu yüzden Azure'da uygulama ayarları altında WEBSITES_PORT olarak 5000 belirtmeliyiz.)
  5. Gözden Geçir ve Oluştur:
    • "Gözden Geçir + oluştur" butonuna tıklayın.
    • Ayarlarınızı kontrol edin ve "Oluştur" butonuna tıklayarak dağıtımı başlatın.
  6. Dağıtımın Tamamlanması ve Test:

    Azure, Docker imajınızı çekecek, bir App Service örneği oluşturacak ve uygulamanızı başlatacaktır. Bu süreç genellikle 1-2 dakika sürer. Dağıtım tamamlandıktan sonra, oluşturduğunuz Web Uygulaması kaynağına gidin. "Genel Bakış" sekmesinde, uygulamanızın URL'sini (örneğin, https://water-quality-ml-api-sizinadiniz.azurewebsites.net) bulacaksınız.

    API'nizi test etmek için bir araç (örneğin, Postman veya cURL) kullanarak şu adrese bir GET isteği gönderin:

    
    curl https://water-quality-ml-api-sizinadiniz.azurewebsites.net/health
    # Çıktı: {"model_loaded": true, "status": "healthy"}
    
            

    Ardından, bir POST isteği ile tahmin yapın:

    
    curl -X POST -H "Content-Type: application/json" \
         -d '{
               "ph": 7.5,
               "hardness": 180,
               "solids": 20000,
               "chloramines": 7.0,
               "sulfate": 350,
               "conductivity": 400,
               "organic_carbon": 15.0,
               "trihalomethanes": 70,
               "turbidity": 4.0
             }' \
         https://water-quality-ml-api-sizinadiniz.azurewebsites.net/predict
    # Çıktı: {"prediction": 1, "probability_not_potable": 0.1, "probability_potable": 0.9} (Örnek çıktı)
    
            

İşte bu kadar! Uygulamanız artık bulutta canlı ve erişilebilir durumda. Bu hızlı dağıtım, İZSU örneğinde olduğu gibi, anlık veri analizleri için kritik bir yetenek sağlar. Artık API'nizi mobil uygulamalarınıza, web sitelerinize veya IoT sensör ağlarınıza entegre edebilirsiniz.

Optimizasyon ve Ölçeklendirme: API'mizi Daha Etkili Nasıl Kullanırız?

API'nizi buluta başarıyla dağıttıktan sonra, projenizin büyümesiyle birlikte performansı, güvenliği ve maliyet etkinliğini artırmak için optimizasyon ve ölçeklendirme stratejileri uygulamak önemlidir. Sadece 5 dakikada dağıtım yapmak harika bir başlangıçtır, ancak sürdürülebilirlik için ileri düzey düşünceler gereklidir.

Performans İpuçları: API Yanıt Sürelerini Nasıl Azaltırız?

  • Önbellekleme (Caching): Sıkça istenen veya aynı girdilerle tekrarlanan tahminler için sonuçları önbelleğe alın. Redis gibi bellek içi bir veri deposu kullanarak aynı isteğin model üzerinden tekrar geçmesini engelleyebilirsiniz. Bu, özellikle model tahmin süresinin uzun olduğu durumlarda performansı önemli ölçüde artırır.
    
    # Flask uygulamanızda basit bir önbellekleme örneği (Redis ile)
    # from flask_caching import Cache
    # cache = Cache(app, config={'CACHE_TYPE': 'redis', 'CACHE_REDIS_URL': 'redis://localhost:6379/0'})
    # @cache.cached(timeout=300, key_prefix='predict') # 300 saniye önbelleğe al
    # def predict():
    #    ...
            

  • Asenkron İşlemler: Eğer tahminler uzun sürüyorsa veya birden fazla karmaşık işlem içeriyorsa, bunları arka planda asenkron olarak çalıştırın (örneğin, Celery ve RabbitMQ/Redis kullanarak). API hemen bir iş kimliği dönsün, istemci daha sonra bu kimlikle sonucu sorgulasın.
  • Model Optimizasyonu: Daha küçük, daha hızlı ML modelleri kullanmayı düşünün. Distilasyon, nicemleme veya daha hafif mimarilere geçiş, tahmin sürelerini kısaltabilir. TensorFlow Lite veya ONNX gibi formatlar, model boyutunu ve çıkarım süresini optimize etmeye yardımcı olabilir.
  • Verimli Gunicorn Ayarları: gunicorn başlangıç komutunuzdaki --workers ve --threads parametrelerini sunucunuzun CPU çekirdek sayısına göre ayarlayarak performansı artırabilirsiniz. Genellikle 2 * CPU_COUNT + 1 kadar worker tavsiye edilir.

Ölçeklendirme Stratejileri: Artan Yüke Hazırlık

Bulut platformlarının en büyük avantajlarından biri, uygulamanızı ihtiyaca göre kolayca ölçekleyebilmesidir. Azure App Service gibi hizmetler, bu yeteneği otomatik olarak sunar:

  • Otomatik Ölçeklendirme (Auto-scaling): CPU kullanımı, bellek kullanımı, HTTP istek sayısı veya bir zaman çizelgesine göre otomatik ölçeklendirme kuralları belirleyebilirsiniz. Yük arttığında Azure otomatik olarak yeni uygulama örnekleri başlatır ve yük azaldığında kapatır. Bu, maliyetleri optimize ederken performansı korur.
    
    
    
    
    

    Yük Dengeleyici

    Bulut platformları, otomatik olarak gelen istekleri birden fazla uygulama örneğine dağıtan yük dengeleyicilerle gelir.

    Veritabanı Ölçeklendirmesi

    Eğer API'niz bir veritabanına bağlıysa, veritabanınızı da ölçeklendirmeniz gerekebilir (örn. Azure SQL Database'in esnek ölçeklendirme seçenekleri).

  • Bölgesel Dağıtım: Küresel bir kullanıcı kitleniz varsa, API'nizi birden fazla coğrafi bölgeye dağıtarak gecikmeyi azaltabilir ve bölgesel arızalara karşı dayanıklılığı artırabilirsiniz.

Güvenlik: API'nizi Nasıl Korursunuz?

API'nizin kamuya açık olması, güvenlik risklerini de beraberinde getirir. Şu önlemleri almanız kritik önem taşır:

  • HTTPS Kullanımı: Tüm API iletişimi için HTTPS'i zorunlu kılın. Azure App Service otomatik olarak ücretsiz SSL sertifikaları sağlar.
  • API Anahtarları/JWT: API'nize erişimi kısıtlamak için API anahtarları veya JSON Web Token (JWT) tabanlı kimlik doğrulama kullanın. Gelen her isteği doğrulamadan geçirin.
    
    # Flask'ta JWT ile basit bir örnek (Flask-JWT-Extended kütüphanesi ile)
    # from flask_jwt_extended import jwt_required, JWTManager
    # app.config["JWT_SECRET_KEY"] = "super-secret"
    # jwt = JWTManager(app)
    # @app.route('/predict', methods=['POST'])
    # @jwt_required() # Bu endpoint'e sadece doğrulanmış JWT token ile erişilebilir
    # def predict():
    #     ...
            

  • Giriş Doğrulama ve Sanitizasyon: API'nize gelen tüm girdileri dikkatlice doğrulayın ve zararlı kod enjeksiyonlarını önlemek için temizleyin (sanitizasyon).
  • Ağ Güvenliği: Bulut platformlarının güvenlik gruplarını, sanal ağlarını ve firewall ayarlarını kullanarak API'nize gelen trafiği sınırlayın ve izleyin.
  • Saldırı Tespit Sistemleri (IDS/IPS) ve Web Uygulama Güvenlik Duvarı (WAF): Uygulamanızı DDoS saldırılarına ve diğer web tabanlı tehditlere karşı korumak için bulut sağlayıcınızın WAF hizmetlerini kullanın.

Bu optimizasyon ve güvenlik adımları, ML API'nizin sadece hızlı bir şekilde dağıtılmasını değil, aynı zamanda uzun vadede güvenli, performanslı ve maliyet etkin bir şekilde çalışmasını sağlar. Bu sayede, su kalitesi izleme gibi kritik görevlerde yapay zeka gücünden tam anlamıyla faydalanabilirsiniz.

Sonuç ve Gelecek Adımlar: Su Kalitesi İzlemede Yapay Zekanın Yeri

Bu makalede, bir su kalitesi makine öğrenimi API'sini buluta nasıl hızlıca dağıtacağımızı adım adım inceledik. Flask ile bir tahmin servisi oluşturmaktan, Docker ile uygulamamızı kapsüllemeye ve Azure App Service üzerinde canlıya almaya kadar tüm süreci ele aldık. Gördük ki, karmaşık görünen bir dağıtım süreci bile doğru araçlar ve yaklaşımlarla sadece birkaç dakika içinde tamamlanabilir. Bu hız, İzmir İZSU örneğinde olduğu gibi, gerçek zamanlı su kalitesi izleme ve müdahale gerektiren senaryolarda hayati önem taşır. Artık sensör verilerinden anlık tahminler alabilen, ölçeklenebilir ve erişilebilir bir sisteme sahibiz.

Bu yetenek, sadece hızlı kararlar almakla kalmıyor, aynı zamanda kaynakların daha verimli kullanılmasını sağlıyor ve potansiyel çevresel felaketlerin önüne geçilmesine yardımcı oluyor. Makine öğrenimi ve bulut bilişim kombinasyonu, çevre yönetimi, halk sağlığı ve şehir planlaması gibi birçok alanda oyunun kurallarını yeniden yazıyor. Su kalitesi API'mizi başarıyla dağıtmış olsak da, yapay zekanın bu alandaki potansiyeli çok daha geniştir ve sürekli gelişmektedir.

Gelecek Adımlar ve İleri Düzey Uygulamalar:

  • Gerçek Zamanlı Sensör Entegrasyonu: IoT cihazlarından (su kalitesi sensörleri) gelen verileri doğrudan API'ye entegre ederek tamamen otomatik ve anlık izleme sistemleri kurmak. Bu, sürekli veri akışı sağlayarak modelin gerçek zamanlı tahmin yeteneğini artırır.
  • Edge Computing: Tüm veriyi buluta göndermek yerine, ilk analizleri sensöre yakın cihazlarda (edge devices) yaparak gecikmeyi azaltmak ve bant genişliği maliyetlerinden tasarruf etmek. Sadece anormal verileri veya özetlenmiş sonuçları buluta göndermek.
  • Daha Karmaşık Modeller ve Derin Öğrenme: Görüntü işleme tekniklerini (mikroskobik görüntü analizi ile mikroorganizma tespiti gibi) entegre etmek veya daha karmaşık zaman serisi modelleri (LSTM gibi) kullanarak su kalitesi eğilimlerini daha doğru tahmin etmek.
  • Anomali Tespiti: Su kalitesi parametrelerindeki ani ve beklenmedik değişiklikleri tespit etmek için anomali tespit algoritmalarını kullanmak. Bu, kirlilik veya ekipman arızası gibi acil durumları hızla belirleyebilir.
  • Görselleştirme ve Uyarı Sistemleri: API'den gelen tahminleri interaktif panolarda (örneğin, Power BI, Grafana) görselleştirmek ve belirli eşikler aşıldığında SMS veya e-posta ile otomatik uyarılar göndermek.
  • Sürekli Entegrasyon/Sürekli Dağıtım (CI/CD) Pipeline'ları: Model güncellemelerini veya API kod değişikliklerini otomatik olarak test eden ve dağıtan bir CI/CD pipeline'ı oluşturmak. Bu, geliştirme hızını ve güvenilirliği artırır.

Unutmayın, bir projenin "canlıya" alınması sadece bir başlangıçtır. Sürekli izleme, performans iyileştirmeleri ve yeni özelliklerin entegrasyonu, yapay zeka destekli sistemlerin gerçek değerini ortaya çıkarır. Bu süreçte kazanılan deneyimler, gelecekteki daha büyük ve karmaşık projelere ışık tutacaktır. Şimdi, bu bilgi birikimiyle kendi projelerinizi bulutun gücüyle hayata geçirme zamanı!

Sıkça Sorulan Sorular

  1. ML API'mi buluta dağıtmak için hangi bulut sağlayıcısını seçmeliyim?

    Seçiminiz, projenizin özel gereksinimlerine, mevcut becerilerinize ve bütçenize bağlıdır. AWS, Azure ve Google Cloud, Docker kapsayıcılarını destekleyen güçlü hizmetler sunar (AWS Elastic Beanstalk, Azure App Service, Google Cloud Run/App Engine). Eğer halihazırda bir bulut sağlayıcısıyla deneyiminiz varsa, onunla devam etmek en kolayıdır. Yeni başlıyorsanız, ücretsiz katmanları veya başlangıç kredileri olan birini (Azure'un 12 aylık ücretsiz hizmetleri gibi) deneyebilirsiniz.

  2. Modelimi her güncellediğimde API'yi yeniden dağıtmam gerekiyor mu?

    Evet, modelinizi güncellediğinizde (örneğin, yeni verilerle yeniden eğittiğinizde) API'nizin de güncellenmesi gerekir. Eğer model dosyanız (model.pkl) değişirse, yeni model dosyasını içeren yeni bir Docker imajı oluşturmanız ve bu imajı bulut hizmetinize yeniden dağıtmanız gerekir. CI/CD (Sürekli Entegrasyon/Sürekli Dağıtım) pipeline'ları bu süreci otomatikleştirerek iş yükünüzü azaltabilir.

  3. API'min güvenliğini nasıl sağlayabilirim?

    Güvenlik çok önemlidir. HTTPS kullanımını zorunlu kılın, API'ye erişimi API anahtarları veya JWT (JSON Web Token) ile kimlik doğrulayın, gelen tüm verileri doğrulayın ve temizleyin (sanitizasyon). Ayrıca, bulut sağlayıcınızın güvenlik duvarı ve ağ izolasyon özelliklerini kullanarak API'nize gelen trafiği sınırlayabilirsiniz. Düzenli güvenlik denetimleri de faydalı olacaktır.

  4. Bir Flask API yerine başka bir çerçeve kullanabilir miyim?

    Kesinlikle! Flask, hafif ve hızlı bir seçenek olduğu için popülerdir, ancak FastAPI veya Django REST Framework gibi daha güçlü çerçeveleri de kullanabilirsiniz. FastAPI, özellikle asenkron işlemler ve otomatik dokümantasyon (Swagger UI) desteği sayesinde ML API'leri için popüler bir alternatiftir. Seçiminiz, projenizin karmaşıklığına ve geliştirici tercihlerinize bağlıdır.

  5. 5 dakikada dağıtım vaadi gerçekçi mi?

    Evet, belirli koşullar altında oldukça gerçekçidir. Özellikle tüm ön hazırlıkları (ML modeli, Flask uygulaması, Dockerfile) tamamladıysanız ve Docker imajınızı bir kayıt defterine yüklediyseniz, bulut platformlarının (Azure App Service gibi) konteyner dağıtım özellikleri sayesinde API'nizi dakikalar içinde canlıya alabilirsiniz. İlk kurulum ve öğrenme süreci bu 5 dakikaya dahil değildir, ancak "canlıya alma" adımı gerçekten de bu kadar hızlı olabilir.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Exit mobile version