https://commons.wikimedia.org/wiki/File:A_scenic_view_of_clouds_from_plane_window.jpg

Knime Workflowlarınızı Kendi Sunucunuza Deploy Edin — [Knime][Python][Linux]

Gökhan Gerdan

--

Bu yazımda Knime ile çalışanlar için hazırladıkları workflowları kendi sunucularında hiçbir ücret ödemeden nasıl barındırabileceklerini ve bir REST API aracılığıyla nasıl kullanabileceklerini anlatacağım.

Bildiğiniz gibi Knime’ın Analytics Platform ve Server isimlerinde iki farklı yazılımı var.

https://www.knime.com/software-overview

Knime Analytics Platform herkesin bildiği masaüstü ortamında kullanılan hiç kod yazmaya gerek olmadan görsel modeller ile ETL, ML gibi işlerinizi tasarlayıp yapabileceğiniz bir uygulamadır. Burada örneğin bir ML modelinizi eğitip PMML formatında dışa aktardıktan sonra mesela Java ile yazdığınız bir mikro servis içerisinde kullanarak istediğiniz yere deploy edip tahminlerinizi yaptırabilirsiniz. Ama bu durumda verinin temizlik, ön işleme gibi işlemlerini de bu servis içerisinde kodlamanız gerekebilir. Öyleyse ne anladık Knime’ın sıfır kod ile iş yapma avantajından. Tabi bu durumda Knime Server kullanabilirsiniz. Knime Server da, Analytics Platformda eğittiğiniz modelleri deploy edip REST API ile bulutta kullanabilmenize imkan sağlayan bir yazılımdır. Tabi bu imkanın yanında bir sürü özelliği daha vardır. Knime Analytics Platformun açık kaynak kodlu ücretsiz bir yazılım olduğunu biliyoruz. Peki ya Knime Server?

https://www.knime.com/knime-software/knime-server-pricing

Malesef Knime Server bazılarımız için biraz tuzlu olabilir. En düşük paketine bile ayda ortalama 1000 dolar ödemek durumunda kalabilirsiniz.

https://azuremarketplace.microsoft.com/en-us/marketplace/apps/knime.knime-server-small?tab=PlansAndPrice

Bu ücretleri ödemek istemeyenler için Knime Analytics Platform uygulamasını batch mod ile sunucuda çalıştırıp Python ile yazılımış bir REST API aracılığıyla nasıl kontrol edilebileceğini ve bu yöntemin avantajlarını ve dezavantajlarını adım adım anlatacağım.

Uygulama Adımları:

  1. Ubuntu Server 18.04 Üzerinde Knime Kurulumu
  2. Örnek Bir Workflowun Hazırlanması
  3. Worflowun Sunucuda Çalıştırılıp Ortamın Test Edilmesi
  4. Uzaktan Kontrol İçin Python İle Basit Bir REST API Hazırlanması

1. Ubuntu Server 18.04 Üzerinde Knime Kurulumu

SSH ile bağlandığımız sunucuda aşağıdaki komutu çalıştırarak Knime 4.0.0 sürümünü indirelim:

ÖNEMLİ UYARI: Workflowu oluşturduğunuz Knime sürümü ile sunucuya indireceğiniz Knime sürümü aynı olmak zorundadır. Bilgisayarınızdaki knime 4.0.1 ise sunucunuzdaki Knime 4.0.0 olamaz. Sunucudaki de 4.0.1 olmak zorundadır. Aksi halde workflowunuz çalışmaz ve hata alırsınız.

wget https://download.knime.org/analytics-platform/linux/knime_4.0.1.linux.gtk.x86_64.tar.gz

İndirdiğimiz sıkıştırılmış dosyayı aşağıdaki komut ile dışarı çıkarabiliriz:

tar -xvf knime_4.0.1.linux.gtk.x86_64.tar.gz

Şimdi de sıkıştırılmış dosyadan kurtulabilirsiniz.

rm knime_4.0.1.linux.gtk.x86_64.tar.gz

2. Örnek Bir Workflowun Hazırlanması

Bu aşamada basit bir workflow hazırlamanız gerekiyor. Örnek olarak aşağıda gördüğünüz workflowu kullanabilirsiniz. Bu bağlantıdan indirebilirsiniz.

Burada önemli olan iki node var bunlar Container Input (Table) ve Container Output (Table). Bu nodlar batch modda çalıştıracağımız workflowa dışarıdan veri alıp vermemizi sağlayacak. Gerekli olduğu kadar input ve output nodları kullanılabilir.

3. Workflowun Sunucuda Çalıştırılıp Ortamın Test Edilmesi

Bu bölümde hazırladığımız workflowu sunucuya taşıyıp aşağıdaki script ile çalıştırarak çıktısını ekrana yazdıracağız. Knime ve workflowa ait pathleri kendinize göre düzenlemeyi unutmayın.

Bu scripti çalıştırmadan önce gerekli kütüphaneleri (pandas, knime) aşağıdaki şekilde yükleyebilirsiniz. Python3 ve pip3 araçlarının yüklü olduğunu varsayıyorum.

pip3 install pandaspip3 install knime

