Kurs
API’ler (Uygulama Programlama Arayüzleri), uygulamaların modüler ve gevşek bağlı olmasını sağladıkları için modern mimarinin bel kemiğidir. Bu da uygulamaları hızlı ve kolay bir şekilde geliştirmenize, bakımını yapmanıza ve güncellemenize imkân tanır.
API’ler, farklı uygulamaların veri paylaşmasına ve birlikte çalışmasına olanak vererek zaman ve emek tasarrufu sağladığı için makine öğreniminde de büyük önem taşır. Python’da API geliştirmek için birçok farklı çatı vardır. Python’da API oluşturmaya yönelik en popüler çatılar arasında Django, Flask ve FastAPI bulunur. Bu eğitim, FastAPI adlı çatılardan birine derinlemesine bir bakış sunar.
Bu konuya daha derinlemesine dalmak isterseniz şu kursu öneririm: Deploying AI Into Production With FastAPI.
API nedir?
API, Uygulama Programlama Arayüzü anlamına gelir. API, iki uygulamanın birbiriyle konuşmasını sağlayan bir yazılım aracısıdır. Telefonunuzdaki bir uygulamayı kullandığınızda, uygulama internete bağlanır ve bir sunucuya veri gönderir. Sunucu veriyi işler ve tekrar telefonunuza gönderir. Telefonunuzdaki uygulama da veriyi yorumlayıp size okunabilir bir şekilde sunar.
API, bir restorandaki garsona benzer. Garson siparişinizi alır ve mutfağa iletir. Mutfak yemeği hazırlar ve garsona verir. Garson da yemeği size getirir.
Aynı şekilde API, bir uygulamadan gelen isteği alır ve sunucuya iletir. Sunucu isteği işler ve veriyi uygulamaya geri gönderir. Uygulama veriyi yorumlar ve kullanıcıya sunar.

Görsel Kaynağı: https://www.techfunnel.com/wp-content/uploads/2021/07/api.png
Makine öğrenimi işlem hatları, API’ler ve MLOps hakkında daha fazla bilgi edinmek istiyorsanız Makine Öğrenimi, İşlem Hatları, Dağıtım ve MLOps Eğitimimize göz atabilirsiniz.
FastAPI nedir
FastAPI, standart Python tür ipuçlarına dayanan ve Python 3.7+ ile API’ler oluşturmak için yüksek performanslı bir web çatısıdır. Geliştiricilere uygulamaları hızlı ve verimli biçimde inşa etmede yardımcı olur. FastAPI, Starlette web sunucusu üzerine kuruludur ve otomatik veri doğrulama, hata yönetimi ve etkileşimli API dokümantasyonu gibi web uygulamaları geliştirmeyi kolaylaştıran özellikler içerir.
Bu bölümde bu özelliklerin her birine ayrı ayrı bakacağız. Önce, FastAPI’nin orijinal dokümantasyonunda vurgulanan temel özelliklere göz atalım.
- Performans: NodeJS ve Go diliyle aynı seviyede.
- Hız: Geliştirme hızını 2-3 kat artırır.
- Kolay: Üstün editör desteği. Her yerde otomatik tamamlama. Öğrenmesi ve kullanması kolay.
- Sağlam: Otomatik etkileşimli dokümantasyonla üretime hazır kod.
- OpenAPI tabanlı: OpenAPI ve JSON Schema ile tamamen uyumlu.
FastAPI’nin kurulumu
FastAPI, Python 3.7+ gerektirir ve pip ile kurulabilir. FastAPI’yi ve ASGI sunucusu `uvicorn`’u kurmanız gerekir.
``
# install fastapi
pip install fastapi
# install uvicorn
pip install uvicorn
``
Basit bir API oluşturma
Hadi doğrudan çok basit bir örnek API oluşturarak başlayalım. Bunu uygulamak için VS Code kullanıyorum, ancak dilediğiniz editörü kullanabilirsiniz.
```
from typing import Union
from fastapi import FastAPI
app = FastAPI()
@app.get("")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
```
(Örnek orijinal dokümantasyondan uyarlanmıştır). @tiangolo’ya teşekkürler.
Şimdi bir komut satırı terminali kullanarak bu API’yi aşağıdaki komutla çalıştırın:
```
uvicorn main:app –reload
```
`main`, Python dosyasının adı; `app` ise FastAPI sınıfını tutan değişkendir. İstediğiniz isimleri verebilirsiniz. Yukarıdaki komutu çalıştırdığınızda terminalinizde buna benzer bir çıktı göreceksiniz:

Tarayıcınızda bağlantıya gidin; `Hello World` yazan bir sayfa görüyorsanız API çalışıyor demektir.

