FastAPI Model Deployment Projesi ve Projeye Ait Docker İmajı (İmage) Oluşturma Aşamaları

Büşra Sulukan
İstanbul Data Science Academy
9 min readDec 6, 2023

--

Giriş Notu: Bu makale, MLOps-End-To-End Projesi kapsamında yapılan ön işlem adımlarını açıklamak ve ilgili kodların barındığı FastApi Model Deployment Repository’i sizlerle paylaşmak,Python’ın FastAPI kütüphanesi ve Docker hakkında bilgi sahibi olunmasını sağlamak amacıyla yazılmıştır.

— — — — — — — — 1.KISIM: DOCKER — — — — — — — —

1.Docker Nedir?

Docker, en genel tanımı ile yazılım uygulamalarının hafif, taşınabilir ve ölçeklenebilir bir şekilde paketlenmesini sağlayan, çalıştırma ve dağıtım gibi çeşitli işlemler için kullanılan bir platformdur. Bu platformun sahip olduğu bileşenlerin ne ifade ettiğini anlamak oldukça önemlidir.

1.1.Docker Bileşenleri

A) Docker İmajları: Bir uygulamayı veya servisi konteynerleştirmek (Docker konteynerine dönüştürmek) için atılan ilk adımdır. Docker imajı oluşturmak için “Dockerfile” adlı metin dosyası kullanılır. Bu metin dosyasının uzantısı yoktur, sadece baş harfi büyük yazılr.Dockerfile, uygulamanın gerekli bağımlılıklarını belirtir ve Docker Daemon tarafından okunarak bir imaj oluşturulur. İmaj oluşturma süreci, Docker Hub gibi bir imaj deposuna da (registry) yüklenerek paylaşılabilir ve başkaları tarafından kullanılabilir.

B)Konteynerler: Docker, uygulamaları çalıştırmak için konteyner adı verilen hafif, taşınabilir birimlere dayanır. Docker,bu hafif sanallaştırma teknolojisinin(konteynerler) üzerine inşa edilmiştir. Her konteyner, kendi dosya sistemi, bağımlılıkları, ağ ve diğer ortam değişkenlerini içerir. Konteynerler, bir uygulamanın taşınabilirliğini artırır ve farklı ortamlarda sorunsuz bir şekilde çalışmasını sağlar.

C) Docker Daemon: Docker Daemon, konteynerleri oluşturan, yöneten ve çalıştıran arka planda çalışan bir süreçtir. Docker Desktop ise içinde Docker Daemon barındıran bir uygulamadır.Dockerfile dosyası ile oluşturulmak istenilen imajların çalıştırılması için Docker Desktop açık olmalıdır.Docker Desktop uygulaması açık olmadan Dockerfile ile bir imaj oluşturulma komutu çalıştırılırsa terminalde “Docker Daemon bulunamadı” cinsinden bir hata mesajı belirecektir.

D)Docker Compose: Docker Compose, çoklu konteyner uygulamalarını tanımlamak ve yönetmek için kullanılan bir araçtır. Bir YAML dosyası kullanılarak, Docker Compose, birden çok servisi, ağları ve diğer kaynakları içeren karmaşık uygulamaları tanımlamanıza olanak tanır.

2.Veri Bilimciler Neden Docker Kullanır?

Veri bilimciler için Docker kullanmak, analiz ve modelleme süreçlerini daha etkili ve sorunsuz bir hale getirmenin önemli bir yoludur. Docker, veri bilimcilerine bir dizi avantaj sunar, bu da veri işleme, model eğitimi ve uygulamaların dağıtımı konularında daha güçlü bir altyapı sağlar.

Docker’ın sahip olduğu avantajlar aşağıdaki gibidir:

A)Taşınabilir Çalışma Ortamı: Veri bilimcileri genellikle farklı projelerde çalışır ve bu projelerde farklı kütüphaneleri, bağımlılıkları ve yazılım sürümlerini kullanabilirler. Docker, her projenin kendi izole edilmiş konteynerinde çalışmasını sağlar. Bu, bir proje üzerinde çalışırken ortamı başka bir projeye geçiş yaparken yaşanan uyumsuzluk sorunlarını ortadan kaldırır.

