Large Scale Training and Inference

Günümüz yapay zeka problemlerini çözmek için genellikle çok büyük veri kümeleri ile çok katmanlı derin öğrenme ağları eğitmeye çalışıyoruz. Bu süreç doğası gereği yüksek hesaplama gücüne sahip alt yapılara ihtiyaç duyar. Ancak bunu başardığımız noktada daha hassas, genelleme gücü daha yüksek ve karmaşık neden-sonuç ilişkileri kurabilmeyi başarabilen modeller elde ederiz.

Büyük ölçekli (data + model complexity) yapılan eğitimlerin (training) sonucunda elde ettiğimiz büyük modelleri, aynı anda çok sayıda kullanıcıya gerçek zamanlı ve hızlı bir şekilde çıkarım(inference) yapabilmeleri içinse de yine benzer yapılara (software + hardware) ihtiyaç duyacağımızı söyleyebiliriz.

Özellikle büyük dil modelleri üzerinde yaptığımız çalışmaları, yukarıda tanımını yaptığımız problemler sınıfına rahatlıkla dahil edebiliriz. Ancak bu tanım içerisine sayısız farklı problemi de dahil edebilmek mümkün.

Tam bu noktada bu tarz yapıları nasıl kuracağımızı, nasıl işletebileceğimizi ve hangi frameworkleri kullanmamız gerektiğini bilmemiz ve mimariyi bu şekilde kurgulamamız gerekiyor. Bu motivasyonlara hizmet edebilecek okunmasını ve incelenmesini önemli bulduğum bazı makaleler ve frameworkler var. Aşağıda bunların linklerini bırakıyorum. Bu tarz problemler ile ilgilenen arkadaşların incelemelerini tavsiye ederim.

Posted in Uncategorized | Tagged , , , , | Leave a comment

Yapay Zeka Uzmanları için Büyük Dil Modelleri Hakkında Makale Önerileri

Lisansüstü eğitim serüvenime (Yüksek Lisans + Doktora) başladığım 2017 yılından bugüne kadar doğal dil işleme konusunda bir çok makaleyi okuma fırsatım oldu. Hatta bunlardan bazılarını birden fazla kez tekrar tekrar ziyaret etme ihtiyacı hissettim.

Son iki senede büyük dil modellerinin domine ettiği ve yapay zeka dünyasındaki gelişmelerin ana aktörü olduğu bir dönemden geçiyoruz. Bunun doğal sonucu olarakta bu alanda yapılan yayınların sayısının hızla arttığını ve güncel her yayının farklı bir problemi çözerek daha umut verici uygulamaların ortaya çıkmasını sağladığını görüyoruz.

Hiç şüphesiz ki “Attention is All You Need” makalesi, bu makaleler arasında, şu an bulunduğumuz noktaya ulaşmamızın önünü açan ve kilometre taşı diye sayabileceğimiz bir makale seviyesinde. “Attention is All you Need” sonrasında çıkan ve “Transformers” fikrini temel alıp bu dünyanın bir çok problemini çözen sayısız makale yayınlandı ve bilimin olağan üstü bir momentum ile gelişmesini sağladı.

Bu alanda kendini geliştirmek isteyen ve çalışan hemen hemen her teknik insanın okumasının faydalı olacağını düşündüğüm bir dizi makale var. Bu post ile bu makale listesini sizlerle paylaşmak istiyorum.

Not: Ayrıca bu listeye ek yapmak isteyen herkesi yorumlara bekliyorum.

Posted in Uncategorized | Tagged , , , , , , , , , , , | Leave a comment

Bilgisayar Mühendisliği Doktora Yeterlilik Süreci Hakkında Deneyimlerim

Herkese yeniden merhaba,

Blog da son postumu attığım günün üzerine 894 gün geçmiş.

Kendi post istatistiklerime baktığımda bu aralığın oldukça uzun bir ara olduğunu söyleyebiliriz.

Bu kadar uzun süre ara vermemin arkasında bir çok neden olsa da bunlar arasında en etkili olan iki nedeni şöyle sıralayabiliriz;

  • 2022’nin hemen başında yaptığım iş değişikliği ve devamında çok yüksek bir tempoda çalışmamı gerektiren bir iş dönemi.
  • 2021yılının sonlarına doğru başladığım Bilgisayar Mühendisliği doktora programı ve bu programın iş hayatımdan arta kalan tüm zamanımı meşgul etmesi.

Arada geçen sürede yazacak o kadar teknik konu birikti ki, her yeni şey öğrendiğimde her yeni paradigma değişimlerinde hep içimden zaman ayırıp bir şeyler karalamak gelse de bunu yapacak yeterli zamanı çokta bulduğum söylenemez. Belki yazılı ile aktarım yöntemini değiştirmenin zamanı gelmiş olabilir. Kısa videolar çekip paylaşmak veya vlog tadında aktarımlar yapmanın daha pratik olduğunu düşündüğüm bir dönemdeyim ama aksiyona geçmek için üzerine ve konseptine bir miktar daha kafa yormak istiyorum.

Bundan sonraki süreçte zaman buldukça paylaşımlar yapmaya devam edeceğim noktasında kendime bazı sözler verdim 🙂 Henüz hangi yöntemle yapacağım noktasına karar vermesem de paylaşım düzenine geçmeyi çok istiyorum.

Arada geçen sürede hayatımla ilgili kısa bir recap yaptıktan sonra yazı başlığının konusu olan ve henüz bu süreçten taze çıktığım konuları anlatmayı istiyorum.

Bilgisayar Mühendisliği alanında doktora çalışması yapma fikri, yüksek lisans eğitiminde uğraştığım akademik konuların ilgili fazlası ile çekmesi ile başlamıştı. Hatta yüksek lisans maceramı kısa özetleyen bir post da atmıştım. Dolayısıyla öncelikli motivasyonum uzmanlaşmaya çalıştığım yapay zeka alanında daha derin ve akademik bilgiye sahip olmak ve akademik çalışmalar yapmaktı. Bu kararlılıkla! Yeditepe Üniversitesi – Bilgisayar Mühendisliği bölümü Doktora programına kabul aldım ve programa 2021 Ekim ayı itibari ile başladım.

Güçlü motivasyonlar ile başladığım doktora serüvenim zaman içerisinde karşılaştığım zorluklar ve akademinin benden beklentilerin realize olması gerekliliklerinden dolayı değişkenlik gösterse de kendimle gurur duyabileceğim bir kararlılıkla ve doktora dışında kalan dünya’mdaki tüm zorluklara rağmen önemli bir checkpoint e ulaştı.

Şimdi ara toplam zamanı…

Doktora programları bilindiği üzere temelde üç aşamadan oluşur.

  • Ders Aşaması: Bu ilk aşamadır ve sizden kayıtlı olduğunuz bölümün lisansüstü seviyesinde açtığın derslerden 7 (+1 Doktora Semineri = 8 ) tanesini belirli bir program dahilinde alıp en geç 5 dönem içerisinde geçmeniz beklenir.

Ben mevcutta yoğun bir iş temposu ile de çalıştığım için ders aşaması bölümünü 4 dönem de tamamlayarak bu ilk checkpoint noktasını geçmiştim. Bu checkpoint kısmını bir cümle ile özetlesem de süreç içerisinde sayısız makale incelemesi, vize, final, proje, yayın vb zorlukların olduğu unutmamalı. İş hayatıyla beraber götürmek için sağlam motivasyon, bol kahve ve sayısız uykusuz gece gerekiyor (Yatırım tavsiyesi değildir 🙂 )

Peki bu süreç içerisinde hangi dersleri aldım merak edenler için onları aşağıya bırakıyorum.

  1. Image Processing And Pattern Recognition
  2. Advanced Deep Learning
  3. Artificial Intelligence
  4. Statistical Machine Learning
  5. Special Topics In Data Science
  6. Advanced Topics In Systems Architecture
  7. Advanced Topics In Artificial Intelligence
  8. Phd Seminar
  • Doktora Yeterlilik Aşaması (Namı değer Qual): Bu kısım genel kanı itibari ile doktora programlarını bıraktıran, bu aşamada öğrencilerin ayrılmasına en çok neden olan bölüm gibi düşünülebilir.

Bu aşamada Dr. unvanı alma noktasında yeterli misiniz? Çalıştığınız alanda akademik background unuz yeterli mi? sorularına bazı sınavlar uygulanarak karar verilmeye çalışılıyor.

Her üniversite sınav içi prosedürleri temel olarak benzese de uygulama noktasında farklılıklar gösteren doktora yeterlilik sınav süreçlerine sahipler ancak hemen hemen her doktora programında doktora yeterlilik sınavının iki aşamadan oluştuğunu söyleyebiliriz.

Yazılı Sınav: Yukarıda da belirttiğim üzere bu bölümün uygulama aşaması her üniversite ve programda değişkenlik gösterebilir. Ancak ben tabii olduğum düzeni ve başımdan geçenleri çok kısa aktaracağım.

Yeditepe Üniversitesi – Bilgisayar Mühendisliği doktora programının yeterlilik aşamasının yazılı sınavında size Bilgisayar Mühendisliği lisans derslerinden sorumlu olduğunuz, her biri için 2 saat süre verilen toplamda 3 sınava girmeniz bekleniyor. Her sınav aslında bağımsız bölümü içeriyor ve kendi içinde farklı derslerden soruları barındırıyor. Yazılı sınav aşamasında girdiğim 3 sınavın başlıkları ve içerisinde sorumlu olduğum derslerin listesi aşağıdaki gibi.

Bilgisayar Bilimleri Temelleri ve Kuramı (Foundation /Theory)

Algorithms

Data Structures

Automata Theory

Bilgisayar Sistemi Yazılımı (System Software)

Programming Languages

System Programming

Operating Systems

Software Engineering

Database Management System

File Organization

Object Oriented Design and Programming

Bilgisayar Sistemi Donanımı (System Hardware /Architecture)

Logic Circuits

Digital Electronic