Görsel: Yazar
İlk API’nizi oluşturduğunuz için tebrikler.
Etkileşimli API Dokümanları
FastAPI, API’lerinizin tümü için OpenAPI standardını kullanarak bir "şema" üretir. "Şema", bir şeyin tanımı ya da betimlemesidir. Onu uygulayan kod değil, soyut bir tanımdır. OpenAPI şeması, FastAPI ile gelen iki etkileşimli dokümantasyon sistemini besler.
Dokümantasyonu görmek için URL’ye yalnızca `/docs` ekleyin (`http://127.0.0.1:8000/docs`). Bu bağlantı otomatik etkileşimli API dokümantasyonunu gösterecektir.

Görsel: Yazar
API’yi test etmek için sağ üst köşedeki `Try it out` düğmesine tıklayın.

Görsel: Yazar
Yanıt gövdesinin bir sözlük olduğunu görebilirsiniz. Bu, `main.py` içinde tanımlanan `read_item` fonksiyonunun döndürdüğü değerdir. Ayrıca istek URL’si olan `http://127.0.0.1:8000/items/1?q=orange` adresini de görüyorsunuz. `1` ve `orange` API’ye verdiğimiz girdilerdi.
FastAPI’de alternatif bir etkileşimli otomatik dokümantasyon daha vardır. Bunu görmek için http://127.0.0.1:8000/redoc` adresine gidin. Görünümü şöyledir:

Görsel: Yazar
Daha gelişmiş örnekler
Bir API geliştirirken, "yol" isteğin rotasını veya uç noktasını tanımlar. Ancak burada vermemiz gereken bir karar daha vardır: “İşlem.” Buradaki `operation` sözcüğü HTTP "yöntemlerinden" birine karşılık gelir. Bu "yöntemlerden" birini (veya birkaçını) kullanarak, HTTP protokolünün desteklediği çeşitli yollardan her biriyle iletişim kurabilirsiniz. Genellikle şu yöntemleri kullanırsınız:
- POST: veri oluşturmak için.
- GET: veri okumak için.
- PUT: veriyi güncellemek için.
- DELETE: veriyi silmek için.
- Ve birkaç gelişmiş yöntem daha
FastAPI tüm http yöntemlerini destekler.
FastAPI’nin Python tür ipuçları üzerine kurulu olması da bu çatının bir başka önemli yönüdür. Tür ipuçları Python 3.6 ve sonrasında desteklenir. Tür ipuçları, bir değişkenin türünü bildirmenizi sağlayan özel bir sözdizimidir.
Değişkenleriniz için türleri bildirmeniz, editörler ve diğer araçların size daha iyi yardım sağlamasını mümkün kılar. Gelişmiş bir örneğe bakalım.
`main.py` dosyamızı, farklı veri tiplerinde birden fazla girdi alacak yeni bir `PUT` isteğini içerecek şekilde değiştireceğiz.
```
from typing import Union
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
class Item(BaseModel):
name: str
price: float
is_offer: Union[bool, None] = None
@app.get("")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
return {"item_name": item.name, "item_id": item_id}
```
(Örnek orijinal dokümantasyondan uyarlanmıştır). @tiangolo’ya teşekkürler.
Değişiklik:
İki girdi alan bir `put` isteği eklendi. `item_id` bir tamsayıdır ve `item` türü, `pydantic`’in `BaseModel`’inden türeyen özel `Item` sınıfını işaret eder. `Item` sınıfı üç öznitelik içerir: `name`, `price`, `is_offer` ve bunların her biri farklı veri tiplerine sahiptir.
FastAPI şunları kontrol eder:
- `name` bir `str`’dir.
- `price` bir `float`’tır.
- `is_offer` varsa bool’dur.
Tür ipuçlarını kullanmanın avantajı, parametreler, gövde vb. için türleri standart Python (3.6+) fonksiyon parametreleri olarak bir kez bildirmenizdir. Bunun karşılığında şunları elde edersiniz:
- Editör desteği, otomatik tamamlama ve tür kontrolleri dahil
- Veri Doğrulama
- Girdi verisinin dönüştürülmesi
- Çıktı verisinin dönüştürülmesi
- Anlaşılması kolay hatalar.
FastAPI’nin Django ve Flask ile karşılaştırması
Bu üç çatı da web uygulamaları geliştirmek için kullanabileceğiniz Python web çatılarıdır. Her birinin güçlü ve zayıf yönleri vardır.
Django, yerleşik bir ORM ve yönetim paneli de dâhil olmak üzere başlamak için gereken her şeyi içeren, tam özellikli bir çatıdadır. Yeni başlayanlar için biraz göz korkutucu olabilir, ancak kapsamlı dokümantasyonu öğrenmeyi kolaylaştırır.
Flask, hafif ve başlaması kolay bir mikro çatıdadır. Django kadar çok özellikle gelmez, ancak basit projeler için idealdir.
FastAPI, hızlı ve kullanımı kolay olacak şekilde tasarlanmış yeni bir çatıdadır. Otomatik veri doğrulama ve dokümantasyon gibi özellikler içerir.
|
Django |
Flask |
FastAPI |
|
|
Topluluk |
Büyük. 66K GitHub yıldızı |
Büyük. 61K GitHub yıldızı |
Büyük. 50K GitHub yıldızı |
|
Performans |
Django kapsamlıdır. Performans açısından en iyisi değildir. |
Flask bir mikro web çatısıdır. Django’dan daha iyi performans gösterir. |
FastAPI, yerel async desteğiyle çatı verimliliğini artıran en hızlı web çatılarından biridir. |
|
Async desteği |
Evet, sınırlı gecikmeyle. |
Hayır. Asyncio gerekir |
FastAPI yerel async desteği sağlar. |
|
Kullanım kolaylığı |
Django kapsamlıdır ve bu nedenle öğrenmesi biraz karmaşıktır. |
Flask öğrenmesi kolay ve kullanımı oldukça yalındır. |
FastAPI üçünün içinde en basit olanıdır. |
|
Etkileşimli Dokümantasyon |
Etkileşimli değil |
Hayır |
Evet (OpenAI, Redoc) |
|
Veri Doğrulama |
Hayır |
Hayır |
Evet |
FastAPI Performans Kıyasları
techempower tarafından yürütülen testlerin sonuçlarına göre, FastAPI genel performans açısından diğer tüm çatılardan üstündür.