B)Çoğaltılabilir Analiz Ortamı: Veri bilimcilerinin analiz ve modelleme ortamlarını kolayca çoğaltmalarını sağlayan Docker, belirli bir proje üzerinde elde edilen sonuçları başka bir sistemde veya bulutta tekrar çoğaltmak istendiğinde imajların kullanılması ile kolaylık sağlar. Bu, tutarlılık sağlar ve başka bir ortamda aynı analizi veya modeli tekrarlamak kolaylaşır.

C)Kurulum Karmaşasını Ortadan Kaldırma: Veri bilimcileri genellikle çeşitli kütüphaneleri, paketleri ve yazılım araçlarını kullanır. Docker, bu bağımlılıkları bir Dockerfile aracılığıyla belirleyerek, herkesin aynı ortamı hızlıca kurmasını sağlar. Bu, yeni bir takım üyesinin veya işbirliği yapan bir meslektaşın aynı analizi yürütmesini kolaylaştırır.

D)Etkin Dağıtım ve Paylaşım: Docker, geliştirilmiş model veya analiz çalışmalarını başka sistemlere taşımak ve dağıtmak için ideal bir araçtır. Docker imajları, bir modeli veya analizi diğer ekip üyelerine veya sunuculara hızla dağıtmak için kullanılabilir. Bu, üretime geçiş sürecini hızlandırabilir ve modellerin gerçek dünyada nasıl performans gösterdiğini test etmek için kullanılabilir.

E) Kaynak Kullanımı ve İzolasyon: Docker, kaynakları (CPU, bellek vb.) etkili bir şekilde yönetir ve izole eder. Bu, birden çok projenin veya analiz süreçlerinin aynı anda çalıştırılabilmesini sağlar, her biri kendi izole edilmiş Docker konteynerinde çalıştığı için birbirlerini etkilemez.

Özetle; Docker kullanmak, veri bilimcilerine esneklik, taşınabilirlik ve daha düzenli, tekrarlanabilir çalışma ortamları sunarak, veri analizi ve model geliştirme süreçlerini büyük ölçüde iyileştirebilir. Bu da daha hızlı ve güvenilir sonuçlara ulaşma ve ekip içinde işbirliğini artırma fırsatı sağlar.

3.Dockerfile İçeriği Oluşturmak

En temel ve basit bir Dockerfile dosyasının içeriği, aşağıdaki örnekte açıklanacağı üzere, “FROM”,”RUN”,”WORKDIR”,”COPY”,”RUN” talimatlarından(komutlarından) oluşur.

Örnek:

CI/CD Sürecinde Kullanılan Dockerfile Dosyasının İçeriği

Bu Dockerfile dosyası talimatlarının açıklaması aşağıdaki gibidir:

1.Komut : “FROM python:3.9.18-slim-bullseye “

Bu satır, Docker imajının temel alınacak başlangıç noktasını belirler. Bu durumda,python:3.9.18-slim-bullseye imajı, Python 3.9.18 sürümünü içeren Debian Bullseye tabanlı hafif bir imajdır. Burada kullanılan imaj ve diğer tüm imajlara hub.docker.com ‘dan ulaşılabileceği gibi kullanılmak istenilen Python sürümlerinin imajlarına da python Tags (docker.com) sitesinden ulaşılabilir.

2.Komut: “RUN mkdir code/ “

RUN komutu, konteynerin içinde çalıştırılacak komutları ifade eder. Bu komut, konteyner içinde "code" adında bir dizin oluşturur.

3.Komut: “WORKDIR code/”

WORKDIR, çalışma dizinini ayarlar. Bu durumda, çalışma dizini /code/ olarak ayarlanır. Bu dizin, sonraki komutların çalıştırılacağı dizini belirtir.

4.Komut: “COPY . . “

COPY, yerel dosyaları veya dizinleri konteynere kopyalamak için kullanılır. Bu durumda, Dockerfile'ın bulunduğu dizindeki tüm dosyaları ( . ) konteynerin çalışma dizinine ( . ) kopyalar.

