Streamlit ile Data Science alanında Deployment İşlemleri

Dr. Fatih Hattatoglu
Academy Team
Published in
11 min readSep 20, 2023

Veri Biliminde Modellemenin Bir Adım Sonrası: Deployment

Data Science (Veri bilimi), birçok kişi için karmaşık algoritmalar, derin öğrenme modelleri ve karmaşık analizlerle özdeşleşmiştir. Ancak bu sürecin bir bölümünü oluşturur. Veri bilimciler olarak, sıkça veri temizliği ve modelleme üzerine odaklanır, bu süreçlerde başarılı sonuçlar elde ederiz. Bu bölümün de bütün çalışmanın yaklaşık %60–70 kısmını oluşturduğu ifade edilir. Ancak, bu modellerin ve analizlerin gerçek dünyada bir değer oluşturması için bir sonraki adıma ihtiyaç vardır: Deployment.

Çok iyi bir model geliştirdiğimizi ve bu modeli bir Jupyter notebook üzerinde yaptığımızı varsayalım. Harika sonuçlar üreten bir model! Bunu bir sektör kullanıcısı olan ve sürekli kullanacak biri tarafından talep edildiğini düşünürsek ilgili kişinin de kod yazma, Notebook üzerinde değişiklik yapma kabiliyetleri olmayacağı yüksek ihtimalle muhtemel olacaktır. Bu harika sonuçlar üreten modelimizi ilgili firmaya veya kişiye teslim ederken şöyle mi diyeceğiz: “Aman sakın kodların geri kalanına dokunma ve sadece şu satırlarda tırnak içindeki yerlere gelip tahmin etmek istediğin değerleri yaz !” Bu tarz bir yaklaşımın makul olmayacağı açıktır. O zaman nihai ürün bu formatta olmamalıdır. Daha “user friendly” bir formda ve herkesin kullanımına alışık olduğu bir web sayfası formatında olmalıdır. Bu işleme genel bir kavram olarak Deployment denir.

Genel Çerçeve

Deployment Neden Önemlidir?

Bir modelin veya analizin değeri, onu kullanabilecek olanlara ulaştığında gerçek anlamını bulur. Bu kullanıcılar, aynı departmanda çalışan bir meslektaşınızdan, dünyanın öbür ucundaki bir müşteriye kadar değişebilir. Bu nedenle, nihai ürünlerin bu kullanıcılara ulaştırılması, modellemenin ve analizin kendisi kadar kritiktir.

Deployment’ın önemi şu sebeplerle vurgulayabiliriz:

Gerçek Dünya Uygulamaları: Bir makine öğrenimi modeli eğitildiğinde, bu modelin gerçek dünyada bir problemi çözmesi için uygulamalara entegre edilmesi gerekir. Örneğin, bir e-ticaret sitesi için ürün öneri sistemi geliştirildiyse, bu sistemin kullanıcıya gerçek zamanlı öneriler sunabilmesi için siteye entegre edilmesi gerekir.

Otomatikleşme: Deployment, otomatikleşmeyi mümkün kılar. Örneğin, bir banka kredi skorlama modeli geliştirdiyse, bu modelin otomatik olarak müşteri başvurularını değerlendirmesi için sisteme entegre edilmesi gerekir.

Kullanıcı Etkileşimi: Özellikle interaktif veri analizi ve görselleştirme araçları, kullanıcıların veriyle etkileşimde bulunmasını sağlar. Bu, kullanıcıların veriyi daha iyi anlamalarına ve daha bilinçli kararlar almalarına yardımcı olabilir.

Web Tabanlı Uygulamaların Yükselişi

Günümüzde masaüstü uygulamaları, web tabanlı uygulamalara yerini bırakmaktadır. Bu değişim, veri bilimcilerine analitik ürünlerini doğrudan web üzerinden kullanıma sunma fırsatı tanımaktadır.

Streamlit ile Tanışın