Kaynak: https://www.techempower.com/benchmarks/
Örnek: PyCaret ile uçtan uca bir makine öğrenimi işlem hattı kurup FastAPI ile dağıtma
Bu bölümde hızlıca bir makine öğrenimi işlem hattı kurup ardından modeli sunmak için bir API oluşturacağız. İşlem hattını kurmak ve bir API oluşturmak için düşük kodlu bir Python kütüphanesi olan PyCaret’i kullanacağız. PyCaret’in FastAPI ile entegrasyonu vardır; bu da makine öğrenimi modellerini API olarak oluşturmayı ve sunmayı son derece kolaylaştırır.
PyCaret
PyCaret, makine öğrenimi iş akışlarını otomatikleştiren, Python’da açık kaynaklı, düşük kodlu bir makine öğrenimi kütüphanesidir. Deney döngüsünü katlanarak hızlandıran ve üretkenliğinizi artıran uçtan uca bir makine öğrenimi ve model yönetim aracıdır.
```
pip install pycaret
```
```
import pycaret
pycaret.__version__
>>> 2.3.10
```
Bu örnekte `insurance` veri setini kullanacağız. Bu, yaş, cinsiyet, BMI ve bölgeye göre tıbbi harcamaları tahmin etmeye yönelik bir regresyon kullanım senaryosudur.
```
from pycaret.datasets import get_data
data = get_data(‘insurance’)
```

Görsel: Yazar
Sonraki adımda pycaret’ten `setup` fonksiyonunu başlatacağız. Bu fonksiyon, PyCaret’te deneyi başlatır ve fonksiyona geçirilen tüm parametrelere göre dönüşüm işlem hattını oluşturur.
`setup`, diğer herhangi bir fonksiyondan önce mutlaka çalıştırılmalıdır. Çalışması için iki parametre gerekir: `data` ve `target`. `setup` içindeki diğer tüm argümanlar isteğe bağlıdır. `setup` fonksiyonu, veri ön işleme prosedürlerinin tamamını kontrol etmekten sorumludur. PyCaret’te desteklenen tüm ön işleme prosedürlerinin kapsamlı dökümü için PyCaret dokümantasyonuna bakın.
```
from pycaret.regression import *
s = setup(data, target = 'charges')
```

Görsel: Yazar Çıktı kısaltılmıştır.
Kurulum tamamlandıktan sonra, yalnızca tek satır kodla model eğitimi ve seçimine başlayabiliriz: `compare_models`. Bu fonksiyon, çapraz doğrulama kullanarak model kütüphanesindeki tüm kestirimcilerin model performansını eğitir ve değerlendirir. Fonksiyonun sonucu, çapraz doğrulamadan elde edilen ortalama puanları içeren bir skor tablosudur.
Python ile Makine Öğreniminde Ön İşleme
Temizlenmiş verinizi modellemeye hazır hâle getirme hakkında daha fazla öğrenmek ister misiniz? Python ile Makine Öğreniminde Ön İşleme kursumuzu alın.
```
best = compare_models()
```