Computer Organization

      Evet listelemesi kolay olsada toplamda 13 tane lisans dersinde sorumlu olduğunuz adeta bilgisayar bilimleri ile her konuda bilginizin sınandığı bir sınav. Bu sınavın hazırlık aşamasını en çok üniversite sınavı sürecine benzettim hazırlanırken. Elinizde yaklaşık 15 bin sayfa context var 13 derse ait. Nereden ve hangi dersten soru çıkıp çıkmayacağı noktasında çok tahmininizin olmadığı bir sınava hazırlık süreci.

      Doktara yeterlilik sınavını geçmek için size toplamda 2 kez giriş hakkı veriliyor. İki dönem şansınızı deneme durumunuz var. İki kez başarısız olduğunuz durumda maalesef program ile ilişkiniz kesiliyor ve okuldan atılmayla süreç sonuçlanıyor. Dolayısıyla atılma risklerinden de ötürü stres katsayısı bir kaç kat daha yukarı çıkıyor.

      Yazılı sınavı geçmek hiç kolay değil çünkü geçme şartları oldukça zoru idi bizim programda. Yazılı kısımdan başarılı sayılmak için her sınav bölümünden en az 50, 3 sınavın ortalamasında da 70 puanı tutturmanız gerekiyor. Geçme prosedürü ide yine üzerinizdeki stresi bir tık daha yukarı taşıyor.

      Benim yazılı sınav sürecimi daha da zorlaştıran en büyük etkenin lisans mezuniyetimin yaklaşık 13 sene önce olmuş olması idi. Bu yüzden lisans da gördüğüm ve yazılı sınavda sorumlu olduğum hiç bir konuyu hatırlamıyordum. Bu nedenle tüm derslere en baştan adeta 0 dan başlayarak çalıştığımı söyleyebilirim. Bu hiç kolay olmadı çünkü 4 ay boyunca, hafta içi iş temposu ile beraber götürmem gereken minimum günlük 2-3 saatlik çalışmalar, haftasonları neredeyse tüm gün çalıştığım yoğun, zorlu ve zaman zaman umutsuzluğa düştüğüm bir süreçti. Ancak bu zorlu sürecin sonucunda neredeyse tüm bilgisayar mühendisliği lisans müfredatını 4 ayda baştan çalışıp yeniden hatırlayarak başarılı bir şekilde ilk hakkımda geçtim.

      Sözlü Sınav: Doktora yeterlilik sürecinin ikinci aşaması olan sözlü aşamasına girebilmeniz için evvela yazılı sınavı geçmeniz gerekmekte. Sözlü sınavda 5 kişilik jüri karşısında lisansüstü eğitiminiz (yüksek lisans + doktora süreci) boyunca çalıştığınız konular ve akademik kimliğiniz ile ilgili sınanacağınız, tüm hücrelerinize kadar terletildiğiniz zorlu bir sınava giriyorsunuz.

      Yazılı sınavı geçtiğimi öğrendiğim gün 1 hafta içinde sözlü sınava girmem gerektiği tebliğ edildi ve doktora yeterlilik sözlü sınavımın hangi konu konseptinde yapılacağı 3 tane akademik yayın ile birlikte bana iletildi. O gün itibari ile 5-6 takvim gününde bana iletilen akademik yayınları çalışıp üzerine bir sunum hazırlamam ve o güne kadar lisansüstü çalışmalarımda öğrendiğim tüm konuları hızlıca bir tekrar etmem gerekiyordu. Yine uykusuz geceler ama son 6 🙂 7. gün artık o stresin olmayacağını bilme motivasyonu ile bir kez daha küreklere yüklenmem gerekiyordu ve nitekimde öyle oldu. Soluksuz çalıştığım bir 5-6 günün ardından üniversitemizden 3 akademisyenin, üniversite dışından da 2 akademisyenin katıldığı jüri karşısına çıkıp 1.5 saat soğuk terler dökerek, sorulan tüm bilimsel soruları cevaplayarak mutlu sona ulaştığımı söyleyebilirim. Artık Phd Candidate’im….

      • Tez Aşaması: Doktora sürecinin son adımı, tez aşaması. Bu aşamaya geçebilmek için ders aşamasını ve yeterlilik aşamasını geçmeniz ve Phd Candidate olmanız gerekiyor. Bu şartlar sağlandığı takdirde tez aşamasına başlayıp akademik araştırma konunuzu çalışmaya başlıyorsunuz. Konunuza göre ve literatüre sunmayı hedeflediğiniz katkıya göre bir kaç dönem veya yıl sürecek tamamı ile akademik araştırma yaptığınız ve sınav olmayan bir süreç. Bu sürecin sonunda da Dr. ünvanı alarak programdan mezun oluyorsunuz.

      Ben tez aşamasına başladım ve araştırma konum üzerinde çalışmaya devam ediyorum. Tez aşamam ne kadar sürecek şimdiden ön görmek zor olsa da bir gün biteceğine dair inancım tam.

      Bu yazıya, doktora sürecim tam bittiğinde yeni bir yazı yazarak referans vereceğim günü hayal edebiliyorum. Umarım o günler çok uzak değildir.

      ps: Bu yazıyı yazmamdaki en temel motivasyon, yaşadığım deneyimi paylaşmak ve kendime not yazmaktı ileride okuyup hatırlamak için. Bir de hazırlık aşamam da bu tarz süreçlerden geçen kişilerin hiç paylaşımlarını görmemiştim detaylı olarak. Bu bağlamda, olur da hazırlanan biri bu yazıyı okursa kendini yalnız hissetmesin, yaşadığı dalgalanmaya pozitif katkısı olsun diye kaleme almak istedim.

      Zaman ayırıp, okuduğunuz için çok teşekkürler.

      Posted in Uncategorized | Tagged , , , , , , , , , , , | Leave a comment

      Simple Transformers Kütüphanesi ile Geliştirilen NLP Modelinin CPU ve GPU Üzerindeki Training Performansları

      Herkese Merhaba,

      Benchmarking Nedir? Niçin Uygulanır? - Markalaşma-Dijital Pazarlama-Web  Tasarım içerikleri

      Bu yazı da doğal dil işleme alanında yoğun olarak kullanılan Simple Transformers kütüphanesi ile kurguladığım bir modelin farklı CPU ve GPU’lar üzerindeki eğitim performanslarını inceleyeceğim. Umarım farkındalık anlamında faydalı bir çalışma olur.

      Teknik detaylara geçmeden önce Simple Transformers hakkında kısa bir bilgilendirme yapmak istiyorum. Simple Transformers, Transformer tabanlı büyük yapay sinir ağları (BERT, GPT-2 vb) ile oluşturulmuş modelleri çok daha rahat ve kolay kullanabilmemizi sağlayan bir doğal dil işleme kütüphanesi. Transformerlar ise 2017’de NLP alanında çalışan bir grup bilgisayar bilimcisinin ortaya attığı ve günümüzde dil problemlerinin çözümlerinde en sık kullanılan ve en modern yöntemlerin başında gelen derin öğrenme tabanlı yapay zeka modellerdir (https://arxiv.org/pdf/1706.03762.pdf).

      Simple Transformer’dan bahsetmişken Huggingface Transformer kütüphanesinden bahsetmemek olmaz çünkü Simple Transformer kütüphanesi Huggingface alt yapısını kullanan ve huggingface’in geliştirmiş olduğu önceden eğitilmiş modellerden faydalanan bir alt yapı. Huggingface Transformers alt yapısı NLP alanındaki sınıflandırma, bilgi çıkarımı, soru cevaplama, metin özetleme, makine çevirisi ve text üretimi gibi problemleri çözmek için 100 den farklı dil desteği ile binlerce hazır eğitilmiş modelleri yapay zeka geliştiricilerine sağlamakta. Temel amaçları ise NLP alanında geliştirilen state-of-the-art modelleri her seviyeden kullanıcıya kolay bir şekilde kullandırmak. Sonuç olarak Simple Transformer kütüphanesini kullanarak modern NLP yaklaşımlarını aşağıdaki tasklar üzerinde rahatlıkla kolay bir şekilde uygulayabilirsiniz.

      Text Classification
      Token Classification
      Question Answering
      Language Modeling
      Language Generation
      Multi-Modal Classification
      Conversational AI
      Text Representation Generation

      Şimdi konumuza geri dönebiliriz. Ben Simple Transformer kütüphanesini kullanarak metin sınıflandırma modeli oluşturdum ve daha sonra bu modeli farklı donanım alt yapıları test ettim. Modeli oluştururken scikit-learn’ün fetch_20newsgroups isimli text veri setinden faydalandım. Bu veri setinde 20 farklı sınıfa ait 18K adet metin bulunuyor. Ancak ben sadece binary classification problemi çözmek istediğim için bu sınıflardan sadece iki (Elektronik Grafik sistemleri ve uzay konulu metinler ) tanesini kullandım. Sınıflandırma modeli olarakta BERT’in daha küçük hali olan distillbert‘i kullandım. Ancak burada yapacağınız çalışmaya göre daha büyük networkler seçilip kullanılabilir. HuggingFace’de binlerce model kullanıma hazır durumda. Eğitim aşamasında ise 10 epoch’luk bir strateji izleyeceğim ve logları sizlerle paylaşacağım.

      import pandas as pd 
      import numpy as np
      import torch
      import os
      import warnings
      warnings.filterwarnings("ignore")
      from sklearn.datasets import fetch_20newsgroups
      from simpletransformers.classification import ClassificationModel, ClassificationArgs
      
      use_cuda = torch.cuda.is_available()
      categories = ['comp.graphics','sci.space']
      twenty_train = fetch_20newsgroups(categories=categories)
      model_args = ClassificationArgs(num_train_epochs=10, overwrite_output_dir=True)
      model = ClassificationModel("distilbert", "distilbert-base-cased", args=model_args, use_cuda=use_cuda)
      
      df = pd.DataFrame(twenty_train.data, columns=["text"])
      df['labels'] = pd.Series(data=twenty_train.target)
      
      output_dir = f"{os.path.expanduser('~')}/model_outputs"
      model.train_model(df, output_dir=output_dir)

      Evet modelimizi oluşturacak kodumuzu geliştirdik şimdi farklı donanım alt yapıları ile test edelim.

      CPU TESTLERİ

      Yukarıda geliştirmiş olduğum modeli iki farklı işlemci tip ile deneyeceğim. Bunlardan biri Intel’in Skylake Mimarili işlemcisi (Intel Xeon 8167M 2.0 GHz) diğeri ise AMD’nin EPYC Serisi işlemcisi (AMD EPYC 7742 2.25 GHz).

      Sistem1: Intel İşlemcili Sistem (Virtual Machine):

      24 X Intel Xeon 8167M 2.0 GHz

      320 GB RAM

      50 GB Block Storage

      Sistem2: AMD İşlemcili Sistem(Virtual Machine):

      24 X AMD EPYC 7742 2.25 GHz

      320 GB RAM

      50 GB Block Storage

      Şimdi iki farklı sistemde yapmış olduğum training işlemlerinin ne kadar sürdüğüne bakalım.

      Training TestleriTest1(Dk)Test2(Dk)Test3(Dk)Ortalama(Dk)
      Sistem1 (Intel)15:5516:0616:1916:07
      Sistem2 (AMD)31:0630:2530:1230:34
      Intel ve AMD Sanal Makineler ile Yapılan Test Sonuçları

      Evet görüldüğü üzere işlemci sayıları ve memory büyüklükleri eşit olan iki sistem arasındaki Simple Transformer model testlerinde Intel işlemcili alt yapı daha hızlı training işlemlerini bitirdi. Eğitim sonrasında yapılan tüm model validasyonlarında aynı sonuçlar alındı. Aşağıda iki örnek bulabilirsiniz.

      predictions, raw_outputs = model.predict(["you can play all game using this graphical card unit"])
      predictions[0]
      predictions, raw_outputs = model.predict(["planets are getting closer to the earth"])
      predictions[0]
      Sistem1 (Intel): Model Test
      Sistem2 (AMD): Model Test

      GPU Testleri

      Bu test ile 2 farklı grafik kart üzerinde aynı modeli çalıştırıp training sürelerine bakacağız.

      Sistem1: 1 X NVIDIA P100 GPU

      Sistem2: 1 X Tesla K80 GPU

      GPU TestiTest
      NVIDIA P1002:34
      Tesla K8010:17
      NVIDIA P100 vs Tesla K80

      Evet görüldüğü üzere geliştirmiş olduğumuz Transformer modeli GPU üzerinde CPU’lara nazaran çok ama çok daha hızlı sonuçlandı. GPU’ların arasında ise NVIDIA P100, Tesla K80’e göre oldukça hızlı bir sonuç üretti.

      NVIDIA P100’ün Eğitim Aşamasındaki Utilization’ı

      Evet bu çalışmada modern bir NLP modelinin bazı CPU ve GPU kartlar üzerindeki training performanslarını incelemiş olduk. Ancak şu unutulmamalıdır ki, bu testler sistemlerin birbirlerine karşı üstünlüklerini tam anlamı ile açıklamak için yeterli değildir. Sistemler/Donanımlar hakkında genel yorumlar yapabilmek için sistemlerin oluşturulma maliyetlerini de mutlaka göz önünde tutmak hayati derecede kritiktir. Bu çalışmada sistemlerin donanım maliyetleri hakkında bir yorum yapılmamıştır. Bu donanımların fiyatları hakkında internet üzerinden basit aramalar yapılarak fikir sahibi olunabilir. Daha kapsamlı ve farklı türden iş yükleri ile sistemler test edilerek genel yargılara ulaşmak sağlıklı olacaktır. Bu nedenle yapılan bu çalışmayı baz kabul edip hareket etmek verilecek kararları olumsuz yönde etkileyebilir.

      Posted in Uncategorized | Leave a comment

      Tezli Yüksek Lisans Eğitimi Hakkındaki Değerlendirmelerim ve Özyeğin Üniversitesi Veri Bilimi Tezli Yüksek Lisans Programı Hakkındaki Deneyimlerim

      Herkese Merhaba,

      Bu yazı ile, uzunca bir süredir aklımda olan ve yazmayı planladığım bir konu üzerindeki fikirlerimi paylaşmak istiyorum. Aslında yazı içeriğini “Yüksek Lisans Yapmak Gerekli midir?” gibi bir eksende kaleme almak istesem de internet üzerinde onlarca nitelikli yorumun olduğunu gördükten sonra bundan vazgeçtim. Yapılan değerlendirmelerin büyük bir çoğunluğuna katıldığımı söylemek isterim.

      Yüksek lisans programlarını, tasarımlarını göz önünde bulundurduğumuzda iki farklı şekilde incelemek mümkün. => Tezli veya Tezsiz. Tezli programların yükümlüküleri ile tezsiz programların yükümlülükleri birbirinden farklılıklar göstermekte ve gün sonunda da elde edeceğiniz sonuçların etkileri de birbirinden farklı olmakta. Örneğin tezsiz yüksek lisans sonucunda elde ettiğiniz diploma ile bir doktora programına başvuru yapamazken (lisans sonrası bütünleşik doktora programları hariç), tezli yüksek lisans diploması ile bir doktora programına başvurabilmektesiniz. Bu sonuçtan da çıkarabileceğimiz üzere tezli programların öğrenci üzerindeki çıktılarından en önemlisi de öğrencinin güncel teknikler ve yaklaşımlar ile bilimsel bir araştırma yapabilmesini öğreterek bilime pozitif bir katkı sunması hususunda onu yetiştirmektir. Doktora başvurularında tezli yüksek lisans diploması aranmasının temel mantığının da bu olduğunu söylemek bu bağlamda pek de yanlış olmayacaktır.

      Tezli ve tezsiz programlar arasındaki temel farkın ne olduğuna değindikten sonra hayatınıza getireceği yükü de mutlaka değerlendirmek gerekiyor. Özellikle profesyonel iş hayatına devam eden kişiler için tezli programlar akademinin sizden beklentilerini karşılayabilmeniz adına oldukça zorlayıcı olabiliyor. Dolayısıyla yüksek lisans yapma kararı almadan önce mutlaka bu ayrıntıları ve başvuracağınız program için mezuniyet koşullarını gözden geçirmekte fayda var.

      Çok basit anlamda temel kavramlardan bahsettikten sonra şimdi benim yüksek lisans sürecinde yaşadığım deneyime geçebiliriz.

      Motivasyon

      Eğer profesyonel bir çalışansanız ve bir yüksek lisans programına kayıt olup akademik olarak çalışma da yapmak istiyorsanız bunun için bence ciddi motivasyonunuzun olması gerekiyor. Çünkü tezli yüksek lisans “aile baskısı”, “çevre baskısı”, “sürü psikolojisi” vb sebepler ile asla altına girilecek bir yük değil. Motivasyonunuz o kadar baskın gelmeli ki, hem ders aşamasında yaptığınız uzun çalışmalarda hem de tez aşamasında yaptığınız yoğun ve uzun soluklu araştırmalarda yılmayın. Çünkü yoğun iş temposu üzerine bu denli kapsamlı programlara kayıt olmak için yeterince motive olmadığınız da sonuç programdan ayrılmaya kadar gidebiliyor. Çoğu öğrenci tezli programları bu nedenlerden dolayı bırakıyor. Dolayısıyla iş hayatı ile beraber bu yükü çekebilmek için mutlaka güçlü motivatörlere ihtiyaç fazlası ile var.

      Peki lisanstan mezun olduktan 7 yıl sonra beni tekrardan öğrenci yapacak ve yoğun iş tempomun üzerine müthiş bir yük ekleyecek olan tezli yüksek lisans yapma kararımda ki temel motivasyon neydi? Yüksek lisans eğitimime başlamadan önce toplamda 7-8 yıldır sektörde bilgisayar mühendisi olarak çalışan biriydim. Türkiye’nin önde gelen IT organizasyonlarında veri mühendisliği, iş zekası, büyük veri çözümleri, yapay öğrenme ve veri bilimi konularında projeler geliştiren bir yazılım mühendisiydim. Veri ambarı sistemlerinde çalışmaya başladığım kariyerim, veri ekosisteminde yapılan teknolojik gelişmeler ile önce büyük veri sistemlerinde belirli bir uzmanlık edinmeme daha sonra da makine öğrenimi temelli uygulamalar geliştirmeye kadar uzandı. Makine öğrenimi ve veri bilimi projelerini geliştirmeye başladığımda daha çok online eğitimler ile kendimi destekleyerek belirli bir aşamaya gelmiştim ancak bulunduğum noktada sorumlu olduğum ürün ve servisleri daha ileriye götürmek için edindiğim bilgi ve yetkinlik asla bana yeterli gelmiyordu. Çünkü dokunduğunuz modellerin hangi veri setlerinde nasıl tepkiler vereceğini anlayabilmek online uygulamalı eğitimlerin çok ötesinde bir yetkinlik gerektiriyordu. Tam da bu noktadan hareketle ve yaklaşık 6 ay kadar da düşündükten sonra tezli bir yüksek lisans programının bana bu konuda katacaklarının, beni istediğim noktaya ulaştırmada oldukça önemli bir şey olacağına ikna oldum ve kararımı vermiş oldum. Buradaki motivasyonum oldukça iyidi çünkü öğreneceğim şeyler, yapacağım araştırmalar günlük hayatta iş yerinde geliştirdiğim projelere de katkı sunacak hatta onları daha da ileri götürmeme olanak sağlayacaktı. Bu motivasyon beni, tezli yüksek lisans eğitiminin hayatıma getireceği yükü göğüsleyebileceğim inancının oluşmasını sağladı.

      Okul ve Bölüm Seçimi

      Yüksek lisans yapma kararını aldıktan sonra okul seçim fazı benim için çok sancılı olmadı çünkü o dönem çalıştığım şirketin Özyeğin Üniversitesi ile bir anlaşması vardı. Bu anlaşma kapsamında çalıştığım kurumun sponsorluğunda ve zaman konusundaki destekleri ile bu üniversite de tezli yüksek lisansı daha optimum şartlarda şirket desteği ile gerçekleştirebilecektim. Okulu biraz araştırdıktan sonra okul seçiminin de çok doğru bir karar olduğuna ikna oldum ve 2018 yılında Özyeğin Üniversitesi – Bilgisayar Mühendisliği Tezli Yüksek Lisans programına kayıt oldum.

      Ders Aşaması

      Bölüme kayıt olmadan önce açılan dersleri ve içerikleri de uzunca bir süre incelemiştim. Çünkü klasik bir bilgisayar mühendisliği master’ı yapmak istemiyordum. Temeldeki başlama motivasyonum olan alanları daha net anlayabileceğim ve derinlemesine bilgiler edinebileceğim dersler almak istiyordum. Özyeğin Üniversitesinin esnek müfredatı da bu amaca tam olarak hizmet ediyordu. Dolayısıyla Fen Bilimleri Enstitüsünde, bölüm farketmeksizin açılan ve ilgimi çeken dersleri alabilmemi sağlayan bir alt yapı sunulmuştu. Ben de ağırlıklı olarak Yapay Zeka ve Veri Bilimi konusunda ilerlemek istediğim için 7 seçimlilik dersinin tamamını bu konulardan seçerek aldım. Şunu net bir şekilde söyleyebilirim ki Özyeğin Üniversitesinin akademik eğitimi ve araştırma vizyonu oldukça iyi. Akademik kadrosunun neredeyse tamamı ya doktora için yada doktora sonrasında araştırma yapmak için yurt dışında önemli üniversitelerde bulunmuş kişilerden oluşuyor. Bu durum da haliyle derslerin, projelerin, ödevlerin, sınavların ve araştırmaların oldukça zorlu geçmesine neden oluyor. Bu da ister istemez akademik alt yapınızın gelişmesine neden oluyor. Birçok dersin dönem sonunda, bir makaleye dönüşecek seviyede akademik çıktılar üretiliyor. Bu bağlamda aldığım akademik eğitimden inanılmaz memnun kaldım ve öğrendiğim bir çok şeyi iş hayatında da uygulama fırsatı buldum.

      Ders aşamasında aldığım derslerin listesi de aşağıdaki gibidir.

      – Mathematical & Statistical Foundations of Machine Learning
      – Introduction to Artificial Neural Networks and Machine Learning
      – Introduction to Deep Learning
      – Deep Natural Language Processing
      – Data Mining
      – Data Science
      – Customer Analytics

      Bölüm Değişikliği

      Özyeğin Üniversitesi Fen Bilimleri Enstitüsü 2019 yılında Veri Bilimi Tezli Yüksek Lisans programını açtı. Ben de bölümün müfredatını incelerken zorunlu ders havuzundaki derslerin tamamını aldığımı ve seçmeli derslerin de çoğunu tamamlamış olduğumu gördüm. Ayrıca Bilgisayar Mühendisliği yüksek lisans derecesinin de uzmanlaştığınız alanı sözel olarak yeterince anlatamadığını düşünerek akademik danışmanım ile de konuyu müzakere ederek bölüm değişikliği kararı aldım ve kayıdımı Veri Bilimi Tezli Yüksek Lisans programına aldırdım. Program değişikliği ile beraber almış olduğum tüm dersler sayılarak kayıpsız bir şekilde geçişim tamamlandı.

      Veri Bilimi programı ile ilgili detaylı bilgiye aşağıdaki linki tıklayarak ulaşabilirsiniz.

      https://www.ozyegin.edu.tr/tr/veri-bilimi-yuksek-lisans-programi

      Özyeğin Üniversitesi Veri Bilimi yüksek lisans programı, hem oluşturulan müfredat ile hem de ders aldığınız akademisyenlerin kalitesi ile cidden çok iyi hazırlanmış. Akademik bilgi seviyenizi çok iyi noktalara getirme fırsatını yakalamanızın yanında modern bilimsel araştırma tekniklerini de çok iyi derece de öğrenebileceğiniz akademik bir program. Özellikle benimle aynı motivasyona sahip bir çok profesyonele fazlaca faydasının olacağını düşünüyorum.

      Tez Aşaması

      Kağıt üzerinde yüksek lisans mezuniyet yükümlülüklerini incelediğinizde “Yüksek Lisans Tez Çalışması” tek bir satır olarak görünse de, tez bence bir yüksek lisans eğitiminin en az %50’si. Tabi ki bu benim deneyimlerim ile ilgili bi bir öngörü, mutlaka daha rahat bu süreci yönetenler ve götürenler oluyordur ancak çok zor olduğunu ve uzun bir maraton olduğunu söylemek gerekir diye düşünüyorum.

      Tez aşamasını 3 temel adımla projelendirmek mümkün.

      -Tez Konusunun Belirlenmesi

      Tez konusu bir yüksek lisans öğrencisinin daha bölüme kayıt olduğu anda düşünmesi gereken en önemli konulardan bir tanesi. Bu konunun belirlenmediği her günü, olası mezuniyet tarihinizin sonuna rahatlıkla ekleyebilirsiniz. Dolayısıyla çok önemli bir konu. Genel öğrenci davranışı “Ders kısmını bir halledeyim. Tez’e sonra bakarız.” şeklinde olsa da bu davranışın okulu uzatmaktan başka bir şeye yaramadığı açıktır. Ancak öğrencilerin büyük bir bölümünün tez çalışmasını hangi konu üzerinde yapacaklarını belirleyebilmeleri için de belirli sayıda ders almaları ve akademisyen tanımaları gerekliliği de açık konulardan bir tanesidir. Çünkü tez danışmanı belirleyebilmek için hocaları tanımak ve onların çalışma alanlarını anlamak gerekiyor. Bunun için ise en azından bir kaç tane ders alıp bu deneyime ulaşmak mümkün olacaktır. Burada sağlıklı bir karar verebilmek için kendinize 1 veya maksimum 2 yarıyıl süre tanımak, hem çalışılan konuyu belirlemede hem de çalışılacak akademisyeni bulmada yardımcı olacaktır.

      Benim burada yaşadığım kendi deneyimim de şu şekilde oldu. İkinci dönemimin sonunda tez hocamı ve tez konumu belirlemiştim ve yaklaşık olarak iki dönem bu konu üzerinde çalışmıştım. Ancak bir iş değişikliği yapmam nedeni ile çalıştığım tez konusunu değiştirmek zorunda kalmıştım. Çünkü çalıştığım tez konusu çalıştığım kurumunun bir ar-ge projesi olacaktı. Doğal olarak tezi çalışırken konu ile ilgili her türlü geliştirmeyi kurum bünyesindeki makineler ve veri ile gerçekleştirmek zorundaydım. Dolayısıyla iş değişikliği ile beraber bu tezi devam ettirme şansım ortadan kalktı ve tekrardan bir tez konusu belirleme sürecine girmiş oldum. Bu gerçekten çok zor ve yıpratıcı bir süreç oluyor. Tez konusu belirlerken bir sürü makale okumanız gerekiyor. Literatüre fazlası ile hakim olmanız gerekiyor ki çalışacağınız alanda pozitif bir katkı sunabilin. İş değişikliğimi takiben bir kaç ay içerisinde tez konumu yeniden bularak tekrardan çalışmalara hızla başladım. Ancak bu bana 2 döneme mal olmuştu.

      -Tez ile ilgili teorik çözümün ortaya koyulması

      Tez konusu belirledikten sonra yapılması gereken maddelerden biri de yapacağınız tez çalışmasının teorik olarak detaylandırılması. Yani tez olarak ortaya koyacağınız çalışmayı yaptığınız araştırmalar ile beraber neye dönüşeceğini, hangi yöntem ve metodları uygulayacağınızı bunun sonunda ne gibi beklentilerinizin olduğunu raporlamak durumundasınız. Bu yazılacak rapor tezinizi geliştirirken elbette değişebilir, güncellenebilir, eklemeler, çıkarmalar yapılabilir ancak ana hatları ile tezinizin teorik ve pratik çerçevesini çizer nitelikte olmalıdır. Ben bu fazı 1 aylık bir çalışma ile geçmiştim. Çünkü konu belirlerken yaptığınız araştırmalar bu adım için çok büyük bir girdi oluyor. Dolayısıyla konu belirlerken yaptığınız çalışma ne kadar detaylı ise bu fazı geçme süreniz de o kadar kısalabilir.

      -Tez çalışmasının üretilmesi ve tez raporunun yazılması

      Bu aşamada artık çerçevesini çizdiğiniz çalışmayı danışmanınızın liderliğinde uygulamaya başlıyorsunuz. Uzunca bir süre ortaya koyduğunuz düşünceyi, fikri veya yöntemi farklı parametreler ile gerçekliyor sonuçları not ediyor ve yorumluyorsunuz. Bu noktada danışmanınızın yönlendirmeleri ve yorumları çok kıymetli oluyor. Öyle ki aylarca çalışıp bir sonuca ulaşmayacak yollardan sizleri deneyimleri ve bilgileri ile çıkartıyorlar. Dolayısıyla tez danışmanı ile kurulacak ilişki ve haftalık, aylık progress toplantıları çok ama çok önemli. Gün sonunda tezinizin amacına ulaşıp ulaşmadığına ve akademik olarak yeterli olup olmadığına karar verecek ve sizi jüri karşısına çıkarak kişi danışmanınız. Dolayısıyla geliştirme süreçlerinde olsun tez ile ilgili ikilemde kaldığınız noktalarda olsun danışmanınız ile sürekle irtibatta kalmanız çok önemli. Tez çalışmasının yapılması kadar raporlanması da oldukça önemli bir durum. Çünkü yaptığınız çalışmayı YÖK’ün belirlediği standart bir formatta raporlamanız gerekiyor. Unutulmamalıdır ki yaptığınız tezin en somut çıktısı yazdığınız raporun ta kendisidir. Dolayısıyla olabildiğince standardize, açık, anlaşılır ve iyi bir yazım dili ile yazılmış olması gerekiyor. Yaptığınız çalışmanın uzunluğuna ve kapsamına göre bu raporu yazmakta oldukça meşakkatli bir süreç. Burada benim tavsiyem tezi geliştirme ve sonuçları üretmeye başlandığı anda paralel olarakta bu dökümanı yazmaya başlamak olduğu yönünde. Genel öğrenci davranışı bu işi en sona bırakma yönünde olsa da bu yapılmaması gereken bir davranış. Gün sonunda raporlanmayı bekleyen dev gibi bir içerikle karşı karşıya kalıp aylarca bununla uğraşabilirsiniz. (Bu aşama benim toplam 6-7 aylık bir süremi aldı.)

      Diğer Yükümlülükler

      Yüksek lisansı yaptığınız üniversiteye göre mezuniyet ile ilgili yükümlülükleriniz değişkenlik gösterebilir. Tezli programlarda genellikle 7 Ders + 1 Seminer + Tez Çalışması mezuniyet için yeterli iken, bazı okullarda tezinizden bir yayın veya konferans kabulü elde etmekte yükümlülüklerden biri olabiliyor. Özyeğin Üniversitesi Fen bilimleri Enstitüsüne bağlı programlarda yayın veya konferans kabulü şartı bulunuyor. Dolayısıyla tezinizi yazıp bitirmeniz mezuniyet için yetmiyor. SCI veya SCIE indeksinde bulunan dergilerde tezinizi makale olarak yayınlamak veya bölümünüzün seçtiği uluslararası konferanslardan tezinizi anlatmak için kabul almak durumundasınız mezuniyet için. Bu şartı sağlamadan tez savunmasına giremediğinizi açık yüreklilikle söylemek isterim. Bu yükümlülük bir çırpıda yazılsa da oldukça uzun ve meşakkatli bir süreç. Bu aşamada ben SCIE indeksli bir dergide yayın yapma yolunu seçerek, yayın yapılacak derginin belirlenmesinden makalenin submit edilmesine kadar geçen sürede yaklaşık olarak üç ay harcadığımı rahatlıkla söyleyebilirim. Bu tarz yükümlülükler tezli yüksek lisans programları için çok zorlayıcı gözüksede birkaç yılınızı verip yaptığınız çalışmaların kalitesini uluslararası standartlara çıkartarak akademik olarak bilinilirliğinizin artmasına katkı sunuyor. Dolayısıyla yazdığınız tezden uluslararası yayın çıkması her şeyden önce bireysel tatmininiz için oldukça önemli. Doktoraya devam edecekseniz ise de harika bir başlangıç olmuş oluyor.

      Tez Savunması

      Tez savunması mezuniyet öncesinde yapmanız gereken en önemli şey çünkü tezinizi belirlenen jüri önünde başarılı bir şekilde sunamazsanız maalesef bir dönem uzatma daha almanız olası olacaktır. Dolayısıyla tezi geliştirirken ve o süreç içerisinde yapılacak her hamlede tezinizi savunacağınız o 30 dakika hayal edilmelidir. Üniversitenizin dışından da üyelerin bulunduğu bu savunma jürisinde, anlatacağınız her şeye hakim olmanız ve teorik olarak yaptığınız çalışmayı çok iyi anlatabilmeniz sizden beklenen birinci şeydir. İkinci önemli konu da anlatımınız bittikten sonra soru-cevap kısmında jüri üyelerinin sorduğu sorulara doyurucu cevaplar vermeniz olacaktır.

      Buraya kadar tezli yüksek lisans hakkındaki genel deneyimlerimi, yorumlarımı ve mezun olduğum bölüm hakkında detaylı bilgileri vermeye çalıştım. Ancak unutulmamalıdır ki seçtiğiniz okul, seçtiğiniz bölüm, çalıştığınız akademisyenler toplamda yaşayacağınız deneyimi değiştireceklerdir ama önemli olan konu başladığınız motivasyonla sürece devam edebiliyor olmanızdır. Yüksek lisans uzun bir maraton koşusu, dolayısıyla kendinden emin ve sürekliliği olan bir performansla yola devam edip bitiş çizgisini görmek mümkün. Bundan dolayı bu maratona başlamadan, somut çıktılarının hayatımıza etkilerini ve motivasyonumuzu tekrar tekrar sorgulayıp öyle karar vermeye çalışmak gerekiyor.

      Özetle üç yıl önce başlama motivasyonumu düşündüğümde, süreç içerisinde yaşadıklarımı hatırladığımda ve kazandığım eşsiz akademik alt yapıyı düşündüğümde iyi ki başlamış ve bitirmişim diyorum. Kazandığım akademik vizyon sayesinde iş hayatında yapmaya çalıştığım projeleri veya çözmeye çalıştığım problemleri daha farklı ele alıp değerlendirebiliyorum.

      Sonuç olarak, eğer hayatta ki motivasyonlarınız benim bu yazı aracılığı ile anlatmaya çalıştığım şeylere yakınsa yüksek lisans yapmak sizin için de güzel bir seçenek olabilir.

      Posted in Uncategorized | Tagged , , , , , , , , , | 1 Comment

      Docker Container üzerinden Autonomous Database ile Etkileşim

      Herkese Merhaba,

      Docker Logos | Docker

      Bu yazıda Oracle Cloud alt yapısı üzerinde sunulan veritabanı servislerinden biri olan Autonomous Veritabanı servisine bir docker imajı üzerinden erişmeyi göstereceğim. Umarım farkındalık anlamında faydalı bir yazı olur.

      Hepimizin takip ettiği gibi artık uygulama geliştirme dünyasının vazgeçilmez komponentlerinden bir tanesi container teknolojileri. Container teknolojileri sunmuş olduğu imkanlar ve avantajlar ile uzun zamandır uygulama geliştirme dünyasındaki dönüşümü tetikleyen ana unsur haline geldi. Bu nedenle artık yazılımcılar, geliştirdikleri çözümleri containerler üzerinde inşaa etmeye hızla devam etmektedir.

      Geliştireceğimiz örnek uygulama, yaratacağımız bir container imajı ile Oracle Cloud Altyapısına bağlanacak ve buradaki Autnomous Database servisine container içerisinden bir kayıt yazacak.

      Öncelikli olarak bu uygulamayı geliştirmek için bilgisayarımıza docker kurmamız gerekli.[DOCKER_KURULUMU_NASIL_YAPILIR]

      Bu uygulama için ihtiyaç duyduğumuz bir diğer ihtiyaç ise Oracle Cloud’da bir Autonomous Database servisi ayağa kaldırmak. Oracle Cloud hesabı edinmek ve bu servisi açmak tamamen ücretsiz. Oracle bulut hesabının ücretsiz olarak nasıl açılacağı ile ilgili bilgiye linke tıklayarak ulaşabilirsiniz. [ORACLE_CLOUD_FREE_TIER]

      Benim mevcutta bir Oracle Bulut hesabım olduğu için Autonomous Database servisini ayağa kaldırdım.

      Yarattığım veritabanı bir cloud servisi olduğu için bu servise bağlanmak için bir wallet’a ihtiyacım var. Şimdi bu wallet’ı nasıl indireceğimize bakalım. Öncelikle veritabanının üzerine tıklayıp servis ile ilgili detayların bulunduğu sayfaya gidiyoruz.

      Açılan ekrandan DB CONNECTION sekmesine tıklıyoruz ve download wallet diyoruz.

      Wallet’ı indirdiğimize göre database’e güvenli bağlantı kurabiliriz artık.

      Şimdi örnek use-case’i geliştirmek için veritabanı içerisinde bir tablo yaratalım.

      Tools Menüsü – Database Actions
      Development – SQL
      DROP TABLE DOCKER_TEST;
      
      CREATE TABLE DOCKER_TEST (
          COL_A  VARCHAR2(100),
          COL_B  VARCHAR2(100)
      );

      Evet veritabanı içerisinde test tablomuzu yarattık.

      Artık docker imajımızı oluşturma kısmına geçebiliriz. Yaratacağımız imaj çalıştığında yukarıda ayağa kaldırdığımız Autonomous Veritabanı’na bağlanıp docker_test tablosuna bir kayıt atacak. Ancak bu operasyonu yapabilmek için imajımızın içerisinde bazı kurulumların yapılmasına ihtiyaç var.

      Öncelikli olarak bu kayıt atma işini python programlama dili ile yapacağım için imaj içerisinde python’ın kurulu gelmesi gerekmekte. Bunun için docker hub’daki python:3.8 imajını kullanabiliriz. Bu imaj içerisinde otomatik olarak bir python kurulumu ile geliyor. Bunun üzerine python’dan Oracle veritabanına bağlanabilmek için cx_oracle ve sqlalchemy kütüphanelerinin de kurulması gerekecek. İmaj içerisine kurulmasını istediğim tüm kütüphaneleri requirements.txt isimli bir dosya içerisine yazıyorum. Daha sonra Dockerfile’da requirements.txt içinde yazılmış olan tüm kütüphanelerin imaj içerisine kurulmasını sağlayacak komutu yazacağım.

      requirements.txt

      Yaratacağım imajın bir Oracle veritabanına bağlanabilmesi için bir Oracle Client indirip bu Oracle Client’ı konfügre edip yaratacağım imajın içerisine yerleştirmem gerekiyor. Bu operasyon için öncelikle Oracle Client indirmemiz gerekli. Client’ı link’i takip ederek indirebilirsiniz. [Instant_Oracle_Client] Oluşturduğumuz imaj bir linux imajı olacağı için ben 64 bit linux seçimi ile ilerledim.

      Şimdi indirdiğimiz client’ı konfügre edelim. İlk olarak yapmamız gereken Oracle Cloud üzerinden indirdiğimiz wallet dosyasını açıp tüm dosyaları instant client içerisindeki instantclient_19_5/network/admin dizini altına taşımak olacak. Bu işlemi yaptıktan sonra ise instantclient_19_5/network/admin dizini içerisindeki sqlnet.ora dosyasındaki DIRECTORY pathini aşağıdaki gibi değiştirmek olacak. Buraya yazdığımız path, instantclient dosyamızın yaratacağımız imaj içerisinde hangi dizinde olacağının bilgisi. Bu şekilde de bırakabiliriz veya imaj içerisinde farklı bir yere taşıyacaksak orayı da burada belirtebiliriz.

      WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="/usr/src/app/instantclient_19_5/network/admin")))
      SSL_SERVER_DN_MATCH=yes

      Bu işlemde bittiğine göre artık database’e bağlanıp test kayıdı atacak python kodunu (app.py) yazabiliriz.

      import sqlalchemy as db
      from sqlalchemy import (MetaData, Table, Column, Integer,Date, select, literal, and_, exists,String)
      import os
      
      os.environ['TNS_ADMIN']='/usr/src/app/instantclient_19_5/network/admin/'
      engine = db.create_engine('oracle://ADMIN:dbMl19c_123!@dbml19c_high')
      
      metadata = MetaData()
      
      db_table = Table('docker_test', metadata,
          Column('col_a', String, primary_key=False),
          Column('col_b', String, primary_key=False)
      )
      
      upsert = db_table.insert().from_select([db_table.c.col_a,db_table.c.col_b],select([literal("TEST"),literal("TEST")]))
      engine.execute(upsert)

      Kodumuzu da geliştirdiğimize göre şimdi tüm parçaları aynı folder da toplayalım.

      Şimdi tüm hazırlıklar tamamlandığına göre imajımızı oluşturacak Dockerfile’ı yazalım ve imajımızı docker üzerinden build edelim.

      FROM python:3.8
      RUN apt-get update
      RUN apt-get install libaio1
      COPY requirements.txt /usr/src/app/
      RUN pip install --no-cache-dir -r /usr/src/app/requirements.txt
      COPY app.py /usr/src/app/
      COPY instantclient_19_5 /usr/src/app/instantclient_19_5
      ENV LD_LIBRARY_PATH=/usr/src/app/instantclient_19_5:$LD_LIBRARY_PATH
      CMD ["python", "/usr/src/app/app.py"]

      Dockerfile oluştu. Şimdi imajımızı build edelim.

      docker image build -t docker_oci .

      Yarattığımız imajın docker registry’e gelip gelmediğini kontrol edelim.

      docker image ls

      Artık imajımız hazır. Şimdi imajı bir container üzerinde çalıştırıp veritabanına kayıdın gidip gitmediğini kontrol edelim.

      docker container run docker_oci

      Görüldüğü üzere container ayağa kalktı yazdığımız python kodunu çalıştırdı ve durdu. Şimdi veritabanına bağlanıp kayıdın durumuna bakalım.

      SELECT * FROM DOCKER_TEST;

      Container üzerinde çalışan uygulamamız bulut üzerindeki veritabanı servisimize bağlanıp yarattığımız tabloya test kaydını yazmayı başardı.

      Geliştirmiş olduğumuz bu imajı container registry’mizde tutup OCI üzerinde bir Autonomous Database bağlantısı ihtiyacı duyacağımız her noktada bu imajı otomatik olarak kullanabiliriz.

      Posted in Uncategorized | Tagged , | Leave a comment

      ML Modellerinin Yorumlanması ve Model Karmaşıklığının Başarıma Etkisi

      Herkese Merhaba,

      Bu yazıda bir ML modelini değerlendirirken elde edilen çıktıların nasıl yorumlanması gerektiği ile ilgili düşüncelerimi paylaşacağım umarım farkındalık anlamında faydalı bir yazı olur.

      Machine Learning modellerinin farklı araçlar ile kolayca uygulanabildiği günümüzde bu modellerin nasıl değerlendirileceği de oldukça önemli bir konu. Çoğunlukla modeli üreten geliştiriciler hangi modeli seçeceğine karar verirken bazı önemli durumları pas geçebiliyor. Machine Learning’in temel prensipleri arasında yer alan bu metriklerin yorumu hayata geçireceğimiz modellerin sağlıklı bir şekilde çalışması için çok önemli.

      Machine Learning ile ilgilenen herkesin de bildiği üzere modellerimizi bazı metrikler ile değerlendiriyoruz. Ancak bu metrikleri yorumlarken bazı önemli ayrıntıların farkında olmak daha yerinde seçimler yapma konusunda bize oldukça yardımcı olabiliyor.

      Konuyu daha net tartışabilmek için bir örnek üzerinden gitmekte fayda olacaktır. Elimizde bir bir populasyondaki her bireye ait boy, kilo ve şeker hastası olup olmadığını belirten bir veri olduğunu düşünelim. Bu veriyi kullanarak bir model geliştiriyor olalım ve bu model boyu ve kilosu verilen bir bireyin şeker hastası olup olmadığını tahmin etsin. Yani bir binary classifier modelleyelim.

      Örnek senaryomuzu geliştirmek için bir ML algoritması ile hedef değişkenimiz olan şeker hastası olup olmama durumunu elimizdeki veriden öğrenecek bir model kurguluyoruz. Bu çalışma modele verdiğimiz boy, kilo bilgisi ile şeker hastası olup olmama durumu arasındaki ilişkiyi kuracak bir fonksiyon bulacak ve bu fonksiyonu sisteme gelecek yeni verilere uygulayarak bir kişinin şeker hastası olup olmadığını tahmin edecek.

      Yukarıda tarif ettiğimiz şekilde modelimizi oluşturduğumuzu varsayalım ve modelin değerlendirme kısmına geçelim. Bir binary sınıflandırıcıyı değerlendirirken kullanılan en temel araç confusion matrix’dir. Bu confusion matrix üzerinden üretilen accuracy, precision, recall ve f1-score değerleri de ürettiğimiz modelin yorumlanması konusunda bize oldukça iyi fikir verecek parametrelerdir. (Bu yazı çerçevesinde bahsetmiş olduğum metriklerin detaylarına girmeyeceğim ancak bu kavramların iyi öğrenilmesi ve ne ifade ettikleri bu konunun temel prensiplerinden bir tanesidir.) Ancak genellikle modellerin başarımı accuracy dediğimiz parametre üzerinden tartışılır ve değerlendirilir.

      Bir model eğitimi yapıldıktan sonra modelin başarımı yorumlanırken modelin overfitting ve underfitting kavramları ile ilişkisine de mutlaka bakılmalıdır.

      Overfitting dediğimiz kavram modelin eğitim veri setini yüksek hassasiyet ile öğrenmesi veya ezberlemesi durumudur. Bu durum ML modelleri için istenmeyen bir durumdur ve önüne geçmek için bazı konularda önlemler almak gerekir. Modelin eğitim verisine hassas olması genel bir model elde etmemizin önünde duran en büyük engeldir. Dolayısıyla overfit bir model muhtemelen test veri seti ile yapacağımız validasyonda daha kötü bir performans sergileyecektir ve genelleyici bir model elde etmemizin önünde bir engel olarak duracaktır.

      Underfitting ise modelin eğitim verisini öğrenememe durumudur ki underfit bir model kabul edilemeyecek bir çıktıdır.

      ML modellerinde arzu edilen durum hem overfitting in hem de underfitting’in oluşmasını engellemektir. Yani modelin öğrendiği curve (veya hyperplane) eğitim verisini ezberlemeden genelleyebilecek nitelikte olmalıdır.

      Overfitting’i engellemenin birden çok yolu olabilir. Bu yollardan biri kullandığımız modelin karmaşıklığı ile ilgilidir. Kompleks modellerin parametre sayıları görece olarak daha fazla olduğundan dolayı eğitim verisini çok iyi şekilde öğrenebilecek kapasiteye sahiptirler. Bu durum eğitim verisine hassas bir model elde etmemize sebep olacağından dolayı genel bir model elde etmemizin önünde bir engel teşkil edebilir. Model karmaşıklığı bakış açısı ile bu durumu incelediğimizde genellikle önerilen davranışın daha sade modeller ile çalışmak olduğunu görmekteyiz. Literatürde bu yaklaşıma Occam’s Razor adı verilmektedir. Daha sade modeller ile yüksek başarım elde etmek genelleyici modeller elde etmenin yollarından biri olabilir. Ancak genel bir model elde etme adına çok basit modeller kullanmakta underfitting’i yani öğrenememe durumunu yaratabilir. Dolayısıyla veri miktarının sabit olduğu koşullarda model karmaşıklığını kontrol altında tutarak her iki durumu da dizginleyebilmek mümkündür.

      underfitting overfitting

      Bu kavramlardan bahsederken Bias ve Variance ikileminden bahsetmemek olmaz. Bias dediğimiz kavram; modelimizin eğitim verisini nasıl açıkladığını ve öğrendiğini gösterir. Yüksek bias istenmeyen durumken, düşük bias arzu edilen durumdur. Bias’ın yükselmesi modelimizi underfitting’e doğru götürecektir. Dolayısıyla üreteceğimiz modeller de düşük bir bias arzu ettiğimiz şeydir. Variance dediğimiz kavram ise modelin eğitim verisi ile verdiği başarım ile test verisi ile verdiği başarım arasındaki farkı yorumlamamızı sağlar. İstediğimiz durum modelin eğitim verisi ile vermiş olduğu başarıma yakın bir başarımı test verisi ile de vermesedir. Böyle bir modelde variance düşük olacaktır.

      İdeal durumda bir modelin düşük variance ve düşük bias a sahip olması beklenir. Ancak böyle bir sonuç alınamıyorsa ikisinin de dengede olması, üzerinde çalışılan modelin seçilmesi için uygun bir opsiyon olacaktır.

      Sonuç olarak ML modellerinin sonuçlarını yorumlayabilmek için yukarıda bahsettiğimiz kavramların tamamına bakmak ve buna uygun hareket etmek daha sonra, stabil ve genelleyici modellere doğru bizi götürecektir. Kavramlar arasındaki ikilemleri ortak bir potada eritip işimize yarayacak en optimum sonuçlara ulaşabilmek için mutlaka model ile ilgili her değişkeni kontrol altında tutup sonuçları gözlemlemek gerekecektir.

      Posted in Uncategorized | Tagged , , | Leave a comment

      Veritabanı İçerisinde XGBoost Algoritması ile Sınıflandırma

      Herkse Selam,

      Bu yazıda veritabanı içerisinde günümüzün en popüler ensemble learner yöntemlerinden biri XGBoost algoritmasını nasıl uygulayacağımıza bakacağız umarım farkındalık anlamında faydalı bir çalışma olur.

      Hepimizin bildiği üzere Oracle veritabanı yazılımı içerisinde 9i sürümünden bu yana makine öğrenimi algoritmaları kullanılarak ileri analitik uygulamalar geliştirilebilmekte.  Veritabanı sürümleri yenilendikçe de bu algoritma seçeneklerine yenileri eklenmekte. Oracle 19c sürümü ile gelen güncel algoritma listesi aşağıdaki gibidir.

      Geçtiğimiz hafta Oracle güncel veritabanı sürümü olan 21c’yi duyurdu. Oracle 21c veritabanı sürümü ile bu algoritma listesine de yeni algoritmalar eklemiş oldu. Şüphesiz ki bu algoritmalardan en çok ilgi çekeni endüstrinin en sık kullanılan ensemble yöntemlerinden biri olan XGBoost algoritması oldu. Kaggle üzerinden açılan ML yarışmalarında ki başarısı ile öğrenme kapasitesini ispatlamış olan XGBoost artık Oracle veritabanı içerisinde de kullanıma hazır bir hale geldi.

      Şimdi Oracle 21c ile bir XGBoost modeli oluşturup nasıl kullanıldığını test edelim. Ben bu testi yapmak için Oracle Cloud Infrastructure üzerinde Oracle 21c sürümü ile gelen bir Autonomous Data Warehouse servisi ayağa kaldırıp yapacağım.

      Bu örnekte bir sınıflandırma problemi çözeceğim ancak bu alt yapı ve algoritma ile regresyonda yapılacağı unutulmamalıdır. Kullanacağım veri seti Iris olacak. Veri setini indirdikten sonra veritabanına yükleme işlemini gerçekleştiriyorum SQL Developer Web arayüzü üzerinden.

      CREATE TABLE ADMIN.IRIS 
          ( 
           sepal_length FLOAT , 
           sepal_width  FLOAT , 
           petal_length FLOAT , 
           petal_width  FLOAT , 
           class        VARCHAR2(4000) 
          ) ;

      Evet verimizi yükledik veritabanı içerisine şimdi modelimizi kurgulama kısımına geçebiliriz.

      İlk etapta algoritma parametrelerini belirlemek için bir tablo yaratıyoruz. Bu tabloya algoritmanı çalışacağı parametreleri yazacağız daha sonra kullanılmak üzere.

      CREATE TABLE ADMIN.ALGO_VARIABLES (
          SETTING_NAME   VARCHAR2(4000),
          SETTING_VALUE  VARCHAR2(4000)
      );
      
      BEGIN
          
        INSERT INTO ADMIN.ALGO_VARIABLES (setting_name, setting_value) VALUES
          (dbms_data_mining.xgboost_objective, 'multi:softprob');
      
        INSERT INTO ADMIN.ALGO_VARIABLES (setting_name, setting_value) VALUES
          (dbms_data_mining.algo_name, dbms_data_mining.algo_xgboost);
      
        INSERT INTO ADMIN.ALGO_VARIABLES (setting_name, setting_value) VALUES
          (dbms_data_mining.xgboost_max_depth, '3');
      
        INSERT INTO ADMIN.ALGO_VARIABLES (setting_name, setting_value) VALUES
          (dbms_data_mining.xgboost_eta, '1');
      
        INSERT INTO ADMIN.ALGO_VARIABLES (setting_name, setting_value) VALUES
          (dbms_data_mining.xgboost_num_round, '5');
      
      COMMIT;
          
      END;

      Evet algoritma parametrelerimi ayarladım. Bu parametreler ile ilgili detaylı bilgilere ve opsiyonlara linki takip ederek ulaşabilirsiniz.

      Veriyi yükledik, algoritma parametrelerimizin değerlerini setledik. Şimdi training aşamasına geçebiliriz.

      BEGIN
          DBMS_DATA_MINING.CREATE_MODEL(
                                       MODEL_NAME           => 'XGBoost_Model',
                                       MINING_FUNCTION      => DBMS_DATA_MINING.CLASSIFICATION,
                                       DATA_TABLE_NAME      => 'iris',
                                       CASE_ID_COLUMN_NAME  =>  NULL,
                                       TARGET_COLUMN_NAME   => 'class',
                                       SETTINGS_TABLE_NAME  => 'algo_variables'
          );
      END;
          
      
      SELECT *
        FROM user_mining_model_attributes
       WHERE model_name = 'XGBOOST_MODEL'
      ORDER BY attribute_name;

      Şimdi geliştirdiğimiz modeli test etme aşamasına geçelim. Modeli kullanmayı iki şekilde yapabiliriz. Bunlardan biri bir tablo içindeki tüm değerleri tahmin ettirmek olabilir.

      select 
         PETAL_LENGTH,PETAL_WIDTH,SEPAL_LENGTH,SEPAL_WIDTH,
         prediction (XGBOOST_MODEL using *) prediction
      from iris_test t ;

      Diğeri ise tek bir değeri tahmin ettirmek olabilir.

      Evet görüldüğüz üzere veritabanı içerisindeki verimizi, veritabanı dışına çıkartmadan XGBoost algoritmasını kullanarak modelleyebildik.

      Posted in Uncategorized | Tagged , , , , , , | Leave a comment

      Machine Learning Uygulamalarının Docker Üzerinden Servis Edilmesi

      Herkese Selam,

      Makine Öğrenimi ile ilgili projeler yaygınlaşmaya başladıkça bu projelerin canlı ortamlara nasıl aktarılacağı ile ilgili pratikler hakkında her geçen gün yenilikler olmakta. Bu bağlamda bu yazı ile bir makine öğrenimi modelini container alt yapılarını kullanarak en hızlı ve etkili bir şekilde canlı ortama nasıl aktarılabileceği ile ilgili bir örnek yapacağım. Umarım farkındalık anlamında faydalı bir çalışma olur.

      Örneğimize başlamadan önce sözel olarak bu aktarım alt yapısını hakkında bir miktar bilgi vermek istiyorum.

      Günümüzde modern yazılım geliştirme mimarilerini incelediğimizde yazılım geliştirme yaşam döngüsünün her adımında yeni pratiklerin ve frameworklerin geliştiğini görmekteyiz.  Uygulamanın geliştirilmesinden, uygulamanın test edilmesine ve devreye alınmasına kadar her adımda farklı yaklaşımların denendiğini görüyoruz. Modern yazılım geliştirme mimarilerini incelerken karşılaştığımız en temel bileşenlerinden birinin şüphesiz container teknolojileri olduğunu görmekteyiz. Kısaca, container teknolojilerinin bize sunmuş olduğu avantajlardan bahsetmek gerekirse;

      • Geliştirdiğimiz uygulamaları çok kolay ve hızlı bir şekilde çalıştırılmasını sağlar.
      • Uygulamanın ihtiyaç duyduğu tüm ek kütüphane bağımlıklarını uygulamamız ile bütünleşik bir şekilde tutarak kolay, hızlı ve etkili bir şekilde uygulamamızı devreye almamıza olanak sağlar ve uygulamamızın dağıtımını kolaylaştırır.
      • Container olarak devreye alınan uygulamaların yönetimi ve bakımıda oldukça kolay yapılabilmektedir.

      Container teknolojileri derinlemesine incelenmesi gereken bir konu olduğu için ben bu yazıda bu konu hakkında daha fazla detaya girmeyeceğim. Daha detaylı bilgi edinmek için Docker dokümantasyonunu inceleyebilir bu konu hakkında yazılmış yüzlerce blog yazılarından faydalanabilir.

      Container teknolojilerini konuştuğumuz bir dünyada Docker şüphesiz ki lokomotif olan bir teknoloji. Endüstride defacto bir standart haline gelen docker, container tabanlı yazılım geliştirme yapan hemen hemen herkesin kullandığı bir araç. Bugün bende bu örneği Docker platformu üzerinde yaratacağım bir container aracılığı ile çalıştırmayı deneyeceğim.

      Bu örneğimizin yapılabilmesi için öncelikle çalıştığımız ortamda Docker ‘ın kurulu olması gerekmekte. Aşağıdaki lini izleyerek Docker’ı çalışma ortamınızda hazır edebilirsiniz.

      Şimdi yapacağımız örneğe gelelim. Bu örnekte yeni bir uygulama geliştirmeyeceğim. Bir önceki “Web Sayfası olarak Machine Learning Modellerinin Kullanıma Açılması” başlıklı yazımda yapmış olduğum çalışmanın bire bir aynısını yapacağım. Ancak sonuç kısmını lokalimden ayağa kaldırmayacağım, geliştirdiğim web uygulamasını bir Docker Container’ına çevirip o şekilde Docker üzerinde çalıştıracağım. Bu nedenle örneği tam olarak anlayabilme adına linkini paylaştığım yazımda nasıl bir uygulama geliştirildiğine bir göz atmanızı öneririm. Bu yazıya konu olan çalışma, o yazıda geliştirilen çalışmanın devamı niteliğinde olacaktır.

      Görseller ile uygulamanın ne olduğunu hatırlayacak olursak;

      Evet şimdi bu uygulamayı Docker container’ına dönüştürecek imajımı oluşturmak için dockerfile’ı yazalım. Oluşturacağım imajın iskeletini dockerhub’daki official python imajlarından kullanacağım. Seçtiğim iskelet imaj alpine olacak boyutunun küçük olması sebebi ile. Ancak şunu unutmamak gerekiyor benim bu imajı kullanarak oluşturduğum kendi imajlarımın build süreleri azımsanmayacak kadar uzun bunuda dip not olarak söylemek istiyorum.

      Dockerfile.yaml

      FROM python:3.9.0b3-alpine3.12
      WORKDIR /app
      ENV FLASK_APP webform.py
      ENV FLASK_RUN_HOST 0.0.0.0
      RUN apk --update add gcc build-base freetype-dev libpng-dev openblas-dev
      RUN apk --no-cache add --virtual .builddeps g++ musl-dev
      RUN apk del .builddeps
      RUN pip install scikit-learn==0.19.1
      RUN pip install --no-cache-dir flask sklearn matplotlib pandas numpy 
      COPY . .
      CMD ["flask", "run"]
      

       

      Uygulamamızın çalışacağı docker imajını oluşturacak Dockerfile’ı yazdık. Kabaca burada alpine python imajı üzerinden uygulama ayarlarımızı yaptık. Bu imaj içindeki işletim sisteminin eksik kütüphanelerini kurduk (RUN komutları). Bu aşamadan sonra python içerisinde uygulamamızın kullanacağı kütüphanelerin kurulmasını sağlayacak girdileri verdik. Daha sonra ise uygulama kodlarımızın tamamını oluşacak imaj içine kopyalanmasını sağladık (COPY) ve tüm işlemler bittikten sonra kodumuzu çalıştıracak komutu yazdık (CMD) ve işlemleri sonlandırdık.

      Şimdi yazdığımız Dockerfile’dan imajımızı üretecek kodumuzu terminal ekranından çalıştıralım.

      docker build -f Dockerfile.yaml -t sentiment-model .
      

      İmajın build edilmesi uzun sürebilir. Build işlemi bittikten sonra aşağıdaki komut ile imajın Docker registry’ye gelip gelmediğini kontrol edebilirsiniz.

      docker image ls
      

      Evet gördüğümüz üzere docker imajımız oluşmuş verdiğimiz tag name ile.

      Şimdi bu imajı bir container içine koyup çalıştıralım ve test edelim.

      docker run -d -it --rm -p 3000:5000 --name sentiment-model sentiment-model:latest
      

      Container’da ayağa kalkacak uygulamaya makinemden ulaşmak için, container’ın 5000 portunda çalışan uygulamayı ana makinemdeki 3000 numaralı porta yönlendirdim. Dolayısıyla 3000 numaralı port üzerinden uygulamaya erişeceğim ana makinemden.

      Evet container ayağa kalktı. Şimdi ana makinemizdeki browserdan container da çalışan uygulamamıza erişmeye çalışalım.

      Evet container üzerinden çalıştırdığımız uygulamayı lokalimizdeki browserdan ulaşıp testimizi yapabildik.

      Uygulamayı bir docker imajına çevirmemizin en büyük faydası oluşturduğumuz bu imajı her ortama çok kolay bir şekilde taşıyıp o ortamda çalıştırabilmemiz olacak. Ürettiğimiz bu imajı dockerhub’a yüklediğimiz takdirde böyle bir uygulamaya ihtiyaç duyacak herkes çok rahat bir şekilde dockerhub üzerinden bu uygulamayı çekip kullanabilecek. Bunun yanı sıra bu imajı neredeyse tüm cloud vendorların docker registry’lerine gönderip dakikalar mertebisinde bulutta da çalıştırabilme imkanımız olacak. Dolayısıyla yazdığımız uygulamaları docker imajlarına çevirmemizin faydası çok ama çok fazla oluyor. Geliştirdiğimiz uygulamaları bu perspektiften bakarak geliştirmemiz kolayca sökülüp takılabilen modüler yazılımlar üretmemize olanak sağlayacaktır.

      Posted in Root | Leave a comment

      Web Sayfası olarak Machine Learning Modellerinin Kullanıma Açılması

      Herkese Selam,

      Machine Learning modellerinin kullanıma açılması ile ilgili opsiyonları bir süredir paylaşıyorum. Bu opsiyonlardan birini bir önceki yazımda paylaşmıştım. Link‘e tıklayarak bu yazıya gidebilirsiniz. Bu yazıda ise farklı bir kullanıma açma senaryosu ile ilgili bir örnek yapmayı planlıyorum. Umarım farkındalık anlamında faydalı bir yazı olur.

      Girişi, yukarıda linkini paylaşmış olduğum bir önceki yazımdan alıntı yaparak başlamak istiyorum.

      “Hepimizin bildiği üzere Makine Öğrenimi ve uygulamaları günümüzün en trend konularının başında geliyor. Bireysel kullanıcılardan kurumsal büyük organizasyonlara kadar bir çok oyuncu makine öğrenimi uygulamaları geliştirmeye çalışıyor. Bu konu ile ilgili mesai harcayan herkesin bildiği üzere bu projelerin gelişimi standart yazılım geliştirme akışından bir miktar farklı. Çözmek istediğimiz probleme ait modeli önce prototipliyoruz daha sonra belirli bir süre test edip parametrelerini en iyileyerek modelimizi nihai halini almasını sağlıyoruz. Modelimiz oldu dediği noktada da bu modeli kullanıma açma kısımına geçiyor. Tam bu noktada mevcut skill setimizin yanında bir miktar yazılım geliştirme ve veri mühendisliği bilmemiz gerekiyor çünkü standart yazılım geliştirme yöntemleri ile bundan sonraki kısımları halletmemiz gerekiyor. Yazımıza konu olan kısımda tamda bu noktada başlıyor.” 

      Bu yazıya konu olacak modelimiz bir önceki yazımda kullanmış olduğum modelin bire bir aynısı dolayısıyla bu yazıdaki örneği daha iyi kavrayabilme adına bir önceki yazıdakinin aynısı. Yani daha önce bu blogta paylaşmış olduğum “Doğal Dil İşleme (NLP) ile Sentiment (Duygu) Analizi Tespiti” yazısında paylaşmış olduğum model üzerinden çalışmayı yapacağım ve yine önemle vurgulamak isterimki bu yazının yazılma amacı state of the art bir sentiment analyzer yapmak değil.

      “Öncelikle senaryomdan bir miktar bahsedeyim. Bir sentiment analizi modeli geliştirmek istiyorum. Bu modeli imdb, yelp ve amazon’dan toplanmış bir veri seti ile eğitip basit bir sentiment tahmin modeli geliştireceğim. Daha sonra bu modeli bitirdikten sonra bir web sayfası tasarlayıp bu web sayfası üzerinden modeli son kullanıcıların kullanımına açacağım.

      Bu yazıya konu olan modeli daha önce paylaşmış olduğum yazımdan daha detaylı anlayabilirsiniz. Ben sadece modeli elde ettiğim kod kısmını bütünlük bozulmasın diye copy paste edeceğim.

      import pandas as pd
      import numpy as np
      import pickle
      import sys
      import os
      import io
      import re
      from sys import path
      import numpy as np
      import pickle
      from sklearn.feature_extraction.text import CountVectorizer
      from sklearn.naive_bayes import MultinomialNB
      from sklearn.model_selection import train_test_split
      from sklearn.preprocessing import LabelBinarizer
      import matplotlib.pyplot as plt
      from string import punctuation, digits
      from IPython.core.display import display, HTML
      from nltk.corpus import stopwords
      from nltk.corpus import stopwords
      from nltk.tokenize import word_tokenize
      from nltk.tokenize import RegexpTokenizer
      
      #Amazon Data
      input_file = "../data/amazon_cells_labelled.txt"
      amazon = pd.read_csv(input_file,delimiter='\t',header=None)
      amazon.columns = ['Sentence','Class']
      
      #Yelp Data
      input_file = "../data/yelp_labelled.txt"
      yelp = pd.read_csv(input_file,delimiter='\t',header=None)
      yelp.columns = ['Sentence','Class']
      
      #Imdb Data
      input_file = "../data/imdb_labelled.txt"
      imdb = pd.read_csv(input_file,delimiter='\t',header=None)
      imdb.columns = ['Sentence','Class']
      
      
      #combine all data sets
      data = pd.DataFrame()
      data = pd.concat([amazon, yelp, imdb])
      data['index'] = data.index
      
      #Total Count of Each Category
      pd.set_option('display.width', 4000)
      pd.set_option('display.max_rows', 1000)
      distOfDetails = data.groupby(by='Class', as_index=False).agg({'index': pd.Series.nunique}).sort_values(by='index', ascending=False)
      distOfDetails.columns =['Class', 'COUNT']
      print(distOfDetails)
      
      #Distribution of All Categories
      plt.pie(distOfDetails['COUNT'],autopct='%1.0f%%',shadow=True, startangle=360)
      plt.show()
      
      #Text Preprocessing
      columns = ['index','Class', 'Sentence']
      df_ = pd.DataFrame(columns=columns)
      
      #lower string
      data['Sentence'] = data['Sentence'].str.lower()
      
      #remove email adress
      data['Sentence'] = data['Sentence'].replace('[a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]+', '', regex=True)
      
      #remove IP address
      data['Sentence'] = data['Sentence'].replace('((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}', '', regex=True)
      
      #remove punctaitions and special chracters
      data['Sentence'] = data['Sentence'].str.replace('[^\w\s]','')
      
      #remove numbers
      data['Sentence'] = data['Sentence'].replace('\d', '', regex=True)
      
      #remove stop words
      for index, row in data.iterrows():
          word_tokens = word_tokenize(row['Sentence'])
          filtered_sentence = [w for w in word_tokens if not w in stopwords.words('english')]
          df_ = df_.append({"index": row['index'], "Class":  row['Class'],"Sentence": " ".join(filtered_sentence[0:])}, ignore_index=True)
      
      data = df_
      
      from sklearn.metrics import confusion_matrix
      from sklearn.model_selection import cross_val_score
      from sklearn.metrics import accuracy_score
      from sklearn.neural_network import MLPClassifier
      from sklearn.feature_extraction.text import TfidfVectorizer
      from sklearn.linear_model import SGDClassifier
      
      
      #grid search result
      vectorizer = TfidfVectorizer(analyzer='word',ngram_range=(1,2), max_features=50000,max_df=0.5,use_idf=True, norm='l2') 
      counts = vectorizer.fit_transform(X_train)
      vocab = vectorizer.vocabulary_
      classifier = SGDClassifier(alpha=1e-05,max_iter=50,penalty='elasticnet')
      targets = y_train
      classifier = classifier.fit(counts, targets)
      example_counts = vectorizer.transform(X_test)
      predictions = classifier.predict(example_counts)
      
      from sklearn.metrics import precision_score
      from sklearn.metrics import recall_score
      from sklearn.metrics import classification_report
      
      #Model Evaluation
      acc = accuracy_score(y_test, predictions, normalize=True)
      hit = precision_score(y_test, predictions, average=None,labels=classes)
      capture = recall_score(y_test, predictions, average=None,labels=classes)
      
      print('Model Accuracy:%.2f'%acc)
      print(classification_report(y_test, predictions))
      

      Evet modelimizi oluşturduk. Bundan sonra ihtiyacımız olan şey oluşturduğumuz modeli ve modelin vocabulary çıktısını pickle ile kayıt etmek. Daha sonra geliştireceğimiz web sayfasında bu outputları kullanacağız.

      ### model_save ###
      pickle.dump(classifier,open("model_sentiment.pkl","wb"))
      pickle.dump(vocab,open("vocab_sentiment.pkl","wb"))
      

      Modelimiz ile ilgili çıktılarımız diske kayıt edildi. Şimdi bu modele input olarak gönderilecek text’in sentimentini bulup geriye dönecek web sayfasının geliştirmesine başlayabiliriz.

      Geliştirmeyi python ile yapacağımdan dolayı python’ın flask kütüphanesini kullanacağım. Flask python ile web tabanlı uygulamalar geliştirmenizi sağlayan bir kütüphane. Bende bu kütüphaneyi kullanarak bir web servis geliştireceğim. Öncelikle geliştirme ortamımıza flask kurulumu yapalım.

      pip install -U Flask
      
      veya anaconda kullanıcıları için 
      
      conda install -c anaconda flask
      

      Flask kurulumumuzda tamamlandığına göre şimdi web sayfamızın geliştirmesini yapabiliriz.

      Geliştirmeye başlamadan önce kendi localimde kurmuş olduğum dizin yapısını göstermek istiyorum. Böyle bir çalışma için sizinde benzer bir dizin yapısı kurmanızın işe yarayacağını düşünmekteyim. Zaten bu bir web uygulaması olacağı için ana kodu yazdığımız webform.py çalıştığı esnada render edeceği .html dosyasını /templates dizini altında arayacak. Dolayısıyla html sayfanızı geliştirdikten sonra templates dizini altına atmanız gerekecek. Aşağıda başarılı şekilde çalışacak dizin yapısını görebilirsiniz.

      Dizin yapımda da göreceğiniz üzere geliştirdiğim ve outputlarını aldığım model çıktılarımı models folder’ının altına taşıdım. Templates dizini altına webform.html dosyamı yaratıp koydum. Aynı şekilde ana dizin altına da webform.py isimli kod dosyamı oluşturup kayıt ettim.

      Bu uygulama web sayfası üzerinden kullanıcıya ulaştırılacağı için çok basit bir tasarım la kullanıcının text girişi yapıp sonucu göreceği basit bir html form tasarlıyorum. Bu web sayfası, web teknolojilerinin sunmuş olduğu tüm güncel alt yapılar ile donatılabilir ben sadece olabildiğince basit bir tasarım ile nasıl yapıldığını göstermek istiyorum.

      “Not: Form inputunu bir tweet olarak kurguladım. Bunun hiç bir önemi yok :)”

      webform.html

      <form method="POST">
      	<br><b>Enter Tweet here...</b></br>
      	<textarea rows="4" cols="50" name="tweet">
      	</textarea>
      	<br></br>
          <input type="submit">
          <br></br>
          <h1><b> Result: </b> {{ value }} </h1>
      </form>
      

      Şimdi yarattığımız formun nasıl bir şey olduğuna bakalım.

      Evet görüldüğü üzere tasarımımız çok basit. Şimdi bu formu kullacak ve modelimizi çalıştırıp yukarıdaki sayfadan gönderilen text’in sentimeni bulup geri form’a cevabı döndüren python kodunuz yazalım.

      webform.py

      Burada dikkat edilmesi gereken üç şey var. Birincisi yazdığımı html kodunun nasıl çağırıldığı. İkincisi model outputlarımızı load edip kullanıma hazır hale getirmek.
      Üçüncüsü ise dışarıdan parametre olarak gelecek text’i bir değişken içerisine almak ve dördüncüsü bulunan sonucun web sayfasına geri döndürülmesi. Bu satırları vurgulamak açısından bold yapıyorum.

      from flask import Flask, request, render_template, url_for
      import pickle
      import time
      import os
      from sklearn.feature_extraction.text import TfidfVectorizer
      import pandas as pd
      import io
      import re
      from sys import path
      import numpy as np
      from sklearn.feature_extraction.text import CountVectorizer
      from sklearn.naive_bayes import MultinomialNB
      from sklearn.model_selection import train_test_split
      from sklearn.preprocessing import LabelBinarizer
      import matplotlib.pyplot as plt
      from string import punctuation, digits
      from flask import Flask, request, render_template, url_for
      
      start_time = time.time()
      
      app = Flask(__name__)
      app.config["DEBUG"] = True
      
      @app.route('/')
      def my_form():
          return render_template('webform.html')
      
      @app.route('/', methods=['POST','GET'])
      def home():
      	vec = open("models/model_sentiment.pkl", 'rb')
      	loaded_model = pickle.load(vec)
      
      	vcb = open("models/vocab_sentiment.pkl", 'rb')
      	loaded_vocab = pickle.load(vcb)
      
      	txt = request.form['tweet']
          
      	examples = txt
      
      	examples = examples.lower()
      	examples = examples.replace('\n',' ')
      	examples = re.sub(r'[a-zA-Z0-9-_.]+@[a-zA-Z0-9-_.]+', ' ', examples)
      	examples = re.sub(r'@[A-Za-z0-9]+', ' ', examples)
      	examples = re.sub(r'((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}', ' ', examples)
      	examples = re.sub(r'[^\w\s]', ' ', examples)
      	examples = re.sub(r'\d', ' ', examples)
      	examples = re.sub(' +',' ',examples) 
      	examples = [examples]
      	
              from sklearn.feature_extraction.text import TfidfTransformer
      	from sklearn.feature_extraction.text import TfidfVectorizer
      	count_vect = TfidfVectorizer(analyzer='word',ngram_range=(1,2), max_features=50000,max_df=0.6,use_idf=True, norm='l2',vocabulary=loaded_vocab)
      	x_count = count_vect.fit_transform(examples)
      	predicted = loaded_model.predict(x_count)
      	result=''
      	if predicted[0] == 0:
      	    result= 'Negative'
      	elif predicted[0] == 1:
      	    result= 'Positive'
      	return render_template('webform.html',value=result)
      

      Evet geliştirmeleri tamamladık. Şimdi yazdığımız webform.py kodunu çalıştıralım.

      env FLASK_APP=webform.py flask run
      


      Evet servisimiz ayağa kalktı ve endpoint adresi ekranda bize gösterildi. Şimdi servisi test edelim. Test için ekranda görünen endpointi browsera yazmamız yeterli olacak ve istediğimiz bir input ile testimizi yapacağız.

      Evet görüldüğü üzere web sayfamızı yazdığımız python kodu üzerinden ayağa kaldırdık ve machine learning modelini son kullanıcının rahatlıkla kullanabileceği bir hale getirmiş olduk.

      Posted in Root, Uncategorized | Tagged , , , , , , , , , , | 2 Comments