Bu yazıda, ürünlerinizi web üzerinden doğrudan kullanıma açabileceğiniz, kişiselleştirilebilir uygulamalar dizayn edebileceğiniz bir araç olan Streamlit’i tanıtıyorum. Streamlit, veri bilimcilerinin modellerini ve analizlerini hızlı ve etkili bir şekilde web tabanlı uygulamalara dönüştürmelerine olanak tanır.

Meseleye daha bütüncül bakalım. Öncelikle deployment süreci içerisinde Streamlit’in yerini ele alalım. Bunun için alttaki resmi dikkatinize sunuyorum.

Deployment Süreci -1

Burada bazı deployment metotlardan birisinin iç işleyişi görülüyor. Streamlit ile deploy etmek bir metottur. Alternatif olarak flask ile deploy etmek de söylenebilir. Tıpkı HTML-CSS ile web sayfası oluşturmak gibidir. Süreç içerisinde web sayfasını yani modelinizin sonuçlarının gösterileceği ve tahmin yaparken kullanılacak alternatif seçimlerinin olduğu sayfayı Streamlit kodları ile oluşturacağız. Bu modelde gerekli olan model dosyalarını GitHub’dan elde edeceğiz. Sonrasında streamlit ile oluşturulan sayfayı ve github’dan çektiğimiz dosyaları AWS (Amazon Web Services) Cloud ssitemi üzerinden deploy edeceğiz. Deploy etmeye IT sektöründe “canlıya çıkarma” tabiri de kullanılıyor. AWS burada bizim dosyalarımızın 7/24 ulaşılabilirliğini sağlayan uzak masaüstü bilgisayarımız olacaktır. AWS kullanmayanlar diğer Cloud sistem alternatiflerini de (Azure, Google Cloud gibi) kullanabilir. AWs’deki hesabımız ile oluşturduğumuz Instances üzerinde gerekli kütüphaneleri import edeceğiz ve oraya yüklediğimiz web sayfası dosyalarını ve diğer modelleme dosyalarını kullanacağız. AWS’ nin sunduğu cloud hizmetine farklı bir alternatif olarak Streamlit’in sunduğu cloud sistemi de kullanılabileceği gibi ücretsiz olarak bu hizmeti alabileceğimiz Vercel ve Heroku gibi alternatifler de vardır.

Deployment Süreci -2

Streamlit: Python ile Web Uygulamalarının Kolayca Yayınlanması

Yapay zeka ve veri bilimi projeleri, son yıllarda büyük bir ilerleme kaydetti. Ancak bu projelerin son kullanıcılara ulaştırılması, çoğu zaman karmaşık ve zaman alıcı bir süreç olabiliyor. İşte bu noktada Streamlit devreye giriyor !

Streamlit Nedir?

Streamlit, e veri bilimi alanında çalışan kişilerin projelerini kolayca web üzerinde yayınlamalarını sağlayan açık kaynaklı bir framework’tür. Temel olarak Python programlama dili ile çalışır, ancak isteğe bağlı olarak basit HTML — CSS kodlarıyla da zenginleştirilebilir. Bu sayede, kullanımı son derece kolay ve estetik olarak çekici web uygulamaları oluşturabilirsiniz. Aşağıda yapacağımız uygulamalar için “streamlit.io” sayfasından ücretsiz üyelik yapmanız gerekmektedir.

Neden Streamlit ?

Geleneksel olarak web uygulamalarını hayata geçirmek için HTML, CSS ve JavaScript gibi dillere aşina olmanız beklenir. Fakat Streamlit, bu dillere gerek kalmadan doğrudan Python kullanarak interaktif web uygulamaları geliştirmenize imkan tanır. Bu özellik, veri bilimcileri ve yapay zeka profesyonelleri için büyük bir avantajdır; zira bu sayede sadece Python bilgisiyle etkileyici web uygulamaları oluşturabilirsiniz.

Streamlit, veri bilimi ve makine öğrenimi projelerinizi etkili bir şekilde web’de sunmanızı kolaylaştıran harika bir platformdur. Eğer Python dilinde çalışmalar yapıyorsanız ve bu çalışmalarınızı geniş bir kitleyle paylaşmak istiyorsanız, Streamlit sizin için ideal bir seçenektir!