Görsel: Yazar
Buna göre en iyi performans gösteren model `Gradient Boosting Regressor` oldu. İstersek, görselleştirme yoluyla modeli analiz edebilir ve hiperparametre ayarlaması veya model birleştirme ile performansı daha da artırmayı deneyebiliriz; ancak bu eğitimde bunu yapmayacağız.
FastAPI kullanarak üretimde tahmin sunmak için en iyi modelin API’sini oluşturmaya doğrudan geçeceğiz. Unutmayın, PyCaret’in FastAPI ile entegrasyonu vardır; bu sayede `create_api` fonksiyonunu kullanarak modelden otomatik olarak bir REST API oluşturabilir.
```
create_api (best, 'insurance_prediction_model')
```

Şimdi bu API’yi çalıştırmak için komut istemi terminalini açın, Notebook’unuzun bulunduğu klasöre gidin ve şu komutu çalıştırın: `python insurance_prediction_model.py`.

`http://127.0.0.1:8000/docs` adresine gidin; bu eğitimde daha önce gördüğünüzle aynı arayüzü göreceksiniz

Görsel: Yazar

Görsel: Yazar
Alternatif etkileşimli dokümantasyonu da `http://127.0.0.1:8000/redoc` adresine giderek görebilirsiniz’

Görsel: Yazar
Unutmayın, varsayılan ve redoc etkileşimli dokümantasyonun her ikisi de OpenAPI standartlarıyla desteklenmektedir.
PyCaret’in `create_api` fonksiyonunu kullandığınızda oluşturduğu dosyayı görmek isterseniz, Notebook’unuzla aynı klasördeki dosyaya bakabilirsiniz. Şuna benziyor:
```
import pandas as pd
from pycaret.regression import load_model, predict_model
from fastapi import FastAPI
import uvicorn
# Create the app
app = FastAPI()
# Load trained Pipeline
model = load_model('my_lr_api')
# Define predict function
@app.post('/predict')
def predict(age, sex, bmi, children, smoker, region):
data = pd.DataFrame([[age, sex, bmi, children, smoker, region]])
data.columns = ['age', 'sex', 'bmi', 'children', 'smoker', 'region']
predictions = predict_model(model, data=data)
return {'prediction': list(predictions['Label'])}
if __name__ == '__main__':
uvicorn.run(app, host='127.0.0.1', port=8000)
```
Sonuç
Bu yazıda API kavramını ve neden kullanıldığını ele aldık. API’ler, farklı yazılım programlarının veri ve işlevsellik paylaşmasına olanak tanıdığı için modern mimaride önemlidir. Bu sayede daha güvenilir ve bakımı daha kolay karmaşık sistemler oluşturmak mümkün olur.
Ardından Python’daki nispeten yeni bir çatı olan FastAPI’ye derinlemesine daldık. FastAPI, kullanımı kolay ve verimli olacak şekilde tasarlanmış daha yeni bir API çatısıdır. Hızlı ve kolay bir şekilde API oluşturmak isteyen geliştiriciler için harika bir seçenektir.

GitHub yıldız geçmişi - star-history.com kullanılarak oluşturuldu
Eğer siz de Python’da Flask kullanarak bir makine öğrenimi modelinden basit bir API oluşturmayı öğrenmek istiyorsanız, bu kolay takip edilebilir Makine Öğrenimi Modellerini Python’da API’lere Dönüştürme eğitimine göz atın.
FastAPI SSS
FastAPI asenkron mudur?
FastAPI, Python’daki async/await anahtar sözcüklerini kullanarak kutudan çıktığı gibi eşzamanlı olmayan (asenkron) kodu destekler.
FastAPI üretime hazır mı?
FastAPI, mükemmel dokümantasyon, destek ve kullanımı kolay bir arayüzle tamamen üretime hazırdır.
FastAPI, Flask’tan nasıl farklıdır?
FastAPI asenkron çağrıları destekler. Flask’tan daha hafif, daha hızlı ve öğrenmesi daha kolaydır. Hem Flask hem de FastAPI’nin büyük toplulukları vardır.
FastAPI’nin yerleşik bir geliştirme sunucusu var mı?
Hayır, FastAPI’nin yerleşik bir geliştirme sunucusu yoktur. Bunun için `uvicorn` kullanmanız gerekir.
FastAPI, Python 2’de destekleniyor mu?
Hayır, FastAPI yalnızca Python 3.6+ sürümlerinde kullanılabilir.
FastAPI yalnızca Python’da mı mevcut?
Evet
FastAPI, Go programlama dilinden daha hızlı mı?
Hayır. techempower’a göre, Golang Fiber dünyadaki en hızlı 50. API’dir. FastAPI ise 183. sıradadır.
FastAPI, Pydantic ile uyumlu mu?
FastAPI, Pydantic ile tamamen uyumludur (ve onun üzerine kuruludur).