Elif Sağlam
MLOpsTurkey
Published in
5 min readJun 30, 2022

--

Flask Tabanlı Bir Web Uygulama Nasıl Deploy Edilir?

Makine öğrenimi sürecini, üretime giden bir yol ve üretimde daha uzun ömürlü modeller vaat eden bir disiplin olarak düşünürsek bu sürecin temel taşlarından biri de deployment aşamasıdır. Veri bilimi yaşam döngüsünde sadece bir ML modeli oluşturmak yeterli olmayıp makine öğrenimi sistemlerinin güvenilir dağıtımı da oldukça önemlidir.

Bu yazımızda, deployment sürecindeki birkaç kavramdan bahsederek Flask tabanlı bir web uygulaması için Dockerfile kullanarak image oluşturma ve uygulamayı containerize etme sürecini ele alacağız.

DevOps/MLOps

Kavramları tanımlamadan önce DevOps ve MLOps’a kısaca değinelim.

DevOps, yazılım uygulamalarını üretime göndermeye yönelik yinelemeli bir yaklaşım olarak tanımlanır. Development yaşam döngüsünü optimize etmeyi, kodu üretime dağıtmak için daha yüksek hızı ve sürümlerin daha güvenilir olmasını sağlayan yazılım çözümlerini geliştirmeyi ve sürdürmeyi amaçlar.

MLOps, makine öğrenimi modellerini üretime almak için aynı ilkeleri benimseyen bir yaklaşımdır. Veri akışını, model geliştirmeyi, değerlendirmeyi, devreye almayı ve izlemeyi otomatikleştirmek temel amaçtır.

DevOps’tan farklı olarak, makine öğrenimi operasyonlarının çok sayıda denemeyle uğraşması, izlenebilirliğe sahip olması ve tüm farklı denemeler için metrikleri ve parametreleri karşılaştırması gerekir. Zaman içerisinde veride yaşanacak değişikler nedeniyle geliştirilen modellerde performans değişikliği yaşanabilir. Bu noktada MLOps’un üretimdeki model performansını sürekli olarak izlemesi gerekir.

İki yaklaşım arasındaki bir diğer farklılık, DevOps’ta yalnızca CI/CD (Sürekli Entegrasyon ve Sürekli Dağıtım) pipeline’ ının gerekli olmasıdır. MLOps’ta ise ek olarak yeniden eğitim gereklidir. MLOps, veriler ve modeller için Sürekli Entegrasyona (CI), modellerin Sürekli Eğitimine (CT) ve modellerin Sürekli Dağıtımına (CD) sahiptir.

Kavramlar;

  • CI/CD (Continuous Integration/Continuous Delivery Deployment): Sürekli entegrasyon, sürekli teslimat ve sürekli dağıtım olarak değerlendirilen bu süreç DevOps’tan türetilen bir uygulamadır. Sorunları tanıma, değerlendirme ve makine öğrenimi modellerini otomatik olarak güncellemeye yönelik süreci ifade eder. Makine öğrenimi sürecine manuel olarak müdahale etme ihtiyacını azaltır ve pipeline oluşturarak süreci otomatikleştirir. Bu otomatikleştirme ve daha az yapılan manuel müdahale veri bilimi sürecini daha verimli, hızlı ve insan hatasına daha az eğilimli bir süreç haline getirir.
  • Docker /Docker File: Docker, container adı verilen sanallaştırılmış ortamlarda uygulamalar geliştirmek, dağıtmak ve yönetmek için kullanılan açık kaynaklı bir platform olarak tanımlanır. Bir Container’ ın çalışması için ilk olarak Dockerfile dosyasının oluşturulması gerekir. Dockerfile, docker image’ı oluşturmak için kullanılan bir metin (yaml formatında) dosyasıdır. Bu dosya, uygulamanın nasıl bir ortamda çalışacağını, hangi dosyaları içereceği ve hangi uygulamanın hangi parametrelerle çalışacağı bilgilerini içerir. Dockerfile doyasında bulunan komutlar satır satır çalışır ve docker image oluşturur. Dockerfile içerisindeki her bir komut satırı bir katmana karşılık gelmektedir. Peki Dockerfile nasıl hazırlanır ve içerisinde hangi komutlar(temel) yer alır biraz değinelim.