Streamlit ile oluşturulan örnek bir sayfa tasarımına bakalım.

https://blog.streamlit.io/building-a-streamlit-and-scikit-learn-app-with-chatgpt/

Streamlit ile web sayfası oluşturmaya başlarken bir eskiz çalışması ile ön tasarım yapmak sonrasını kolaylaştıracaktır. Bu eskiz tasarımda menülerin yeri, butonların konumu, kayan bar yerleşiminin nerede olacağı gibi sorulara cevap aranarak kağıt üstünde nihai yerleşime karar verilir. Örnek bir eskiz alttaki resimde görülmektedir. Bu kısımda eğer sahipseniz HTML-CSS yeteneklerinin devreye girmesiyle daha güzel görünümler de elde edilebilir. Fakat Data Science alanındaki uzmanlardan ileri seviye bir web sayfası tasarımı sanırım kimse beklemez.

https://www.misraturp.com/post/create-a-web-app-for-your-data-science-project-in-under-an-hour

Streamlit ile adım adım web sayfası oluştururken yaptığımız tasarımı aynı anda kendi bilgisayarımız içerisinde deploy ederek sonucu görmek üzere Anaconda Jupyter Lab kullanmayı tavsiye ediyorum. Alttaki resimde Jupyter Lab başlangıç noktası görülmektedir. Alternatif olarak bilgisayarınızdaki Not Defteri kullanarak “txt” dosyası ile de devam edilebilir veya VS Code ile de benzer işlemler yapılabilir. Önemli olan yapılan değişikliğin aynı anda ekranda izlenebilmesidir.

Anaconda Jupyter Lab ekranı

Jupyter Lab içinde çalışmak istediğiniz klasöre ulaşıp bu klasör içinde yeni bir txt dosyası oluşturarak başlayacağız. Dosyayı alttaki resimdeki gibi oluşturduktan sonra bu dosyanın uzantısını değiştirmemiz gerekiyor. Bu tarz dosyaların uzantısını “ *.py ” olarak ayarlayacağız. Streamlit kodlarını yazacağımız ve deploy edeceğimiz dosyanın .py uzantılı olması gerekiyor. Genelde “ app.py ” dosya ismi oluşturularak kodlar bu dosyaya yazılır.

Jupyter Lab ekranı

Şimdi kod yazımına kısa bir ara verip streamlit kodlarını yürüteceğimiz ve kendi bilgisayarımızda deploy edeceğimiz alt yapıyı oluşturalım. Bu amaçla “Anaconda Prompt terminalini” kullanacağız. Burada Python kütüphanesini içerdiği için anaconda Prompt Terminali tercih edebiliriz. Eğer güncel python versiyon problemi yaşanırsa Streamlit in desteklediği son güncel pyhon versiyonu install etmek gerekir. Bu noktada VS Code kullanarak da bilgisayarda SSH bağlantısı oluşturarak yürüyebilirsiniz. Daha güvenli bağlantı imkanı sunduğu için Terminal üzerinden gideceğiz.

Prompt Terminalde alttaki kodu yazarak Streamlit kütüphanesi terminale yüklenir. Mac kullanıcıları yine terminalden yapabilirler.

pip install streamlit

Eğer streamlit install sorunu olursa ek bir çözüm önerisi olarak alttaki gibi bir yükleme metodu kullanabilirsiniz.

conda install -c conda-forge streamlit
Streamlit Install

Tam bu noktaya kadar yaptıklarımız itibariyle mantıksal kurgu şöyle işliyor: Bu yüklemeleri şimdilik kendi bilgisayarımızda canlıya çıkarmak için yapıyoruz. Tüm tasarım başarıyla kendi bilgisayarımızda tamamlandıktan sonra ikinci kısımda tüm yüklemeleri tekrar boş AWS makineye (orada açacağımız Instance üzerine) yapacağız ve oradan yayına çıkacağız. AWS kısmında gerçekleşecek işlemleri 2. makale olarak yayınladım.

Anaconda Prompt Terminalde “Streamlit version” yazarak Streamlit versiyon kontrolü yapıyoruz.