Yukarıda da paylaştığım bu linkten indirdiğiniz örnek workflowu scp kullanarak aşağıdaki komut ile sunucunuza gönderebilirsiniz:

scp -r knimepy mluser@192.168.41.181:/home/mluser

Şimdi sunucuda herşey hazır olduğuna göre yukarıdaki scripti nano ile test.py isimli bir dosya açıp sunucumuzun /home/mluser/test.py dizininde olacak şekilde kaydedelim.

Sunucumuz içerisinde oluşturduğumuz dizin ve dosyalar aşağıdaki gibi olacaktır:

- home                       # Home dizini
- mluser # Kullanıcı Dizininiz
- knime_4.0.1 # Knime Analytics Platform
- knimepy # Örnek Workflow
- test.py # Ortamı Test Etmek İçin Script

Burada test.py scriptini aşağıdaki şekilde çalıştıralım:

python3 test.py

Eğer aşağıdaki çıktıyı görüyorsanız artık sunucunuzda Python ile Knime workflowlarını çalıştırabiliyorsunuz demektir:

  prediction
0 male

4. Uzaktan Kontrol İçin Python İle Basit Bir REST API Hazırlanması

https://falconframework.org/

Python programlama dili ile REST API oluşturmak için hazırlanmış bir sürü modül ile karşılaşmış olabilirsiniz. Bunlardan en popülerleri olan Django-REST (Django) ve Flask-RESTful (Flask) modüllerini duymuşsunuzdur. Genelde bu tip örneklerde Flask kullanıldığını görüyorum ve bir değişiklik olması açısından aynı zamanda da daha yüksek performanslı bir framework olduğundan ben bu örneği Falcon Framework ile hazırladım.

Hazırladığım örnek apiyi çalıştırabilmek için aşağıdaki komutlar ile gereksinimleri yükleyin:

apt install gunicorn3pip3 install falcon

Yukarıdaki örneği test.py dosyası ile aynı yere api.py olarak kaydedin içerisindeki dosya yollarını gerektiği şekilde değiştirin ve aşağıdaki komut ile çalıştırın:

gunicorn3 --bind 0.0.0.0:8000 api:api

EK BİLGİ [27.01.2020]: Bu şekilde çalıştırdığınızda tek seferde bir isteğe cevap verecektir. ard arda gönderilen istekleri sıraya alacaktır. Gunicorn ile birden fazla isteğe aynı anda cevap verebilmek için aşağıdaki şekilde çalıştırmanız gerekecetir. Ama bu sefer de bir knime workflow dosyası birden fazla knime uygulamasında kullanılamayacağından yalnızca ilk isteğe verdiği cevapta sonuç döndürebilecektir. Bu problemi aşmak için her request için workflow dosyasını çoğaltıp boştaki workflow dosyasına yönlendirebilecek bir nevi kendi custom load balancerınızı yazmanız gerekebilir.

gunicorn3 --bind 0.0.0.0:8000 api:api --threads 3 --workers 3

Burada pandas kütüphanesi de apiye gelen json veriyi tabloya ve knimedan dönen tabloyu da tekrar jsona dönüştürmek için kullanıldı.

Aşağıdaki gibi bir REST client (Insomnia) kullanarak siz de oluşturduğunuz apiyi test edebilirsiniz:

Sonuç

Avantajlar:

  • Hiç kod yazmadan Knime ile hazırladığınız ETL, ML, DL workflowlarınızı sunucunuza deploy edip çalıştırabilmek projeleri epey hızlandırır. Kod ile uğraşmaktansa asıl probleme odaklanabilirsiniz.
  • Hazırladığınız workflowlar projenizi daha anlaşılır ve sürdürülebilir hale getirir.
  • Knime yeterli olmadığı durumda her zaman işinizin bir kısmını Python tarafına çekebilirsiniz ve bu iki aracı hibrit olarak kullanabilirsiniz.

Dezavantajlar:

  • Malesef yavaş çalışıyor. Mesela bu uygulamada sonucu döndürmesi 13 saniye sürdü ki aynı işi tamamen python ile yapmış olsaydık 1 saniyenin çok altında bir sürede sonucu döndürebilirdik. Bu yavaşlığın sebebi de her requestte workflowu tekrar yüklemesi gibi görünüyor. Bu konu üzerine düşüneceğim ve en yakın zamanda hızlandırılmış verisyonu hakkındaki yazımı paylaşacağım. Beklemede kalın.
  • Bir diğer dezavantajı ise en başta pahalı dediğim Knime Serverdansa bu şekilde kullanıldığı durumda sunucuyu ve ihtiyaç duyulan servisleri işletmek için tecrübe ve zaman gerekecek. Eğer bir işletme iseniz ve bu tip bir uygulamayı barındırıp sürdürebilecek teknik bir ekibiniz yok ise bu sizi zorlayabilir.

Bu yazımda Knime ile hazırlamış olduğunuz workflowlarınızı kendi sunucunuzda nasıl çalıştırabileceğinizi elimden geldiğince anlattım. Bu konu hakkında desteğe ihtiyaç duyarsanız aşağıdaki adresten benimle iletişime geçebilirsiniz.

Gökhan Gerdan
gokhang1327@gmail.com

--

--