FROM: Dockerfile’ daki ilk komut FROM komutudur. Dockerfile oluşturmaya başlamadan önce ilk yapılacak şey Base Image belirtmektir ve bu FROM komutu ile yapılır.

WORKDIR: Container’ ın çalışma dizinini belirtmek için kullanılır. Belirtilen Path mevcut değilse oluşturularak Path’e geçiş yapılır.

RUN: Uygulama içerisinde çalıştırmak istediğimiz komutların tanımlandığı yerdir. Docker Image alınırken çalıştırılmasını istediğimiz komutları içerir. Dockerfile içerisinde birden fazla RUN komutu yer alabilir. Birden fazla RUN komutu olması durumunda image boyutunu arttırmamak adına RUN komutlarının && operatörü ile kullanılması önerilir.

COPY: Belirtilen dosyaları veya klasörleri kaynak adresinden image sistemdeki(container içerisinde) belirlenen hedef adrese kopyalanması sağlar.

ADD: COPY komutu ile aynı göreve sahiptir. Ek olarak container içerisine internetten dosya kopyalamak için de kullanılır.

CMD: Docker container ayağa kalktığında çalıştırılacak komutları içerir. Dockerfile içerisinde bir tane CMD komutu kullanılabilir ve birden fazla olması durumunda son kullanılan CMD komutu geçerli olacaktır.

EXPOSE: Containerda ayağa kaldıracağımız uygulamamızın port bilgisini tanımladığımız komuttur.

Oluşturulan Dockerfile dosyası docker build komutu ile çalıştırılır ve Docker Image oluşur. Docker Image, docker platformunda çalışabilen bir uygulama oluşturmaya yönelik yani container yaratmak için talimatları içeren read only bir şablondur. Container ise image dosyası kullanılarak oluşturulan ve çalışan bir kopyadır.

Dockerfile içerisindeki talimatlara göre oluşturulan Docker Image çalıştırılır ve ilgili uygulama container da ayağa kaldırılır.

UYGULAMA

Temel olarak deploy sürecindeki tanımlara değindik. Uygulama kısmında önceki yazılarımızdaki Python Flask ile oluşturduğumuz örnek uygulamayı Container içerisinde çalıştıralım.

Bu uygulamanın yapılabilmesi için öncelikle çalıştığımız ortamda Docker’ın kurulu olması gerekmektedir (Docker kurulumu).

Uygulamamızın Dockerfile dosyası;

FROM python:3.9.12RUN mkdir /appWORKDIR /appADD . /app/RUN pip install --upgrade pip && pip install -r requirements.txtEXPOSE 5005CMD ["python", "app.py"]

Dockerfile dosyasında FROM python:3.9.12 komutu ile hangi python versiyonunu kullandığımızı tanımlıyoruz. RUN komutu ile uygulamamız için gerekli olan kütüphaneleri/güncellemeleri tanımlayarak EXPOSE 5005 komutu ile container’ ın docker içinde hangi portta çalışacağını tanımlıyoruz. Gerekli paket yüklemeleri tamamlandığında CMD komutunda belirtilen uygulama dosyası çalışmış olacaktır.

docker build komutu ile Dockerfile dosyası içerisindeki komutlar sırasıyla çalışarak image oluşturulur.

docker build -t <image_name> .

NOT: “docker build” komutu çalıştırılırken Dockerfile dosyamızın adresi belirtilmelidir. Bu adres localde bulunan bir path veya bir git url’i olabilir. Buradaki uygulamada Dockerfile dosyamız aynı klasör içerisinde yer aldığı için “.” ile tanımlandı. “docker build” komutunun almış olduğu bir diğer parametre tag yani -t parametresidir. Bu parametre ile oluşacak Docker Image’ine isim verilir.

Oluşturmuş olduğumuz bu image’i kullanarak docker run komutu ile uygulamamızı ayağa kaldıralım.

docker run -d -p ExternalPort:InternalPort <image_name>

NOT: “docker run” komutunun -d parametresi, Container’ ın arka planda çalışmaya devam etmesini sağlar. -p parametresi ile çalışacak port bilgileri tanımlanır.

docker ps komutu ile container’ ın ayağa kalktığını görebiliriz.

Uygulamamızı 7000 portunda çalıştırdık. http://localhost:7000 üzerinden uygulamamızı inceleyebiliriz.

--

--