Versiyon kontrolü

Sonra yine terminal ekranında “Streamlit hello” yazarak alttaki resimdeki görüntüye ulaşırız. Resimde görülen Network URL kısmındaki rakamlar bilgisayarımızdaki tahsis edilen URL’yi ifade etmektedir. Bu URL’yi kopyalayarak da ön sayfayı açabiliriz. Yine bu esnada bilgisayarınızda Web Browser’da Streamlit Hello sayfası da açılmış olacaktır. Streamlit Hello sayfası açılması esnasında “streamlit.io” sayfasına daha önce yaptığınız ücretsiz üyelik için giriş bilgileri isteyecektir.

Streamlit Hello
Streamlit Hello

Bu sayfada birkaç örnek projeler gösterilmektedir. Örnek projelerde de görüldüğü gibi Machine Learning projeleri dump edilerek kaydedilerek script şeklinde html tarzında yazılarak uygulama çalıştırılıyor. Soldaki menü kısmındaki butonlardaki değerler değiştirilerek sonuçların değişimi izlenebilir.

Eğer Streamlit Hello sayfası bilgisayarınızda sorunsuz biçimde açıldı ise buraya kadar her şey yolunda demektir. Bu sayfayı şimdilik kapatabiliriz. Birazdan kendi yeni web sayfamızı Streamlit üzerinden inşa edeceğiz.