5.Komut: “RUN pip install update pip && pip install -r requirements.txt”

Bu satır, Python bağımlılıklarını yükler. İlk olarak, pip’i günceller (pip install update pip) ardından requirements.txt dosyasındaki bağımlılıkları kurar ( pip install -r requirements.txt ).

6.Komut: “EXPOSE 8080”

EXPOSE, konteyner içinde belirtilen portun dış dünyaya açılmasını sağlar. Bu durumda, konteynerin içindeki uygulama 8080 numaralı portu dinleyecektir.

Unutulmamalıdır ki bu komut ağ trafiğini yönlendirmez, sadece ilgili portun açık olduğunu belirtir.

7.Komut: “ CMD [“uvicorn”,”main:app”, “ — host=0.0.0.0”,” — port=8080"] “

CMD , konteyner çalıştırıldığında çalışacak varsayılan komutu belirtir. Bu durumda, uvicorn komutu ile başlatılan bir Python uygulaması çalıştırılır. main:app ifadesi, main dosyasındaki app adlı uygulamanın başlatılmasını belirtir. Uygulama, 0.0.0.0 adresinde ve 8080 portunda çalışacaktır.

Bu işlem adımı FastAPI model deployment için özel olarak ayarlanmıştır.Makalenin FastAPI ile ilgili bölümünde daha net anlaşılacaktır.

Genel bir CMD komutu aşağıdaki gibidir:

CMD ["python3", "app.py"]

Bu örnekte açıklanan Dockerfile, Python tabanlı bir web uygulamasının (FastAPI) Docker konteynerine yerleştirilmesini ve çalıştırılmasını sağlar.

4.Docker İmaj’ıve Konteyner Oluşturmak

Not: GitHub Actions CI/CD Süreçlerinde bu işlem .yml dosyası içerisinde komutlar ile Google Cloud ortamında gerçekleştirilmiştir.

Makalenin 4.Bölümünde anlatılacak olanlar yerel bilgisayarda bir imaj ve ardından konteyner oluşturulmasını kapsar.

Dockerfile’ı kullanarak bir Docker imajı oluşturmak ve daha sonrasında bir konteyner oluşturmak için terminale aşağıdaki komutlar yazılarak işleme devam edilir.

#Dockerfie ile İmaj Oluşturmak İçin:
docker build -t imaj_adı: etiket .
#örn:
docker build -t fastapi:latest .
# . ifadesi Dockerfile'ın bulunduğu dizini temsil eder, yazılmazsa hata verebilir.
#Sistemde var olan imajları listelemek için:
docker images
#Docker imajı ile bir konteyner oluşturmak için: 
docker run -p 8080:8080 imaj_adı:etiket
#-p parametresi, yerel makinedeki portu konteynerdeki porta yönlendirir.
# 8080:8080, yerel makinedeki 8080 numaralı portu, konteynerdeki 8080 numaralı porta yönlendirir.
#Port değiştirme işlemleri buradan yapılabilir.
docker run -p 8080:8080 fastapi:latest
#Çalışan Konteynerleri Listelemek İçin:
docker ps
#Durdurulan veya Tüm Konteynerleri Listelemek İçin:
docker ps -a
#Önemli:Burada Konteynerlere ait isim ve ID değerleri her bir
# konteyner için benzersiz değerdir.
#Çalışan bir konteyneri durdurmak ve silmek için:
docker stop <konteyner_id veya isim>
docker rm <konteyner_id veya isim>
#Örnek
docker stop fastapi
docker rm fastapi

Bu komutlar terminalde çalıştırılmadan önce Docker Deamon ‘un aktif olmasını gerektirdiği için Docker Desktop uygulamasının açık olması gerekmektedir. Oluşturulan bu imaj ve konteyner Docker Desktop uygulamasından kontrol edilebilir.

Docker Desktop Uygulamasında İmajların Görüntülenmesi
Docker Desktop Uygulamasında Konteynerlerin Görüntülenmesi

— — — — — — — — 2.KISIM: FastAPI — — — — — — — —

1.FastAPI Nedir?

FastAPI, Python programlama dilinde (Python 3.7 +) yüksek performanslı,öğrenmesi kolay,geliştirilmesi hızlı,kullanıma sunulmaya hazır ve modern API (Application Programming Interface)’ler oluşturmak için kullanılabilecek web framework’üdür.

FastAPI, Starlette ve Pydantic gibi diğer kütüphaneleri kullanarak geliştirilmiştir.Bundan dolayı yüksek performanslı bir framework’tür.

2.Veri Bilimcileri İçin FastAPI Kullanmanın Avantajları

Günümüzde veri bilimcileri için, hızlı ve etkili bir şekilde çalışabilen, ölçeklenebilir ve güvenilir API’lerin önemi giderek arttırmaktadır. Bu nedenle, FastAPI, veri bilimcileri arasında popülerlik kazanmış modern bir API framework’üdür. Peki, veri bilimcileri neden FastAPI’yi tercih etmektedir?

1. Asenkron İşlemler ve Performans Artışı: FastAPI, Python 3.7 ve sonrasındaki sürümlerde desteklenen asenkron (async/await) programlama modelini benimser. Bu özellik, veri bilimcilerine büyük veri setleri üzerinde etkili bir şekilde işlem yapma imkanı sunar. Aynı zamanda, API’lerin daha hızlı yanıt vermesini sağlayarak performans artışı sağlar.

2. Pydantic Modelleri ve Veri Doğrulama: Pydantic, FastAPI’nin ana bileşenlerinden biridir ve veri doğrulama, dökümantasyon ve otomatik belgelendirme için kullanılır. Veri bilimcileri, Pydantic modellerini kullanarak gelen istekleri otomatik olarak doğrulayabilir ve bu sayede güvenli ve tip güvenliği yüksek API’ler oluşturabilir.

3. Hızlı ve Kolay API Geliştirme: FastAPI, Python dekoratörlerini kullanarak hızlı ve kolay API geliştirmeyi destekler. Bu özellik, veri bilimcilerinin daha az çaba harcayarak ve daha az kod yazarak API’lerini oluşturmalarına olanak tanır.

4. HTTP Doğrulama ve Yetkilendirme Standartları: FastAPI, HTTP doğrulama ve yetkilendirme işlemlerini kolayca yönetmek için OAuth2 ve JWT gibi standartlarla uyumludur. Bu, veri bilimcilerinin API’lerini güvenli bir şekilde korumalarını sağlar.

7. Websockets Desteği ve Gerçek Zamanlı İletişim: FastAPI, websockets üzerinden gerçek zamanlı iletişimi destekler. Bu özellik, veri bilimcilerinin API’lerini sadece geleneksel çağrılara değil, aynı zamanda sürekli ve anlık veri akışına dayalı uygulamalara da adapte etmelerine olanak tanır.

Sonuç olarak, FastAPI, modern API geliştirmenin gereksinimlerini karşılayan, hızlı, güvenilir ve kullanımı kolay bir çözüm sunmaktadır. Veri bilimcileri, bu özellikler sayesinde API projelerini daha verimli bir şekilde yönetebilir ve daha etkili uygulamalar geliştirebilirler. FastAPI, veri bilimcilerinin işlerini hızlandıran bir araç olma özelliği ile sektörde önemli bir yer edinmiştir.

3.Rest,Restful Nedir?

Rest (Representational State Transfer),Roy Fielding’in 2000 yılındaki doktora tezinde ortaya koyduğu bir mimari yaklaşımdır. Bu yaklaşımın amacı:Client-Server arasındaki veri alışverişini HTTP Protokolü üzerinden daha hafif ve kolay şekilde yapmaktır.

Genel olarak Rest mimarisi üzerine inşa edilmiş servislere Restful Servisler denir. Bu servisler kendilerine has URI(Uniform Resource Identifier) interface’ine sahiptirler.Bu servisleri geliştirmemizdeki amaç ise Client-server arasındaki veri akışını platform bağımsız hale getirmekle birlikte, bu işlemi sağlarken, veri akış yükünü olabildiğince en aza indirmektir.

4.Verilerin Restful API’de Yönetilmesi

Restful API Yöntem → SQL karşılığı

  • Get → Select
  • Post → Insert
  • Put → Update
  • Delete → Delete

Yukarıda gösterilen yöntemler, bir Restful API’de verilerin nasıl yönetileceğini tanımlar ve CRUD(Create,Read,Update,Delete)işlemleri için temel çerçeve oluştururlar.

Not: Hassas bilgiler “Get” ile gönderilmektedir.

5. Visual Studio Code İşlem Adımları

  • Explorer kısmına gelinir, “Open Folder” seçeneği ile çalışmak istenilen klasör önceden oluşturulduysa seçilir, eğer yoksa oluşturulup seçme işlemi gerçekleştirilir.
  • Modelin fonksiyonlarının olduğu bir adet .py uzantılı dosya oluşturulur. (main.py) (Örnek main.py dosyası GitHub Repository’de vardır.)
  • Terminale aşağıdaki kod yazılır.
uvicorn main:app --reload
#ya da
python -m uvicorn main:app --reload

uvicorn: FastAPI projelerimizi üzerinde çalıştırabileceğimiz bir sanal sunucu oluşturan araçtır.

Bu kodu terminalde çalıştırdıktan sonra çıkan linke tıklayarak web servisine bağlanılır.

NOT: Aksini söylemediğimiz zaman FastAPI’nin portu 8000'dir.

Web servisinden FastAPI arayüzüne baplanmak için “//localhost:8000” yazısının sonuna “ /docs” yazılır. Aşağıdaki arayüz karşımıza çıkar.

FastAPI Web Arayüzü

6.FastAPI Model Deployment Adımları

İlk Adım: fastapi_env adında bir sanal ortam oluşturmak için terminale aşağıdaki komut girilir.

python -m venv fastapi_env

İkinci Adım: Requirements.txt dosyası oluşturulur.Çalışmada kullanılacak olan gerekli kütüphaneler bu .txt dosyasının içerisine yazılır. Oluşturulan Requirements.txt dosyasının sanal ortamda kurulumunu aşağıdaki komut sağlar.

pip install -r requirements.txt

Üçüncü Adım: Modelde kullanılacak data setini içeren .csv dosyası klasöre eklenir.

Dördüncü Adım: Makine öğrenmesi modelinin algoritmasının yazılacağı .py uzantılı (model.py)dosya oluşturulur ve bu dosya kendi içerisinde “pickle.dump( ) “ ile kaydedilir. Böylelikle oluşturulan modele ait .pkl uzantılı dosyamız çalışma klasörümüze eklenmiş olur.

Beşinci Adım: Kaydedilen .pkl dosyası ve modelin bulunduğu main.py dosyaları, API oluşturmak için main.py dosyasında kullanılır.

Proje amaçlarına uygun olarak oluşturulan main.py dosyasından sonra bu API ‘ya bağlanmak için aşağıdaki kod terminale yazılarak çalıştırılır.

uvicorn main:app --reload
#ya da
python -m uvicorn main:app --reload

Web servisinden FastAPI arayüzüne bağlanmak için “//localhost:8000” yazısının sonuna “ /docs” yazılır. Modelin başarılı bir şekilde API ile çalıştırılıp çalıştırılmadığı POST → Parameters → Execute komutu ile kontrol edilir.

Altıncı Adım: Tüm gereksinimleri barındıran bir Dockerfile dosyası ile oluşturulan proje aşağıdaki kod blokları ile birlikte imaj haline getirilir ve konteyner oluşturulur.

#İmaj Oluşturma
docker build -t fastapi:latest .
#İmajı Konteynere Dönüştürmek
docker run -p 8080:8080 fastapi:latest

Tüm bu işlem adımları ile FastAPI Model Deployment’ı ve Projenin Docker imajına daha sonra da konteynera dönüştürülmesi işlemleri yapılmıştır. Proje amaçlarına göre oluşturulan imaj hub.docker.com’ a yüklenerek paylaşılabilir.

--

--