Şimdi çalıştığımız klasöre giderek adını “app.py” olarak değiştirdiğimiz dosyanın işçine streamlit kodlarını yazmaya başlayacağız. Bu amaçla Anaconda Jupyter Lab programını kullanalım. App.py dosyasına öncelikle streamlit import edeceğiz. Hemen sonrasında da bazı streamlit kodlarını yazarak sayfanın ilk bilgilerini oluşturalım. Kodların yanındaki açıklama kısmında kodların ne amaçla kullanıldığı bilgisini de ekliyorum ( “# başlık ekler” gibi)

import streamlit as st   # streamlit kütüphanesini import etmekle başlıyoruz
#text/file
st.title(“Streamlit Tutorial”) # H1 başlık ekler
st.text(“Hello Streamlit”) # metin ekler

(Metinlerde tek tırnak değil çift tırnak kullanılması durumunda hata alınmayacaktır.)

Yazdığımız kodları hemen kendi bilgisayarımızda deploy etmek üzere app.py dosyasını run etmemiz gerekiyor. Bunun içinAnaconda Prompt terminalde app.py dosyasının olduğu klasör konumuna kadar gelmemiz gerekiyor. Bunun için örnek olarak “cd desktop” yazarak klasör değişimini yapabiliriz.

Streamlit run

Bu komutu çalıştırınca alttaki ekranda tıpkı streamlit hello sayfasındakine benzer Terminal prompt ekranı ve sağdaki boş web sayfası açılacaktır. App.py dosyasında yazdığımız st.title ve st.text komutlarının deploy edilmiş hali görülmektedir.

Streamlit Hello

Şimdi resimdeki gibi ekranı ikiye bölerek sol tarafta kod yazacağız ce sağ tarafta “canlıya çıkmış” yani deploy edilmiş halini göreceğiz.

App.py dosyasına yeni kod ekledikçe save ettiğimizde yan tarafta deploy edilmiş halini görmek için Streamlit sayfasında sağ üst tarafta “Always Rerun” seçeneğini aktif etmeliyiz. Bunu sürekli yapmamak için Streamlit sağ üst köşedeki menüye girip Setting kısmından “Run on Save” seçeneğini aktif edeceğiz.

Şimdi app.py dosyasında kullanabileceğimiz Streamlit kodları ve örnek kullanımlarını içeren liste paylaşalım.

st.header("This is a header")   # alt başlık ekler
st.subheader("This is a subheader") # daha küçük bir alt başlık ekler
st.write("Writing example text ") # bilgilendirme text'i ekler

#importing image (Resim eklemek içinm alttaki kodlar kullanılır)
from PIL import Image
img=Image.open("resim_yolu.jpg")
st.image(img, width=600, caption="resim_alt_yazısı")
#importing video (video dosyası veya youtube bağlantısı eklemek)
video=open("video_adı.mp4", "rb") # kendi bilgisayarınızdan bir video dosyasını eklemek için
st.video(video)
# st.video('https://www.youtube.com/watch?v=xhGwjUKbiC4') # youtube’dan bir videoyu eklemek için

#chekbox eklemek
if st.checkbox("On/Off"):
st.text("You Selected box")

#radio button olusturma
car=st.radio("Select your car ", ("BMV", "Audi"))
if car == "BMV" :
st.success("Congrats")
else:
st.info("Good car")

st.markdown("**markdown text**") # markdown formatında metin ekler
# (** .......** tarzında yazınca bold olarak yazılır)

st.success(“Green Text”) # Yeşil bant yazı ekler
st.info("Blue text") # Mavi bant yazı ekler

#warning-eror (Bant şeklinde yazı alanı ekler)
st.warning(“This is a warning”) # Sarı bant yazı ekler
st.error(“This is an error”) # Kırmızı bant yazı ekler
#get help  (Herhangi bir nesnenin yardım dokümantasyonunu gösterir)
st.help(st.slider)

#select box (Açılır menü ekler)
menu=st.selectbox("Your program is ", ["DS", "DEV", "Cyber"])
st.write("Your program is", menu)

#multiselect (Birden fazla seçenek seçilebilen bir kutu ekler)
career = st.multiselect("Select your career", ["IT", "Engineer", "Doctor"])
st.write("Your career is", career)

#slider (Kullanıcının değer seçebilmesi için kaydırıcı ekler)
points=st.slider("How many points" ,1,10)
#button (Bir buton ekler)
st.button("Tıkla")
if st.write("Butona tıklandı"):

#text input (Metin girişi için bir kutu ekler)
name= st.text_input("Enter your name:")
if st.button("Run"):
st.success(firstname.title()) # girilen ismin ilk harfini “.title() “ ile büyük harfe çevirir

#text area (Metin girişi için bir yazım alanı ekler)
area= st.text_area("paragraf yazabilirsiniz:")

#date input (Tarih seçimi için bir kutu ekler)
import datetime
today=st.date_input("Today is" , datetime.datetime.now()) # now() ile bugünün tarihini ekler

#rakam şeklinde input
st.number_input('Pick a number', 0, 10)

# multiple line code (Çoklu satır halinde kod satırı yazımı)
with st.echo(): # Kodu ve kodun çıktısını aynı anda gösterir.
import pandas as pd
import numpy as np
import streamlit as st

# code raw (tek satırlık kod şeklinde yazdırmak için )
st.code("import pandas as pd")

# sidebar (Yan panel alanı ekler)
st.sidebar.title("Yan panel başlık yazısı")

st.latex(r'E = mc^2') #LaTeX formatında matematiksel ifadeler ekler.

# Dosya Yükleme
import pandas as pd #ilgili kütüphane import edilir
# Dosya yükleme widget'ını ekleyin. Örnek dosya Advertising.csv olsun. Bu dosyaya linkten ulaşabilirsiniz
uploaded_file = st.file_uploader("Advertising.csv", type=["csv"])
# Eğer bir dosya yüklendiyse, bu dosyayı pandas ile okuyun
if uploaded_file is not None:
data = pd.read_csv(uploaded_file)
st.write(data) # DataFrame'i ekrana yazdır


# Dosyayı doğrudan pandas ile okuyun..dosya aynı dizinde olmalı
data = pd.read_csv('Advertising.csv')
st.write(data) # DataFrame'i ekrana yazdır
# st.dataframe(data) # üst satırla aynı şeyi yapar (df i ekrana yazdırır)
# Plotly ile bir scatter plot oluşturalım. Örneğin, TV reklam bütçesi ile satışları karşılaştıralım.Advertising.csv dosyası ile yapalım
import plotly.express as px
fig = px.scatter(data, x='TV', y='sales', title='TV Reklamları vs. Satışlar')
st.plotly_chart(fig)
#Vega-Lite ile bir bar chart oluşturalım. Örneğin, radyo reklam bütçesinin ortalamasını gösterelim. Advertising.csv dosyasını kullanıyoruz
bar_chart = {
"mark": "bar",
"encoding": {
"x": {"field": "radio", "bin": True, "type": "quantitative"},
"y": {"aggregate": "average", "field": "sales", "type": "quantitative"}
}
}
st.vega_lite_chart(data, bar_chart)

#st.pyplot(): Bu fonksiyon, Matplotlib ile oluşturulan grafikleri göstermek için kullanılır. Örneğin, TV reklam bütçesi ile satışları bir scatter plot ile gösterelim. Advertising.csv dosyasını kullanıyoruz
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
plt.scatter(data['TV'], data['sales'], color='blue')
plt.title('TV Reklamları vs. Satışlar')
plt.xlabel('TV Reklam Bütçesi')
plt.ylabel('Satışlar')
st.pyplot(plt)

#st.map():Bu fonksiyon, coğrafi veri görselleştirmesi için kullanılır. Advertising.csv bu tür verilere sahip olmadığı için bu fonksiyonun kullanımı bu veri seti için uygun değil. Ancak, genel bir örnek vermek gerekirse:
# Örnek veri
map_data = pd.DataFrame({
'lat': [37.76, 37.77, 37.78],
'lon': [-122.4, -122.5, -122.6]
})
st.map(map_data)

#st.line_chart():Bu fonksiyon, çizgi grafikleri göstermek için kullanılır. Örneğin, veri setindeki satışları bir çizgi grafiği ile gösterelim:
st.line_chart(data['sales'])

#st.altair_chart():Altair ile bir bar chart oluşturalım. Örneğin, radyo reklam bütçesi ile satışları karşılaştıralım. Advertising.csv dosyasını kullanıyoruz:
import altair as alt
chart = alt.Chart(data).mark_bar().encode(
x='radio',
y='sales',
color='sales'
).properties(
title='Radyo Reklamları vs. Satışlar'
)
st.altair_chart(chart, use_container_width=True)

# Veri çerçevesini görüntüler
df = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]})
st.code(
df.to_markdown(),
#lang="markdown",
#linenumbers=True,
)

#st.checkbox ( Onay kutusu oluşturur)
if st.checkbox('Onayla'): st.write('Onaylandı!')

st.balloons() # Eğlenceli bir görünüm olarak sayfaya balon ve kar tanesi efekti ekliyor
st.snow()

Alttaki resimdeki gibi, solda st.sidebar.slider , st.sidebar.selectbox , st.sidebar.radio gibi ilavelerle resimde görülen sidebar yani panelin içini dizayn etmiş oluyoruz.

sidebar uygulaması

Bu kodlardan biraz daha fazlası da streamlit.io içeriğinde bulunabilir. Bu sayfaya ulaşmak için linke tıklayınız. Kodların yazımı bazen güncellenmektedir veya bazen komutların yeni versiyonda kaldırıldığı bilgisi de Streamlit tarafından verilmektedir.

Yukarda verilen kodlarla sayfa tasarımını güzelleştirmenin yanında app.py dosyasının içerisinde ML modelini pickle.load(), joblib.load(), Scaler.transform(), model.predict() gibi fonksiyonlarla tekrar çağırıp prediction (tahmin) yaptıracak kodlarını da eklemeliyiz.

Son zamanlarda ChatGPT ile entegrasyonun sağlandığı yazılar pek makbul. Bu bağlamda bu yazıda Streamlit’in ChatGPT ile entegrasyonuna girmedim ama linkteki bağlantıda Streamlit’in resmi sayfasında yayınlanan bir blog yazısını paylaşıyorum.

Bu yazıda yer alan kodların bir kısmı ile oluşturulmuş bir ekran görüntüsü ile yazımızı sona erdirelim. Bu makalenin devamı niteliğinde streamlit ile oluşturduğunuz web sayfasının AWS üzerinden deploy edilerek yayınlanması aşamalarını okuyabilirsiniz.

Örnek Sayfa

--

--