{"id":34985,"date":"2025-11-24T12:01:22","date_gmt":"2025-11-24T09:01:22","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/"},"modified":"2025-11-24T12:01:22","modified_gmt":"2025-11-24T09:01:22","slug":"lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/","title":{"rendered":"Lokal MLOps: Docker Compose ile Bulut Benzeri Veri Bilimi Deneyimi"},"content":{"rendered":"<p><body><\/p>\n<style>\n        \/* Genel stil ayarlar\u0131 *\/\n        body {\n            font-family: Arial, sans-serif;\n            line-height: 1.6;\n            color: #333;\n            max-width: 900px;\n            margin: 20px auto;\n            padding: 0 15px;\n            background-color: #f9f9f9;\n        }\n        h2 {\n            color: #2c3e50;\n            border-bottom: 2px solid #3498db;\n            padding-bottom: 10px;\n            margin-top: 40px;\n        }\n        h3 {\n            color: #34495e;\n            margin-top: 30px;\n        }\n        p {\n            margin-bottom: 15px;\n        }\n        pre {\n            background-color: #ecf0f1;\n            padding: 15px;\n            border-radius: 5px;\n            overflow-x: auto;\n            margin-bottom: 20px;\n        }\n        code {\n            font-family: \"Courier New\", Courier, monospace;\n            background-color: #e0e6e7;\n            padding: 2px 4px;\n            border-radius: 3px;\n        }\n        pre code {\n            background-color: transparent;\n            padding: 0;\n        }\n        ul, ol {\n            margin-bottom: 15px;\n            padding-left: 20px;\n        }\n        li {\n            margin-bottom: 8px;\n        }\n        table {\n            width: 100%;\n            border-collapse: collapse;\n            margin-bottom: 20px;\n        }\n        th, td {\n            border: 1px solid #ddd;\n            padding: 10px;\n            text-align: left;\n        }\n        th {\n            background-color: #f2f2f2;\n            font-weight: bold;\n        }\n        .tip-box {\n            background-color: #e8f6f3;\n            border-left: 5px solid #1abc9c;\n            padding: 15px;\n            margin: 20px 0;\n            border-radius: 4px;\n            font-style: italic;\n        }\n        .faq-section {\n            margin-top: 50px;\n            border-top: 2px dashed #ccc;\n            padding-top: 30px;\n        }\n        .faq-question {\n            font-weight: bold;\n            color: #2c3e50;\n            margin-top: 20px;\n        }\n        .faq-answer {\n            margin-bottom: 15px;\n        }<\/p>\n<p>        \/* Mobil uyumluluk i\u00e7in medya sorgular\u0131 *\/\n        @media (max-width: 768px) {\n            body {\n                margin: 10px auto;\n                padding: 0 10px;\n            }\n            h2 {\n                font-size: 1.8em;\n            }\n            h3 {\n                font-size: 1.3em;\n            }\n            table, thead, tbody, th, td, tr {\n                display: block;\n            }\n            thead tr {\n                position: absolute;\n                top: -9999px;\n                left: -9999px;\n            }\n            tr {\n                border: 1px solid #ccc;\n                margin-bottom: 10px;\n            }\n            td {\n                border: none;\n                border-bottom: 1px solid #eee;\n                position: relative;\n                padding-left: 50%;\n                text-align: right;\n            }\n            td:before {\n                position: absolute;\n                top: 6px;\n                left: 6px;\n                width: 45%;\n                padding-right: 10px;\n                white-space: nowrap;\n                text-align: left;\n                font-weight: bold;\n            }\n            \/* Her s\u00fctunun ba\u015fl\u0131\u011f\u0131n\u0131 td:before i\u00e7eri\u011fine ekleyin *\/\n            td:nth-of-type(1):before { content: \"Servis:\"; }\n            td:nth-of-type(2):before { content: \"Kullan\u0131m Alan\u0131:\"; }\n            td:nth-of-type(3):before { content: \"Avantaj\u0131:\"; }\n        }\n    <\/style>\n<p>Veri bilimi ve makine \u00f6\u011frenimi projeleri, geli\u015ftirme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinde karma\u015f\u0131kl\u0131klarla doludur. Bulut tabanl\u0131 \u00e7\u00f6z\u00fcmler cazip g\u00f6r\u00fcnse de, lokal bir ortamda &#8220;bulut benzeri&#8221; bir deneyim sunarak maliyetleri d\u00fc\u015f\u00fcrmek, performans\u0131 art\u0131rmak ve veri gizlili\u011fini sa\u011flamak m\u00fcmk\u00fcn m\u00fc? Evet, Docker Compose ile bu hedefe ula\u015fabilir, MLOps s\u00fcre\u00e7lerinizi yerel makinenizde bile verimli bir \u015fekilde y\u00f6netebilirsiniz.<\/p>\n<p>Makine \u00d6\u011frenimi Operasyonlar\u0131 (MLOps), makine \u00f6\u011frenimi modellerini geli\u015ftirme, da\u011f\u0131tma ve y\u00f6netme s\u00fcre\u00e7lerini otomatikle\u015ftiren ve standartla\u015ft\u0131ran bir k\u00fclt\u00fcrel ve m\u00fchendislik yakla\u015f\u0131m\u0131d\u0131r. Geli\u015ftirme, test ve \u00fcretim aras\u0131ndaki bo\u015flu\u011fu kapatmay\u0131 hedefler. Temelde, bir modelin fikirden \u00fcretime kadar olan t\u00fcm ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc kapsar. Bu s\u00fcre\u00e7; veri haz\u0131rl\u0131\u011f\u0131, model e\u011fitimi, model s\u00fcr\u00fcmleme, model da\u011f\u0131t\u0131m\u0131, model izleme ve s\u00fcrekli yeniden e\u011fitim gibi ad\u0131mlar\u0131 i\u00e7erir.<\/p>\n<p>\u00d6zellikle veri bilimcileri i\u00e7in, farkl\u0131 ba\u011f\u0131ml\u0131l\u0131klarla \u00e7al\u0131\u015fan birden fazla proje \u00fczerinde \u00e7al\u0131\u015fmak olduk\u00e7a yayg\u0131n bir durumdur. Bir projenin Python 3.8&#8217;e ihtiyac\u0131 varken, di\u011feri yaln\u0131zca Python 3.10 ile uyumlu olabilir. Bu t\u00fcr senaryolar, geli\u015ftirme ortam\u0131 y\u00f6netimini bir kabusa d\u00f6n\u00fc\u015ft\u00fcrebilir. \u0130\u015fte tam da bu noktada konteynerizasyon devreye giriyor. Konteynerler, bir uygulaman\u0131n ve t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131n izole edilmi\u015f, ta\u015f\u0131nabilir bir ortamda paketlenmesini sa\u011flar. Bu sayede, uygulaman\u0131z\u0131n farkl\u0131 ortamlarda (yerel makine, test sunucusu, bulut) ayn\u0131 \u015fekilde \u00e7al\u0131\u015faca\u011f\u0131ndan emin olabilirsiniz.<\/p>\n<p>Docker, konteyner teknolojisinin en pop\u00fcler uygulay\u0131c\u0131lar\u0131ndan biridir. Docker ile uygulamalar\u0131n\u0131z\u0131 hafif, ta\u015f\u0131nabilir ve kendi ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 i\u00e7eren &#8220;Docker imajlar\u0131&#8221; haline getirirsiniz. Bu imajlar, \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda konteyner ad\u0131 verilen izole edilmi\u015f ortamlar olu\u015fturur. Her konteyner, kendi i\u015fletim sistemi katman\u0131na sahip gibi davran\u0131r, ancak temel i\u015fletim sistemi \u00e7ekirde\u011fini payla\u015f\u0131r. Bu durum, sanal makinelerden (VM) \u00e7ok daha verimli olmalar\u0131n\u0131 sa\u011flar, \u00e7\u00fcnk\u00fc VM&#8217;ler her biri kendi tam i\u015fletim sistemi kopyas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r.<\/p>\n<p>Peki ya birden fazla servisin (\u00f6rne\u011fin, bir veritaban\u0131, bir web uygulamas\u0131 ve bir MLflow izleme sunucusu) bir arada \u00e7al\u0131\u015fmas\u0131 gerekiyorsa? \u0130\u015fte burada Docker Compose devreye girer. Docker Compose, birden fazla Docker konteynerini i\u00e7eren uygulamalar\u0131 tan\u0131mlamak ve \u00e7al\u0131\u015ft\u0131rmak i\u00e7in bir ara\u00e7t\u0131r. Tek bir YAML dosyas\u0131 kullanarak, uygulaman\u0131z\u0131n t\u00fcm servislerini, a\u011flar\u0131n\u0131 ve depolama birimlerini yap\u0131land\u0131rabilirsiniz. Bu, karma\u015f\u0131k \u00e7oklu hizmet mimarilerini tek bir komutla kolayca aya\u011fa kald\u0131rman\u0131za olanak tan\u0131r. B\u00f6ylece, veri bilimi projeleriniz i\u00e7in gereken t\u00fcm bile\u015fenleri, t\u0131pk\u0131 bulutta oldu\u011fu gibi, tek bir orkestrasyon mekanizmas\u0131yla y\u00f6netebilirsiniz.<\/p>\n<p>\u00d6zetle, MLOps, bir modelin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc y\u00f6netmek i\u00e7in bir \u00e7er\u00e7eve sunarken, Docker ve Docker Compose bu \u00e7er\u00e7eveyi pratikte uygulaman\u0131za olanak tan\u0131yan g\u00fc\u00e7l\u00fc ara\u00e7lard\u0131r. Geli\u015ftirme ortam\u0131n\u0131z\u0131n ta\u015f\u0131nabilirli\u011fini, tekrarlanabilirli\u011fini ve \u00f6l\u00e7eklenebilirli\u011fini art\u0131rarak, veri bilimcilerin daha verimli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flarlar. \u00d6zellikle yerel makinenizde bulut benzeri bir geli\u015ftirme ve test ortam\u0131 kurmak istedi\u011finizde, bu \u00fc\u00e7l\u00fcn\u00fcn g\u00fcc\u00fcn\u00fc g\u00f6z ard\u0131 etmek b\u00fcy\u00fck bir hata olur.<\/p>\n<h2>Neden Lokal MLOps \u00c7\u00f6z\u00fcmlerine \u0130htiya\u00e7 Duyuyoruz? Bulutun \u00d6tesindeki Avantajlar Nelerdir?<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz veri bilimi projelerinde bulut bili\u015fim platformlar\u0131 (AWS, Google Cloud, Azure vb.) yayg\u0131n olarak kullan\u0131lsa da, bu platformlar\u0131n getirdi\u011fi baz\u0131 zorluklar ve s\u0131n\u0131rlamalar da mevcuttur. \u0130\u015fte tam da bu noktada, lokal MLOps \u00e7\u00f6z\u00fcmlerine duyulan ihtiya\u00e7 belirginle\u015fir. Bulutun sundu\u011fu kolayl\u0131klar\u0131n yan\u0131 s\u0131ra, lokal bir kurulumun getirdi\u011fi e\u015fsiz avantajlar, bir\u00e7ok veri bilimci ve kurulu\u015f i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p>\u00d6ncelikle, maliyet fakt\u00f6r\u00fc \u00e7o\u011fu zaman en b\u00fcy\u00fck itici g\u00fc\u00e7t\u00fcr. Bulut servisleri, \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli veri setleri ve yo\u011fun hesaplama gerektiren modellerle \u00e7al\u0131\u015f\u0131rken, \u00f6nemli maliyetler yaratabilir. Geli\u015ftirme a\u015famas\u0131nda bile, s\u00fcrekli a\u00e7\u0131p kapanan sanal makineler, depolama alanlar\u0131 ve \u00f6zel servisler, faturalar\u0131n h\u0131zla y\u00fckselmesine neden olabilir. Lokal bir kurulumda ise, mevcut donan\u0131m kaynaklar\u0131n\u0131z\u0131 kullanarak bu maliyetleri b\u00fcy\u00fck \u00f6l\u00e7\u00fcde d\u00fc\u015f\u00fcrebilirsiniz. \u00d6zellikle prototipleme ve deney a\u015famalar\u0131nda, bulut maliyetlerini d\u00fc\u015f\u00fcnmeden s\u0131n\u0131rs\u0131z deneme yapma \u00f6zg\u00fcrl\u00fc\u011f\u00fc, inovasyonu h\u0131zland\u0131r\u0131r.<\/p>\n<p>\u0130kinci olarak, veri gizlili\u011fi ve g\u00fcvenli\u011fi giderek daha hassas bir konu haline gelmektedir. \u00d6zellikle ki\u015fisel veriler veya hassas kurumsal bilgilerle \u00e7al\u0131\u015f\u0131rken, verilerin bulut ortam\u0131na ta\u015f\u0131nmas\u0131 yasal d\u00fczenlemeler (GDPR, KVKK gibi) veya \u015firket politikalar\u0131 nedeniyle m\u00fcmk\u00fcn olmayabilir veya ek g\u00fcvenlik \u00f6nlemleri gerektirebilir. Lokal bir MLOps ortam\u0131, verilerinizin \u015firket a\u011f\u0131n\u0131z i\u00e7inde kalmas\u0131n\u0131 sa\u011flayarak bu t\u00fcr endi\u015feleri ortadan kald\u0131r\u0131r. Bu, \u00f6zellikle sa\u011fl\u0131k, finans ve kamu sekt\u00f6r\u00fcndeki kurulu\u015flar i\u00e7in hayati bir avantajd\u0131r.<\/p>\n<p>\u00dc\u00e7\u00fcnc\u00fcs\u00fc, geli\u015ftirme h\u0131z\u0131 ve tekrarlanabilirlik. Lokal bir ortamda, ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00f6netmek ve farkl\u0131 servisleri entegre etmek, genellikle bulut platformlar\u0131n\u0131n karma\u015f\u0131k yap\u0131land\u0131rmalar\u0131ndan daha h\u0131zl\u0131d\u0131r. Docker Compose sayesinde, tek bir komutla t\u00fcm geli\u015ftirme ortam\u0131n\u0131z\u0131 aya\u011fa kald\u0131rabilir, h\u0131zl\u0131ca de\u011fi\u015fiklikler yap\u0131p test edebilir ve ayn\u0131 ortam\u0131 ekip \u00fcyeleri aras\u0131nda kolayca payla\u015fabilirsiniz. Bu, &#8220;benim makinemde \u00e7al\u0131\u015f\u0131yordu&#8221; sendromunu ortadan kald\u0131r\u0131r ve ekip i\u00e7inde tutarl\u0131 bir geli\u015ftirme deneyimi sa\u011flar. Ayr\u0131ca, internet ba\u011flant\u0131s\u0131na ba\u011f\u0131ml\u0131 olmadan \u00e7al\u0131\u015fabilme yetene\u011fi, saha \u00e7al\u0131\u015fmalar\u0131nda veya ba\u011flant\u0131n\u0131n zay\u0131f oldu\u011fu durumlarda b\u00fcy\u00fck bir esneklik sunar.<\/p>\n<p>D\u00f6rd\u00fcnc\u00fc bir avantaj, vendor lock-in&#8217;den (sat\u0131c\u0131ya ba\u011f\u0131ml\u0131l\u0131k) ka\u00e7\u0131nmakt\u0131r. Bulut platformlar\u0131 genellikle kendi ekosistemlerine \u00f6zg\u00fc servisler ve API&#8217;ler sunar. Bir kez bu ekosisteme entegre oldu\u011funuzda, ba\u015fka bir bulut sa\u011flay\u0131c\u0131ya veya on-premise \u00e7\u00f6z\u00fcmlere ge\u00e7i\u015f yapmak zaman al\u0131c\u0131 ve maliyetli olabilir. Lokal MLOps \u00e7\u00f6z\u00fcmleri, a\u00e7\u0131k kaynakl\u0131 ara\u00e7lar\u0131 (MLflow, Jupyter, PostgreSQL vb.) Docker konteynerlerinde kullanarak bu ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 azalt\u0131r. B\u00f6ylece, gelecekteki teknoloji de\u011fi\u015fikliklerine veya i\u015f ihtiya\u00e7lar\u0131na daha kolay adapte olabilirsiniz.<\/p>\n<p>Son olarak, performans ve d\u00fc\u015f\u00fck gecikme s\u00fcresi baz\u0131 senaryolarda kritik olabilir. B\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken veya ger\u00e7ek zamanl\u0131 \u00e7\u0131kar\u0131m (real-time inference) gerektiren uygulamalar geli\u015ftirirken, verilerin a\u011f \u00fczerinden buluta gidip gelmesi ek gecikmeler yaratabilir. Lokal bir kurulumda, verileriniz ve hesaplama kaynaklar\u0131n\u0131z fiziksel olarak birbirine yak\u0131n oldu\u011fu i\u00e7in, bu gecikmeler en aza indirilir ve daha y\u00fcksek performans elde edilebilir. T\u00fcm bu nedenler g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, lokal MLOps \u00e7\u00f6z\u00fcmleri, bulutun vazge\u00e7ilmez bir alternatifi olmaktan ziyade, onu tamamlayan g\u00fc\u00e7l\u00fc bir strateji olarak \u00f6ne \u00e7\u0131kmaktad\u0131r.<\/p>\n<div class=\"tip-box\">\n        Uzman \u0130pucu: Lokal MLOps ortam\u0131n\u0131z\u0131 optimize etmek i\u00e7in SSD s\u00fcr\u00fcc\u00fcler kullanmak ve yeterli RAM&#8217;e sahip olmak, \u00f6zellikle Docker Volume performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r. Bu, b\u00fcy\u00fck veri k\u00fcmeleriyle \u00e7al\u0131\u015f\u0131rken fark yarat\u0131r.\n    <\/div>\n<h2>Docker Compose ile Bulut Benzeri Bir Geli\u015ftirme Ortam\u0131 Nas\u0131l Kurulur? Ad\u0131m Ad\u0131m Rehber<\/h2>\n<p>Veri bilimi projelerinde, tekrarlanabilir, izole edilmi\u015f ve kolayca kurulabilen bir geli\u015ftirme ortam\u0131 hayati \u00f6nem ta\u015f\u0131r. Docker Compose, bu ihtiyac\u0131 kar\u015f\u0131lamak i\u00e7in m\u00fckemmel bir ara\u00e7t\u0131r. Gelin, bir veri bilimi projesi i\u00e7in temel bile\u015fenleri (JupyterLab, bir veritaban\u0131 ve MLflow) i\u00e7eren bulut benzeri bir lokal ortam\u0131 nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyelim.<\/p>\n<h3>Ad\u0131m 1: Docker&#8217;\u0131 Kurun ve Temel Yap\u0131y\u0131 Olu\u015fturun<\/h3>\n<p>\u00d6ncelikle, sisteminizde Docker Desktop&#8217;\u0131n (Windows\/macOS i\u00e7in) veya Docker Engine&#8217;in (Linux i\u00e7in) kurulu oldu\u011fundan emin olun. Kurulum talimatlar\u0131 i\u00e7in Docker&#8217;\u0131n resmi web sitesini ziyaret edebilirsiniz. Kurulumdan sonra, projeniz i\u00e7in yeni bir dizin olu\u015fturun ve i\u00e7ine girin:<\/p>\n<pre><code class=\"language-bash\">\nmkdir my_mlops_project\ncd my_mlops_project\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu dizinde, Docker Compose yap\u0131land\u0131rma dosyam\u0131z\u0131, yani <code class=\"language-yaml\">docker-compose.yml<\/code> dosyas\u0131n\u0131 olu\u015fturaca\u011f\u0131z. Bu dosya, t\u00fcm servislerimizi, a\u011flar\u0131m\u0131z\u0131 ve depolama birimlerimizi tan\u0131mlayaca\u011f\u0131m\u0131z merkezi yerdir.<\/p>\n<h3>Ad\u0131m 2: docker-compose.yml Dosyas\u0131n\u0131 Yap\u0131land\u0131r\u0131n<\/h3>\n<p>\u015eimdi, <code class=\"language-yaml\">docker-compose.yml<\/code> dosyas\u0131n\u0131 olu\u015fturup a\u015fa\u011f\u0131daki i\u00e7eri\u011fi ekleyelim. Bu \u00f6rnek, JupyterLab tabanl\u0131 bir geli\u015ftirme ortam\u0131, PostgreSQL veritaban\u0131 ve MLflow izleme sunucusu i\u00e7eriyor.<\/p>\n<pre><code class=\"language-yaml\">\nversion: '3.8'\n\nservices:\n  jupyter:\n    image: jupyter\/scipy-notebook:latest # Ya da kendi \u00f6zel Docker imaj\u0131n\u0131z\n    ports:\n      - \"8888:8888\" # Jupyter Lab eri\u015fimi\n    volumes:\n      - .\/notebooks:\/home\/jovyan\/work # Notebook'lar\u0131 kal\u0131c\u0131 depolama\n      - .\/data:\/home\/jovyan\/data # Veri dosyalar\u0131n\u0131 kal\u0131c\u0131 depolama\n    environment:\n      JUPYTER_ENABLE_LAB: \"yes\"\n      GRANT_SUDO: \"yes\"\n    user: root # Gerekirse dosya izinleri i\u00e7in\n    depends_on:\n      - postgres\n      - mlflow_server\n    networks:\n      - mlops_network\n\n  postgres:\n    image: postgres:13 # \u0130stedi\u011finiz PostgreSQL s\u00fcr\u00fcm\u00fc\n    environment:\n      POSTGRES_DB: mlops_db\n      POSTGRES_USER: user\n      POSTGRES_PASSWORD: password\n    volumes:\n      - postgres_data:\/var\/lib\/postgresql\/data # Veritaban\u0131 verileri i\u00e7in kal\u0131c\u0131 depolama\n    networks:\n      - mlops_network\n\n  mlflow_server:\n    image: ghcr.io\/mlflow\/mlflow:latest # MLflow'un resmi Docker imaj\u0131\n    environment:\n      MLFLOW_TRACKING_URI: http:\/\/mlflow_server:5000\n      MLFLOW_BACKEND_STORE_URI: postgresql:\/\/user:password@postgres:5432\/mlops_db\n      MLFLOW_DEFAULT_ARTIFACT_ROOT: s3:\/\/mlflow-artifacts # S3 gibi bir yer belirtilmeli, lokal i\u00e7in dosya sistemi kullan\u0131labilir\n    command: mlflow server --host 0.0.0.0 --port 5000 --backend-store-uri postgresql:\/\/user:password@postgres:5432\/mlops_db --artifacts-destination .\/mlruns\n    ports:\n      - \"5000:5000\" # MLflow UI eri\u015fimi\n    volumes:\n      - .\/mlruns:\/mlruns # MLflow artifact'lar\u0131 i\u00e7in kal\u0131c\u0131 depolama\n    depends_on:\n      - postgres\n    networks:\n      - mlops_network\n\nvolumes:\n  postgres_data: # PostgreSQL verileri i\u00e7in \u00f6zel bir volume\n\nnetworks:\n  mlops_network:\n    driver: bridge # T\u00fcm servisler i\u00e7in ortak bir a\u011f\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131land\u0131rma dosyas\u0131nda dikkat edilmesi gereken \u00f6nemli noktalar:<\/p>\n<ul>\n<li><code>version: '3.8'<\/code>: Docker Compose dosyas\u0131n\u0131n versiyonunu belirtir.<\/li>\n<li><code>services<\/code>: \u00c7al\u0131\u015ft\u0131r\u0131lacak konteynerleri tan\u0131mlar. Her servis bir uygulamay\u0131 veya bir bile\u015feni temsil eder.<\/li>\n<li><code>image<\/code>: Konteynerin temelini olu\u015fturan Docker imaj\u0131n\u0131 belirtir (\u00f6rn. <code class=\"language-shell\">jupyter\/scipy-notebook:latest<\/code>).<\/li>\n<li><code>ports<\/code>: Yerel makineniz ile konteyner aras\u0131ndaki port e\u015fle\u015ftirmelerini yapar (\u00f6rn. <code class=\"language-shell\">8888:8888<\/code>).<\/li>\n<li><code>volumes<\/code>: Verilerinizi konteyner yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda bile kaybetmemenizi sa\u011flayan kal\u0131c\u0131 depolama birimleridir. <code class=\"language-shell\">.\/notebooks:\/home\/jovyan\/work<\/code> ifadesi, yerel <code class=\"language-shell\">notebooks<\/code> dizininizi Jupyter konteynerindeki <code class=\"language-shell\">\/home\/jovyan\/work<\/code> diziniyle e\u015fle\u015ftirir. <code class=\"language-shell\">postgres_data<\/code> gibi isimlendirilmi\u015f bir volume ise, Docker taraf\u0131ndan y\u00f6netilen kal\u0131c\u0131 bir depolama alan\u0131d\u0131r.<\/li>\n<li><code>environment<\/code>: Konteyner i\u00e7inde ayarlanacak ortam de\u011fi\u015fkenlerini tan\u0131mlar.<\/li>\n<li><code>depends_on<\/code>: Servisler aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar\u0131 belirtir. \u00d6rne\u011fin, Jupyter'\u0131n ba\u015flamas\u0131 i\u00e7in PostgreSQL ve MLflow'un haz\u0131r olmas\u0131 gerekir.<\/li>\n<li><code>networks<\/code>: Konteynerlerin birbirleriyle ileti\u015fim kurmas\u0131n\u0131 sa\u011flayan a\u011flar\u0131 tan\u0131mlar. T\u00fcm servisler <code class=\"language-shell\">mlops_network<\/code> a\u011f\u0131na ba\u011fl\u0131 oldu\u011fu i\u00e7in birbirlerini isimleriyle \u00e7a\u011f\u0131rabilirler (\u00f6rn. <code class=\"language-shell\">postgres:5432<\/code>).<\/li>\n<li><code>command<\/code>: Konteyner ba\u015flat\u0131ld\u0131\u011f\u0131nda \u00e7al\u0131\u015facak komutu belirtir (MLflow sunucusu i\u00e7in).<\/li>\n<\/ul>\n<h3>Ad\u0131m 3: Dizinsel Yap\u0131y\u0131 Haz\u0131rlay\u0131n<\/h3>\n<p><code>docker-compose.yml<\/code> dosyas\u0131nda belirtilen kal\u0131c\u0131 depolama birimleri (volumes) i\u00e7in yerel dizinleri olu\u015fturman\u0131z gerekir:<\/p>\n<pre><code class=\"language-bash\">\nmkdir notebooks\nmkdir data\nmkdir mlruns\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu dizinler, Jupyter notebook'lar\u0131n\u0131z, veri setleriniz ve MLflow log'lar\u0131n\u0131z i\u00e7in kullan\u0131lacakt\u0131r.<\/p>\n<h3>Ad\u0131m 4: Ortam\u0131 Ba\u015flat\u0131n<\/h3>\n<p>T\u00fcm yap\u0131land\u0131rmalar\u0131 tamamlad\u0131ktan sonra, projenizin ana dizininde (<code>docker-compose.yml<\/code> dosyas\u0131n\u0131n bulundu\u011fu yer) a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rarak t\u00fcm servisleri ba\u015flatabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">\ndocker compose up -d\n    <\/pre>\n<p><\/code><\/p>\n<p><code>-d<\/code> parametresi, konteynerleri arka planda (detached mode) \u00e7al\u0131\u015ft\u0131rman\u0131z\u0131 sa\u011flar, b\u00f6ylece terminalinizi serbest b\u0131rakabilirsiniz. Konteyner imajlar\u0131 ilk \u00e7al\u0131\u015ft\u0131rmada indirilece\u011fi i\u00e7in bu i\u015flem biraz zaman alabilir.<\/p>\n<h3>Ad\u0131m 5: Servislere Eri\u015fim<\/h3>\n<p>Konteynerleriniz \u00e7al\u0131\u015fmaya ba\u015flad\u0131ktan sonra, a\u015fa\u011f\u0131daki adreslerden servislere eri\u015febilirsiniz:<\/p>\n<ul>\n<li><strong>JupyterLab:<\/strong> Taray\u0131c\u0131n\u0131zda <a href=\"http:\/\/localhost:8888\" target=\"_blank\">http:\/\/localhost:8888<\/a> adresine gidin. Terminalinizde g\u00f6r\u00fcnt\u00fclenen token ile giri\u015f yapman\u0131z istenebilir.<\/li>\n<li><strong>MLflow UI:<\/strong> Taray\u0131c\u0131n\u0131zda <a href=\"http:\/\/localhost:5000\" target=\"_blank\">http:\/\/localhost:5000<\/a> adresine gidin. Burada MLflow denemelerinizi, modellerinizi ve kay\u0131tlar\u0131n\u0131z\u0131 g\u00f6rebilirsiniz.<\/li>\n<li><strong>PostgreSQL:<\/strong> Veritaban\u0131na do\u011frudan taray\u0131c\u0131 \u00fczerinden eri\u015fim yoktur, ancak Jupyter'dan veya ba\u015fka bir PostgreSQL istemcisinden <code class=\"language-shell\">localhost:5432<\/code> \u00fczerinden ba\u011flanabilirsiniz (kullan\u0131c\u0131: <code class=\"language-shell\">user<\/code>, \u015fifre: <code class=\"language-shell\">password<\/code>, veritaban\u0131: <code class=\"language-shell\">mlops_db<\/code>).<\/li>\n<\/ul>\n<h3>Ad\u0131m 6: Ortam\u0131 Durdurun ve Temizleyin<\/h3>\n<p>\u0130\u015finiz bitti\u011finde, t\u00fcm servisleri durdurmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">\ndocker compose down\n    <\/pre>\n<p><\/code><\/p>\n<p>E\u011fer t\u00fcm konteynerleri, a\u011flar\u0131 ve isimlendirilmi\u015f volume'leri (bu \u00f6rnekte <code class=\"language-shell\">postgres_data<\/code>) tamamen kald\u0131rmak isterseniz:<\/p>\n<pre><code class=\"language-bash\">\ndocker compose down --volumes\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu ad\u0131mlar\u0131 takip ederek, veri bilimi projeleriniz i\u00e7in bulut benzeri, izole ve tekrarlanabilir bir lokal geli\u015ftirme ortam\u0131n\u0131 kolayca kurabilir ve y\u00f6netebilirsiniz. Bu sayede, farkl\u0131 projeler aras\u0131nda ge\u00e7i\u015f yaparken ba\u011f\u0131ml\u0131l\u0131k \u00e7ak\u0131\u015fmalar\u0131yla u\u011fra\u015fmak zorunda kalmaz ve geli\u015ftirme s\u00fcre\u00e7lerinizi standardize edersiniz.<\/p>\n<h2>U\u00e7tan Uca Bir ML Projesi: Veri Haz\u0131rl\u0131\u011f\u0131ndan Model Da\u011f\u0131t\u0131m\u0131na Yerel Ak\u0131\u015f Nas\u0131l Olu\u015fturulur?<\/h2>\n<p>Lokal MLOps ortam\u0131m\u0131z\u0131 Docker Compose ile kurduktan sonra, bu ortamda bir makine \u00f6\u011frenimi projesinin t\u00fcm ad\u0131mlar\u0131n\u0131 nas\u0131l ger\u00e7ekle\u015ftirece\u011fimizi ke\u015ffedelim. Bu yakla\u015f\u0131m, ger\u00e7ek bir \u00fcretim ortam\u0131n\u0131n basitle\u015ftirilmi\u015f bir modelini sunarak, veri bilimcilerin ve ML m\u00fchendislerinin i\u015f ak\u0131\u015flar\u0131n\u0131 daha verimli hale getirmelerine olanak tan\u0131r. Amac\u0131m\u0131z, veri al\u0131m\u0131ndan modelin da\u011f\u0131t\u0131m\u0131na kadar her a\u015famay\u0131 lokal konteynerlerimiz i\u00e7inde y\u00f6netmek.<\/p>\n<h3>1. Veri Haz\u0131rl\u0131\u011f\u0131 ve Ke\u015fifsel Veri Analizi (EDA)<\/h3>\n<p>\u0130lk ad\u0131m, projenin veri ihtiyac\u0131n\u0131 kar\u015f\u0131lamak ve veriyi analiz etmektir. <code class=\"language-shell\">my_mlops_project\/data<\/code> dizininize bir CSV dosyas\u0131 (\u00f6rne\u011fin <code class=\"language-shell\">iris.csv<\/code>) koydu\u011funuzu varsayal\u0131m. JupyterLab konteyneriniz bu dosyaya <code class=\"language-shell\">\/home\/jovyan\/data\/iris.csv<\/code> yolundan eri\u015febilir. JupyterLab ortam\u0131nda bir notebook a\u00e7arak, <code class=\"language-shell\">pandas<\/code> gibi k\u00fct\u00fcphanelerle veriyi y\u00fckleyebilir, temizleyebilir ve ke\u015ffedebilirsiniz.<\/p>\n<pre><code class=\"language-python\">\nimport pandas as pd\n\n# Data klas\u00f6r\u00fcndeki veriye eri\u015fim\ndf = pd.read_csv('\/home\/jovyan\/data\/iris.csv')\nprint(df.head())\nprint(df.info())\n# Veri temizleme ve \u00f6n i\u015fleme ad\u0131mlar\u0131 burada ger\u00e7ekle\u015ftirilir\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu a\u015famada veriler \u00fczerinde yap\u0131lan de\u011fi\u015fiklikler, <code class=\"language-shell\">data<\/code> klas\u00f6r\u00fcn\u00fcze kaydedilerek kal\u0131c\u0131 hale getirilebilir. \u00d6rne\u011fin, temizlenmi\u015f veriyi <code class=\"language-shell\">\/home\/jovyan\/data\/cleaned_iris.csv<\/code> olarak kaydedebilirsiniz.<\/p>\n<h3>2. Model E\u011fitimi ve Deneme Takibi (MLflow ile)<\/h3>\n<p>Veri haz\u0131rl\u0131\u011f\u0131 tamamland\u0131ktan sonra, modeli e\u011fitmeye ge\u00e7ebiliriz. Burada, MLflow'u devreye sokarak denemelerimizi takip edece\u011fiz. Jupyter notebook'unuz i\u00e7inde MLflow'u nas\u0131l kullanaca\u011f\u0131n\u0131z\u0131 g\u00f6steren bir \u00f6rnek:<\/p>\n<pre><code class=\"language-python\">\nimport mlflow\nimport mlflow.sklearn\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import accuracy_score\n\n# MLflow izleme sunucusunun adresi (docker-compose'daki servis ad\u0131)\nmlflow.set_tracking_uri(\"http:\/\/mlflow_server:5000\")\nmlflow.set_experiment(\"Iris_Classification_Experiment\")\n\nwith mlflow.start_run():\n    # Veriyi y\u00fckle ve haz\u0131rla\n    df = pd.read_csv('\/home\/jovyan\/data\/cleaned_iris.csv') # Temizlenmi\u015f veri\n    X = df.drop('species', axis=1)\n    y = df['species']\n    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n\n    # Modeli e\u011fit\n    n_estimators = 100\n    max_depth = 5\n    model = RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth, random_state=42)\n    model.fit(X_train, y_train)\n\n    # Tahmin yap ve performans\u0131 de\u011ferlendir\n    y_pred = model.predict(X_test)\n    accuracy = accuracy_score(y_test, y_pred)\n\n    # MLflow ile parametreleri ve metrikleri logla\n    mlflow.log_param(\"n_estimators\", n_estimators)\n    mlflow.log_param(\"max_depth\", max_depth)\n    mlflow.log_metric(\"accuracy\", accuracy)\n\n    # Modeli kaydet\n    mlflow.sklearn.log_model(model, \"random_forest_model\")\n\n    print(f\"Model Accuracy: {accuracy}\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu kod blo\u011fu \u00e7al\u0131\u015ft\u0131ktan sonra, MLflow UI'a (<a href=\"http:\/\/localhost:5000\" target=\"_blank\">http:\/\/localhost:5000<\/a>) gitti\u011finizde, yeni bir denemenin kaydedildi\u011fini, parametreleri, metrikleri ve e\u011fitilmi\u015f modelin artifact olarak depoland\u0131\u011f\u0131n\u0131 g\u00f6receksiniz. Model, MLflow'un artifact deposuna (bu \u00f6rnekte <code class=\"language-shell\">.\/mlruns<\/code> dizinine) kaydedilir.<\/p>\n<h3>3. Model S\u00fcr\u00fcmleme ve Kay\u0131t<\/h3>\n<p>MLflow'un model kay\u0131t (Model Registry) \u00f6zelli\u011fi ile en iyi modeli s\u00fcr\u00fcmleyebilir ve bir sonraki a\u015fama olan da\u011f\u0131t\u0131ma haz\u0131rlayabilirsiniz. Modelinizi e\u011fittikten ve MLflow'a kaydettikten sonra, MLflow UI \u00fczerinden veya programatik olarak modelinizi register edebilirsiniz:<\/p>\n<pre><code class=\"language-python\">\n# \u00d6nceki \u00e7al\u0131\u015ft\u0131rman\u0131n run_id'sini alman\u0131z veya MLflow UI'dan kopyalaman\u0131z gerekir\n# run_id = \"...\" # MLflow UI'dan al\u0131n\n# model_uri = f\"runs:\/{run_id}\/random_forest_model\"\n\n# mlflow.register_model(model_uri=model_uri, name=\"IrisClassifier\")\n# Ya da MLflow UI \u00fczerinden manuel kay\u0131t\n    <\/pre>\n<p><\/code><\/p>\n<p>Modelinizi bir isimle kaydettikten sonra, farkl\u0131 versiyonlar\u0131n\u0131 y\u00f6netebilir, sahne (Staging, Production) atamalar\u0131 yapabilirsiniz.<\/p>\n<h3>4. Model Da\u011f\u0131t\u0131m\u0131 (Basit Bir Flask Uygulamas\u0131 ile Sim\u00fclasyon)<\/h3>\n<p>Model da\u011f\u0131t\u0131m\u0131, lokal ortamda genelde bir web servisi olarak sim\u00fcle edilir. E\u011fitti\u011fimiz modeli y\u00fckleyecek ve tahminler yapacak basit bir Flask API olu\u015fturabiliriz. Bu Flask uygulamas\u0131n\u0131 da Docker Compose'a yeni bir servis olarak ekleyebiliriz.<\/p>\n<p>\u00d6ncelikle, projenizin ana dizininde <code class=\"language-shell\">model_serving<\/code> ad\u0131nda bir dizin olu\u015fturun ve i\u00e7ine <code class=\"language-shell\">app.py<\/code> ile <code class=\"language-shell\">Dockerfile<\/code> dosyalar\u0131n\u0131 ekleyin:<\/p>\n<p><code>model_serving\/app.py<\/code>:<\/p>\n<pre><code class=\"language-python\">\nimport mlflow\nimport pandas as pd\nfrom flask import Flask, request, jsonify\n\n# MLflow izleme sunucusunun adresi\nmlflow.set_tracking_uri(\"http:\/\/mlflow_server:5000\")\n\n# Kay\u0131tl\u0131 modeli y\u00fckle\n# E\u011fer modeliniz MLflow Registry'de ise, ad\u0131yla y\u00fckleyebilirsiniz:\n# model = mlflow.pyfunc.load_model(\"models:\/IrisClassifier\/Production\")\n# E\u011fer sadece artifact olarak kaydedildiyse, artifact URI'si ile:\nmodel = mlflow.pyfunc.load_model(\".\/mlruns\/0\/<run_id>\/artifacts\/random_forest_model\") # run_id'yi kendi run_id'nizle de\u011fi\u015ftirin\n\napp = Flask(__name__)\n\n@app.route('\/predict', methods=['POST'])\ndef predict():\n    data = request.get_json(force=True)\n    df_input = pd.DataFrame(data)\n    predictions = model.predict(df_input).tolist()\n    return jsonify(predictions)\n\nif __name__ == '__main__':\n    app.run(host='0.0.0.0', port=5001)\n    <\/pre>\n<p><\/code><\/p>\n<p><code>model_serving\/Dockerfile<\/code>:<\/p>\n<pre><code class=\"language-dockerfile\">\nFROM python:3.9-slim-buster\nWORKDIR \/app\nCOPY requirements.txt .\nRUN pip install -r requirements.txt\nCOPY app.py .\nEXPOSE 5001\nCMD [\"python\", \"app.py\"]\n    <\/pre>\n<p><\/code><\/p>\n<p><code>model_serving\/requirements.txt<\/code>:<\/p>\n<pre><code class=\"language-text\">\nflask\nmlflow\nscikit-learn\npandas\n    <\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi <code class=\"language-yaml\">docker-compose.yml<\/code> dosyan\u0131za yeni bir servis ekleyin:<\/p>\n<pre><code class=\"language-yaml\">\n  model_api:\n    build: .\/model_serving # Dockerfile'\u0131 buradan in\u015fa et\n    ports:\n      - \"5001:5001\" # API eri\u015fimi\n    volumes:\n      - .\/mlruns:\/app\/mlruns # MLflow artifact'lar\u0131na eri\u015fim i\u00e7in\n    depends_on:\n      - mlflow_server\n    networks:\n      - mlops_network\n    <\/pre>\n<p><\/code><\/p>\n<p><code>docker compose up -d --build<\/code> komutunu \u00e7al\u0131\u015ft\u0131rarak yeni servisi in\u015fa edin ve ba\u015flat\u0131n. Art\u0131k API'nize <code class=\"language-shell\">localhost:5001\/predict<\/code> adresinden eri\u015febilirsiniz.<\/p>\n<pre><code class=\"language-bash\">\ncurl -X POST -H \"Content-Type: application\/json\" \\\n     -d '[{\"sepal length (cm)\": 5.1, \"sepal width (cm)\": 3.5, \"petal length (cm)\": 1.4, \"petal width (cm)\": 0.2}]' \\\n     http:\/\/localhost:5001\/predict\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu ak\u0131\u015f, veri bilimcinin bir modeli lokal olarak geli\u015ftirip test etmesine, s\u00fcr\u00fcmlemesine ve da\u011f\u0131t\u0131m\u0131n\u0131 sim\u00fcle etmesine olanak tan\u0131r. Ger\u00e7ek bir CI\/CD boru hatt\u0131nda, bu ad\u0131mlar otomatikle\u015ftirilir ve genellikle bulut ortam\u0131na veya \u00fcretim sunucular\u0131na da\u011f\u0131t\u0131l\u0131r. Ancak lokal ortamda bu sim\u00fclasyon, geli\u015ftirme d\u00f6ng\u00fcs\u00fcn\u00fc inan\u0131lmaz derecede h\u0131zland\u0131r\u0131r ve hatalar\u0131 erken a\u015famada yakalamaya yard\u0131mc\u0131 olur.<\/p>\n<h2>Model S\u00fcr\u00fcmleme ve \u0130zleme: MLflow ile Verimlili\u011fi Art\u0131rma Yollar\u0131<\/h2>\n<p>Makine \u00f6\u011frenimi projelerinin karma\u015f\u0131kl\u0131\u011f\u0131 artt\u0131k\u00e7a, modelleri, denemeleri, veriyi ve kodu izlemek ve s\u00fcr\u00fcmlemek hayati hale gelir. Bu durum, \u00f6zellikle birden fazla veri bilimcinin ayn\u0131 proje \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 veya zamanla model performans\u0131n\u0131n takip edilmesi gerekti\u011fi senaryolarda \u00f6nemlidir. MLflow, bu zorluklar\u0131 a\u015fmak i\u00e7in tasarlanm\u0131\u015f a\u00e7\u0131k kaynakl\u0131 bir platformdur ve Docker Compose ile entegre edildi\u011finde, lokal ortam\u0131n\u0131zda g\u00fc\u00e7l\u00fc bir MLOps yetene\u011fi sunar.<\/p>\n<h3>MLflow Tracking ile Deneme Takibi<\/h3>\n<p>MLflow Tracking bile\u015feni, makine \u00f6\u011frenimi denemelerini loglamak ve kar\u015f\u0131la\u015ft\u0131rmak i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bu, bir veri bilimcinin farkl\u0131 hiperparametre setleri, veri \u00f6ni\u015fleme teknikleri veya model mimarileri ile yapt\u0131\u011f\u0131 denemeleri sistematik bir \u015fekilde kaydetmesini sa\u011flar. MLflow sunucumuz Docker Compose ile \u00e7al\u0131\u015f\u0131rken, JupyterLab ortam\u0131ndan yapt\u0131\u011f\u0131m\u0131z her denemeyi bu sunucuya y\u00f6nlendirebiliriz.<\/p>\n<pre><code class=\"language-python\">\nimport mlflow\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn.datasets import load_iris\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import accuracy_score\n\n# MLflow izleme sunucusu URL'sini ayarlay\u0131n\nmlflow.set_tracking_uri(\"http:\/\/mlflow_server:5000\") # docker-compose servis ad\u0131 ve portu\nmlflow.set_experiment(\"Model_Performance_Tuning\")\n\niris = load_iris()\nX, y = iris.data, iris.target\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n\n# Farkl\u0131 parametrelerle denemeler yapal\u0131m\nfor C_param in [0.1, 1.0, 10.0]:\n    with mlflow.start_run():\n        model = LogisticRegression(C=C_param, solver='liblinear')\n        model.fit(X_train, y_train)\n        y_pred = model.predict(X_test)\n        accuracy = accuracy_score(y_test, y_pred)\n\n        mlflow.log_param(\"C_parameter\", C_param)\n        mlflow.log_metric(\"accuracy\", accuracy)\n        mlflow.sklearn.log_model(model, \"logistic_regression_model\")\n        print(f\"C={C_param}, Accuracy={accuracy}\")\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu kod blo\u011fu, farkl\u0131 <code class=\"language-shell\">C<\/code> parametreleriyle <code class=\"language-shell\">LogisticRegression<\/code> modelini e\u011fitir ve her denemenin parametrelerini, metriklerini ve e\u011fitilmi\u015f modelini MLflow sunucusuna kaydeder. <a href=\"http:\/\/localhost:5000\" target=\"_blank\">http:\/\/localhost:5000<\/a> adresindeki MLflow UI'da, bu denemeleri kolayca kar\u015f\u0131la\u015ft\u0131rabilir, en iyi performans\u0131 g\u00f6steren modeli bulabilirsiniz. Bu, geli\u015ftirme a\u015famas\u0131nda \"ne i\u015fe yarad\u0131, ne yaramad\u0131\" sorusuna h\u0131zl\u0131 yan\u0131tlar alman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>MLflow Model Registry ile Model S\u00fcr\u00fcmleme<\/h3>\n<p>MLflow Model Registry, MLflow Tracking taraf\u0131ndan loglanan makine \u00f6\u011frenimi modellerinin tam ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc y\u00f6netmenizi sa\u011flar. Bu, modelleri s\u00fcr\u00fcmlemek, a\u00e7\u0131klama eklemek, sahne ge\u00e7i\u015fleri yapmak (\u00f6rn. Staging'den Production'a) ve merkezi bir depoda kay\u0131t alt\u0131na almak anlam\u0131na gelir. Docker Compose ortam\u0131m\u0131zda, MLflow sunucusunun PostgreSQL veritaban\u0131n\u0131 arka u\u00e7 deposu olarak kullanmas\u0131 sayesinde, model kay\u0131tlar\u0131 da kal\u0131c\u0131 olarak saklan\u0131r.<\/p>\n<pre><code class=\"language-python\">\n# En iyi performans g\u00f6steren bir run_id'yi se\u00e7ti\u011finizi varsayal\u0131m\n# run_id = \"your_best_run_id_from_mlflow_ui\"\n# model_uri = f\"runs:\/{run_id}\/logistic_regression_model\"\n\n# E\u011fer modeli ilk kez kaydediyorsan\u0131z\n# model_version = mlflow.register_model(model_uri=model_uri, name=\"IrisLogisticRegression\")\n# print(f\"Model '{model_version.name}' versiyon {model_version.version} kaydedildi.\")\n\n# Mevcut bir modeli bir sahneye ge\u00e7irmek i\u00e7in (\u00f6rne\u011fin, Staging'e)\n# client = mlflow.tracking.MlflowClient()\n# client.transition_model_version_stage(\n#     name=\"IrisLogisticRegression\",\n#     version=1, # modelin versiyon numaras\u0131\n#     stage=\"Staging\"\n# )\n    <\/pre>\n<p><\/code><\/p>\n<p>MLflow UI \u00fczerinden de modelleri kay\u0131t defterine ekleyebilir ve ya\u015fam d\u00f6ng\u00fclerini y\u00f6netebilirsiniz. Bu merkezi model deposu, hangi modelin hangi versiyonunun nerede ve ne ama\u00e7la kullan\u0131ld\u0131\u011f\u0131n\u0131n takibini kolayla\u015ft\u0131r\u0131r. \u00d6zellikle model da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinde, \"en son \u00fcretim modeli nedir?\" sorusunun yan\u0131t\u0131n\u0131 h\u0131zl\u0131ca alman\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Model \u0130zleme ve Geri Bildirim D\u00f6ng\u00fcleri<\/h3>\n<p>Model da\u011f\u0131t\u0131ld\u0131ktan sonra performans\u0131 izlemek kritik \u00f6neme sahiptir. MLflow Tracking, yeni veri setleri \u00fczerinde modelin nas\u0131l performans g\u00f6sterdi\u011fini s\u00fcrekli olarak loglaman\u0131za olanak tan\u0131r. \u00d6rne\u011fin, bir \u00fcretim ortam\u0131nda (veya lokal sim\u00fclasyonunuzda) modelinizden elde edilen tahminleri ve ger\u00e7ek sonu\u00e7lar\u0131 MLflow'a geri loglayarak modelin drift edip etmedi\u011fini g\u00f6zlemleyebilirsiniz. Bu, modelin zamanla bozulup bozulmad\u0131\u011f\u0131n\u0131 anlaman\u0131za ve gerekti\u011finde yeniden e\u011fitim kararlar\u0131 alman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<p>MLflow'un bu yetenekleri, lokal MLOps ortam\u0131n\u0131zda ger\u00e7ek bir MLOps k\u00fclt\u00fcr\u00fcn\u00fcn temelini atar. Veri bilimciler, denemelerini \u015feffaf bir \u015fekilde y\u00f6netebilir, en iyi modellerini kolayca s\u00fcr\u00fcmleyebilir ve modelin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc u\u00e7tan uca izleyebilirler. Bu da, daha g\u00fcvenilir, tutarl\u0131 ve y\u00f6netilebilir makine \u00f6\u011frenimi \u00e7\u00f6z\u00fcmlerine yol a\u00e7ar.<\/p>\n<h2>Performans ve G\u00fcvenlik \u0130\u00e7in \u0130leri D\u00fczey \u0130pu\u00e7lar\u0131: Lokal Ortam\u0131 Optimize Etme<\/h2>\n<p>Docker Compose ile lokal MLOps ortam\u0131 kurmak harika bir ba\u015flang\u0131\u00e7 olsa da, daha verimli ve g\u00fcvenli hale getirmek i\u00e7in baz\u0131 ileri d\u00fczey ipu\u00e7lar\u0131 ve en iyi uygulamalar mevcuttur. Bu optimizasyonlar, hem geli\u015ftirme s\u00fcrecinizi h\u0131zland\u0131r\u0131r hem de olas\u0131 g\u00fcvenlik zafiyetlerini minimize eder.<\/p>\n<h3>1. Kaynak S\u0131n\u0131rlamalar\u0131 ile Performans\u0131 Y\u00f6netme<\/h3>\n<p>Docker konteynerleri varsay\u0131lan olarak ana makinenin t\u00fcm kaynaklar\u0131na eri\u015febilir. Ancak, birden fazla servis \u00e7al\u0131\u015f\u0131rken, bir servisin di\u011ferlerini olumsuz etkilemesini \u00f6nlemek i\u00e7in kaynak s\u0131n\u0131rlamalar\u0131 (CPU, bellek) tan\u0131mlamak \u00f6nemlidir. Bu, \u00f6zellikle s\u0131n\u0131rl\u0131 kaynaklara sahip bir geli\u015ftirme makinesinde \u00e7al\u0131\u015f\u0131yorsan\u0131z kritik bir performans ipucudur.<\/p>\n<pre><code class=\"language-yaml\">\nservices:\n  jupyter:\n    # ... di\u011fer ayarlar ...\n    deploy:\n      resources:\n        limits:\n          cpus: '2.0' # 2 CPU \u00e7ekirde\u011fi ile s\u0131n\u0131rla\n          memory: 4G # 4 GB RAM ile s\u0131n\u0131rla\n        reservations:\n          cpus: '0.5' # Minimum 0.5 CPU \u00e7ekirde\u011fi garanti et\n          memory: 1G # Minimum 1 GB RAM garanti et\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131land\u0131rma, Jupyter servisinin kaynak t\u00fcketimini kontrol alt\u0131nda tutarak, di\u011fer servislerin de d\u00fczg\u00fcn \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar. Bu sayede, ayn\u0131 anda hem model e\u011fitimi yapabilir hem de MLflow UI'\u0131 sorunsuz bir \u015fekilde kullanabilirsiniz.<\/p>\n<h3>2. Veri Kal\u0131c\u0131l\u0131\u011f\u0131 ve Performans i\u00e7in Volume Y\u00f6netimi<\/h3>\n<p>Docker Volume'ler, verilerinizi konteynerden ba\u011f\u0131ms\u0131z olarak saklaman\u0131z\u0131 sa\u011flar. \u0130ki ana volume t\u00fcr\u00fc vard\u0131r: bind mount'lar (yerel dosya sisteminizdeki bir dizini do\u011frudan konteynere ba\u011flar) ve named volume'ler (Docker taraf\u0131ndan y\u00f6netilir). Genellikle, kod ve konfig\u00fcrasyon dosyalar\u0131 i\u00e7in bind mount'lar, veritaban\u0131 verileri veya b\u00fcy\u00fck artifact'ler i\u00e7in named volume'ler tercih edilir.<\/p>\n<ul>\n<li><strong>Bind Mounts:<\/strong> Geli\u015ftirme s\u0131ras\u0131nda kodunuzu an\u0131nda konteyner i\u00e7inde g\u00fcncellemek i\u00e7in idealdir (\u00f6rne\u011fin, <code class=\"language-shell\">.\/notebooks:\/home\/jovyan\/work<\/code>). Ancak performans a\u00e7\u0131s\u0131ndan, \u00f6zellikle b\u00fcy\u00fck dosya operasyonlar\u0131nda, named volume'lerden daha yava\u015f olabilirler.<\/li>\n<li><strong>Named Volumes:<\/strong> Daha iyi I\/O performans\u0131 sunarlar ve Docker taraf\u0131ndan daha iyi y\u00f6netilirler. Veritaban\u0131 verileri (<code class=\"language-shell\">postgres_data:\/var\/lib\/postgresql\/data<\/code>) veya MLflow artifact'leri i\u00e7in (<code class=\"language-shell\">mlruns_data:\/mlruns<\/code>) kullan\u0131lmas\u0131 \u00f6nerilir. Kendi <code class=\"language-shell\">.\/mlruns<\/code> klas\u00f6r\u00fcn\u00fcz\u00fc kullanmak yerine, <code class=\"language-shell\">mlruns_data<\/code> ad\u0131nda bir volume tan\u0131mlayabilir ve bu volume'\u00fc <code class=\"language-shell\">mlflow_server<\/code> servisine ba\u011flayabilirsiniz. Bu, verilerinizin ana sistemden ba\u011f\u0131ms\u0131z olarak daha optimize bir \u015fekilde depolanmas\u0131n\u0131 sa\u011flar.<\/li>\n<\/ul>\n<pre><code class=\"language-yaml\">\nvolumes:\n  postgres_data:\n  mlruns_data: # Yeni named volume\n    driver: local # Varsay\u0131lan s\u00fcr\u00fcc\u00fc, ancak farkl\u0131 s\u00fcr\u00fcc\u00fcler de kullan\u0131labilir\n\nservices:\n  mlflow_server:\n    # ...\n    volumes:\n      - mlruns_data:\/mlruns # Named volume kullan\n    # ...\n    <\/pre>\n<p><\/code><\/p>\n<h3>3. G\u00fcvenlik \u0130pu\u00e7lar\u0131: Ortam De\u011fi\u015fkenleri ve A\u011f \u0130zolasyonu<\/h3>\n<ul>\n<li><strong>Gizli Bilgileri Y\u00f6netme (.env Dosyas\u0131):<\/strong> Veritaban\u0131 \u015fifreleri veya API anahtarlar\u0131 gibi hassas bilgileri <code class=\"language-yaml\">docker-compose.yml<\/code> dosyan\u0131zda do\u011frudan tutmak yerine, bir <code class=\"language-shell\">.env<\/code> dosyas\u0131 kullan\u0131n. Docker Compose bu dosyay\u0131 otomatik olarak y\u00fckler.\n<p><code>.env<\/code> dosyas\u0131:<\/p>\n<pre><code class=\"language-dotenv\">\nPOSTGRES_USER=myuser\nPOSTGRES_PASSWORD=mysupersecretpassword\nMLFLOW_DB=mlops_db\n            <\/pre>\n<p><\/code><\/p>\n<p><code>docker-compose.yml<\/code> dosyas\u0131nda kullan\u0131m:<\/p>\n<pre><code class=\"language-yaml\">\n  postgres:\n    environment:\n      POSTGRES_DB: ${MLFLOW_DB}\n      POSTGRES_USER: ${POSTGRES_USER}\n      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}\n            <\/pre>\n<p><\/code>\n        <\/li>\n<li><strong>A\u011f \u0130zolasyonu:<\/strong> Docker Compose ile tan\u0131mlanan servisler varsay\u0131lan olarak ayn\u0131 a\u011fda olsalar da, yaln\u0131zca gerekli portlar\u0131 d\u0131\u015far\u0131ya a\u00e7t\u0131\u011f\u0131n\u0131zdan emin olun. \u00d6rne\u011fin, PostgreSQL servisini do\u011frudan ana makinenize a\u00e7mak yerine, sadece Jupyter ve MLflow gibi i\u00e7 servislerin eri\u015fimine izin verin (e\u011fer d\u0131\u015far\u0131dan eri\u015fim gerekmiyorsa <code class=\"language-shell\">ports<\/code> k\u0131sm\u0131n\u0131 <code class=\"language-shell\">postgres<\/code> servisinden kald\u0131r\u0131n).<\/li>\n<li><strong>Minimum Yetki Prensibi:<\/strong> Konteyner i\u00e7indeki uygulamalar\u0131n gere\u011finden fazla yetkiye sahip olmamas\u0131n\u0131 sa\u011flay\u0131n. \u00d6rne\u011fin, Jupyter konteynerinde <code class=\"language-shell\">user: root<\/code> kullanmak yerine, m\u00fcmk\u00fcnse daha k\u0131s\u0131tl\u0131 bir kullan\u0131c\u0131 ile \u00e7al\u0131\u015f\u0131n.<\/li>\n<\/ul>\n<h3>4. \u00d6zelle\u015ftirilmi\u015f Docker \u0130majlar\u0131 ve Dockerfile Optimizasyonu<\/h3>\n<p>Varsay\u0131lan imajlar yerine, projenizin \u00f6zel ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 i\u00e7eren kendi Docker imajlar\u0131n\u0131z\u0131 olu\u015fturmak, kontrol\u00fc art\u0131r\u0131r ve ba\u015flang\u0131\u00e7 s\u00fcrelerini h\u0131zland\u0131r\u0131r. <code class=\"language-shell\">Dockerfile<\/code>'\u0131n\u0131z\u0131 optimize ederken:<\/p>\n<ul>\n<li>Katmanlar\u0131 (layers) ak\u0131ll\u0131ca kullan\u0131n: S\u0131k de\u011fi\u015fmeyen ba\u011f\u0131ml\u0131l\u0131klar\u0131 daha erken katmanlara ekleyin.<\/li>\n<li>Minimal imajlar kullan\u0131n: <code class=\"language-shell\">alpine<\/code> veya <code class=\"language-shell\">slim<\/code> tabanl\u0131 imajlar, imaj boyutunu k\u00fc\u00e7\u00fclt\u00fcr.<\/li>\n<li>Gereksiz dosyalar\u0131 kald\u0131rmak i\u00e7in <code class=\"language-shell\">.dockerignore<\/code> kullan\u0131n.<\/li>\n<li><code class=\"language-shell\">RUN<\/code> komutlar\u0131n\u0131 zincirleyin (<code class=\"language-shell\">RUN apt-get update && apt-get install -y some-package<\/code>), bu da katman say\u0131s\u0131n\u0131 azalt\u0131r.<\/li>\n<\/ul>\n<pre><code class=\"language-dockerfile\">\n# \u00d6rnek Dockerfile for Jupyter\nFROM jupyter\/scipy-notebook:latest\n\nUSER root # Gerekirse ge\u00e7ici olarak root yetkisi al\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    git \\\n    build-essential \\\n    && rm -rf \/var\/lib\/apt\/lists\/* # Gereksiz \u00f6nbelle\u011fi temizle\n\nUSER $NB_UID # Geri kullan\u0131c\u0131ya d\u00f6n\n\nCOPY requirements.txt \/home\/jovyan\/requirements.txt\nRUN pip install --no-cache-dir -r \/home\/jovyan\/requirements.txt\n\n# Opsiyonel: Kendi kodunuzu kopyalay\u0131n\nCOPY .\/src \/home\/jovyan\/work\/src\n\nWORKDIR \/home\/jovyan\/work\n    <\/pre>\n<p><\/code><\/p>\n<p>Bu ipu\u00e7lar\u0131, lokal MLOps ortam\u0131n\u0131z\u0131 hem daha dayan\u0131kl\u0131, hem daha h\u0131zl\u0131 hem de daha g\u00fcvenli hale getirerek, veri bilimi projelerinizdeki verimlili\u011fi art\u0131rman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Unutmay\u0131n, iyi bir geli\u015ftirme ortam\u0131, ba\u015far\u0131l\u0131 bir projenin temelidir.<\/p>\n<h2>Sonu\u00e7: Lokal MLOps Gelece\u011fi ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu makalede, veri bilimi ve makine \u00f6\u011frenimi projeleri i\u00e7in \"bulut benzeri\" bir lokal geli\u015ftirme ve MLOps ortam\u0131n\u0131n Docker Compose ile nas\u0131l kurulabilece\u011fini ve y\u00f6netilebilece\u011fini ayr\u0131nt\u0131l\u0131 bir \u015fekilde ele ald\u0131k. G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, Docker Compose sadece konteynerleri bir araya getirmekle kalm\u0131yor, ayn\u0131 zamanda maliyet etkinli\u011fi, veri gizlili\u011fi, y\u00fcksek geli\u015ftirme h\u0131z\u0131 ve vendor lock-in'den ka\u00e7\u0131nma gibi \u00f6nemli avantajlar sunarak bulut \u00e7\u00f6z\u00fcmlerine g\u00fc\u00e7l\u00fc bir alternatif olu\u015fturuyor.<\/p>\n<p>Bir ML projesinin ba\u015flang\u0131c\u0131ndan, veri haz\u0131rl\u0131\u011f\u0131ndan model e\u011fitimine, s\u00fcr\u00fcmlemeden da\u011f\u0131t\u0131m sim\u00fclasyonuna kadar t\u00fcm a\u015famalar\u0131n\u0131 lokal ortamda tutarl\u0131 ve tekrarlanabilir bir \u015fekilde y\u00f6netmenin m\u00fcmk\u00fcn oldu\u011funu g\u00f6sterdik. MLflow gibi ara\u00e7lar\u0131n entegrasyonuyla, deneme takibi ve model s\u00fcr\u00fcmleme s\u00fcre\u00e7leri basitle\u015ftirilerek veri bilimcilerin daha \u015feffaf ve verimli \u00e7al\u0131\u015fmas\u0131 sa\u011fland\u0131. Ayr\u0131ca, kaynak y\u00f6netimi, volume optimizasyonu ve g\u00fcvenlik pratikleri gibi ileri d\u00fczey ipu\u00e7lar\u0131yla ortam\u0131n\u0131z\u0131 daha sa\u011flam hale getirme yollar\u0131n\u0131 da ke\u015ffettik. T\u00fcm bu yakla\u015f\u0131mlar, veri bilimcilerin ve ekiplerin ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131n\u0131 art\u0131r\u0131rken, karma\u015f\u0131k ba\u011f\u0131ml\u0131l\u0131k y\u00f6netiminden kaynaklanan ba\u015f a\u011fr\u0131lar\u0131n\u0131 da ortadan kald\u0131r\u0131yor.<\/p>\n<p>Lokal MLOps, \u00f6zellikle k\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli ekipler i\u00e7in veya hassas veriyle \u00e7al\u0131\u015fan kurulu\u015flar i\u00e7in m\u00fckemmel bir ba\u015flang\u0131\u00e7 noktas\u0131d\u0131r. Hatta b\u00fcy\u00fck kurulu\u015flarda bile, buluta da\u011f\u0131t\u0131m \u00f6ncesi h\u0131zl\u0131 prototipleme ve test a\u015famalar\u0131 i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. Gelecekte, daha da geli\u015fen konteyner orkestrasyon ara\u00e7lar\u0131 ve a\u00e7\u0131k kaynakl\u0131 MLOps platformlar\u0131yla birlikte, lokal MLOps \u00e7\u00f6z\u00fcmlerinin yetenekleri artmaya devam edecektir. Bu nedenle, Docker Compose gibi ara\u00e7lara hakim olmak, her veri bilimcinin ve ML m\u00fchendisinin ara\u00e7 kutusunda bulunmas\u0131 gereken temel bir yetkinliktir. Bu sayede, hem bug\u00fcn\u00fcn hem de yar\u0131n\u0131n makine \u00f6\u011frenimi zorluklar\u0131na kar\u015f\u0131 daha donan\u0131ml\u0131 olacaks\u0131n\u0131z.<\/p>\n<div class=\"faq-section\">\n<h2>S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<div class=\"faq-question\">\n            Q: Docker Compose ile lokal MLOps kurulumu, \u00fcretim ortam\u0131 i\u00e7in yeterli mi?\n        <\/div>\n<div class=\"faq-answer\">\n<p>A: Hay\u0131r, Docker Compose genellikle geli\u015ftirme ve test ortamlar\u0131 i\u00e7in idealdir. \u00dcretim ortamlar\u0131nda, genellikle Kubernetes gibi daha geli\u015fmi\u015f konteyner orkestrasyon ara\u00e7lar\u0131 kullan\u0131l\u0131r. Kubernetes, daha iyi \u00f6l\u00e7eklenebilirlik, y\u00fcksek eri\u015filebilirlik, otomatik iyile\u015fme ve karma\u015f\u0131k da\u011f\u0131t\u0131m stratejileri sunar. Ancak lokal Docker Compose kurulumunuz, Kubernetes'e da\u011f\u0131t\u0131m yapmadan \u00f6nce projenizi geli\u015ftirmenizi ve kapsaml\u0131 bir \u015fekilde test etmenizi sa\u011flar.<\/p>\n<\/p><\/div>\n<div class=\"faq-question\">\n            Q: B\u00fcy\u00fck veri setleriyle lokal ortamda \u00e7al\u0131\u015f\u0131rken performans sorunlar\u0131 ya\u015far m\u0131y\u0131m?\n        <\/div>\n<div class=\"faq-answer\">\n<p>A: B\u00fcy\u00fck veri setleriyle \u00e7al\u0131\u015f\u0131rken lokal ortam\u0131n performans\u0131, ana makinenizin donan\u0131m \u00f6zelliklerine (CPU, RAM, SSD h\u0131z\u0131) ba\u011fl\u0131d\u0131r. \u00c7ok b\u00fcy\u00fck veri setleri (>100GB) i\u00e7in lokal makine yetersiz kalabilir. Bu durumda, verinin bir k\u0131sm\u0131n\u0131 \u00f6rneklemek, da\u011f\u0131t\u0131k i\u015flem \u00e7er\u00e7eveleri kullanmak veya do\u011frudan bulut tabanl\u0131 depolama\/i\u015flem servislerine ge\u00e7i\u015f yapmak daha uygun olabilir. Ancak \u00e7o\u011fu orta \u00f6l\u00e7ekli veri bilimi projesi i\u00e7in lokal bir Docker Compose kurulumu yeterli performans\u0131 sa\u011flayacakt\u0131r.<\/p>\n<\/p><\/div>\n<div class=\"faq-question\">\n            Q: Docker Compose ile olu\u015fturdu\u011fum ortam\u0131 ba\u015fka bir ekiple nas\u0131l payla\u015fabilirim?\n        <\/div>\n<div class=\"faq-answer\">\n<p>A: Docker Compose'un en b\u00fcy\u00fck avantajlar\u0131ndan biri ta\u015f\u0131nabilirli\u011fidir. <code class=\"language-yaml\">docker-compose.yml<\/code> dosyan\u0131z\u0131 ve varsa <code class=\"language-shell\">Dockerfile<\/code> ile uygulama kodunuzu i\u00e7eren proje dizininizi (\u00f6rne\u011fin Git deposu arac\u0131l\u0131\u011f\u0131yla) payla\u015fman\u0131z yeterlidir. Ekip \u00fcyelerinin sadece Docker ve Docker Compose'u kurulu olmas\u0131 gerekir. Ortam\u0131 ba\u015flatmak i\u00e7in <code class=\"language-shell\">docker compose up -d<\/code> komutunu \u00e7al\u0131\u015ft\u0131rmalar\u0131 yeterli olacakt\u0131r, bu da t\u00fcm ba\u011f\u0131ml\u0131l\u0131klar\u0131n otomatik olarak kurulmas\u0131n\u0131 sa\u011flar.<\/p>\n<\/p><\/div>\n<div class=\"faq-question\">\n            Q: MLflow artifacts'lar\u0131n\u0131 lokal dosya sistemi yerine bulut depolamada saklamak m\u00fcmk\u00fcn m\u00fc?\n        <\/div>\n<div class=\"faq-answer\">\n<p>A: Evet, kesinlikle m\u00fcmk\u00fcn. MLflow, artifact'lar i\u00e7in S3 (AWS), Azure Blob Storage veya Google Cloud Storage gibi \u00e7e\u015fitli bulut depolama \u00e7\u00f6z\u00fcmlerini destekler. <code class=\"language-yaml\">docker-compose.yml<\/code> dosyas\u0131ndaki MLflow servisi i\u00e7in <code class=\"language-shell\">MLFLOW_DEFAULT_ARTIFACT_ROOT<\/code> ortam de\u011fi\u015fkenini ilgili bulut depolama URI'sine ayarlayarak bunu yapabilirsiniz (\u00f6rne\u011fin <code class=\"language-shell\">s3:\/\/my-mlflow-bucket\/artifacts<\/code>). Bu, lokal ortam\u0131n\u0131zda \u00e7al\u0131\u015f\u0131rken bile artifact'lar\u0131n\u0131z\u0131 merkezi ve bulut tabanl\u0131 bir depoda saklaman\u0131za olanak tan\u0131r.<\/p>\n<\/p><\/div>\n<div class=\"faq-question\">\n            Q: Lokal MLOps ortam\u0131nda GPU kullan\u0131m\u0131 nas\u0131l entegre edilebilir?\n        <\/div>\n<div class=\"faq-answer\">\n<p>A: Lokal MLOps ortam\u0131n\u0131zda GPU kullanmak i\u00e7in <a href=\"https:\/\/docs.nvidia.com\/datacenter\/cloud-native\/container-toolkit\/latest\/install-guide.html\" target=\"_blank\">NVIDIA Container Toolkit<\/a>'i kurman\u0131z gerekir. Kurulumdan sonra, <code class=\"language-yaml\">docker-compose.yml<\/code> dosyan\u0131zdaki ilgili servislere (\u00f6rne\u011fin Jupyter) <code class=\"language-shell\">deploy<\/code> b\u00f6l\u00fcm\u00fcnde <code class=\"language-shell\">resources<\/code> alt\u0131na <code class=\"language-shell\">reservations<\/code> ekleyerek GPU'lar\u0131 ay\u0131rabilirsiniz. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-yaml\">\nservices:\n  jupyter:\n    # ...\n    deploy:\n      resources:\n        reservations:\n          devices:\n            - driver: nvidia\n              count: 1 # Kullan\u0131lacak GPU say\u0131s\u0131\n              capabilities: [gpu]\n    <\/pre>\n<p><\/code><br \/>\n            Bu, konteynerinizin ana makinedeki GPU'ya eri\u015fmesini sa\u011flar ve derin \u00f6\u011frenme modellerini e\u011fitmek gibi yo\u011fun hesaplama g\u00f6revleri i\u00e7in lokal ortam\u0131n\u0131z\u0131 g\u00fc\u00e7lendirir.\n            <\/p>\n<\/p><\/div>\n<\/p><\/div>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Veri bilimi ve makine \u00f6\u011frenimi projeleri, geli\u015ftirme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinde karma\u015f\u0131kl\u0131klarla doludur. Bulut tabanl\u0131 \u00e7\u00f6z\u00fcmler cazip g\u00f6r\u00fcnse&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1407],"tags":[],"class_list":{"0":"post-34985","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-docker","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Lokal MLOps: Docker Compose ile Bulut Benzeri Veri Bilimi Deneyimi<\/title>\n<meta name=\"description\" content=\"Veri bilimi ve makine \u00f6\u011frenimi projeleri, geli\u015ftirme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinde karma\u015f\u0131kl\u0131klarla doludur. Bulut tabanl\u0131 \u00e7\u00f6z\u00fcmler cazip g\u00f6r\u00fcnse de, lokal bir ortamda &quot;bulut benzeri&quot; bir deneyim sunarak maliyetleri d\u00fc\u015f\u00fcrmek, performans\u0131 art\u0131rmak ve veri gizlili\u011fini sa\u011flamak m\u00fcmk\u00fcn m\u00fc? Evet, Docker Compose ile bu hedefe ula\u015fabilir, MLOps s\u00fcre\u00e7lerinizi yerel makinenizde bile verimli bir \u015fekilde y\u00f6netebilirsiniz.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Lokal MLOps: Docker Compose ile Bulut Benzeri Veri Bilimi Deneyimi\" \/>\n<meta property=\"og:description\" content=\"Veri bilimi ve makine \u00f6\u011frenimi projeleri, geli\u015ftirme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinde karma\u015f\u0131kl\u0131klarla doludur. Bulut tabanl\u0131 \u00e7\u00f6z\u00fcmler cazip g\u00f6r\u00fcnse de, lokal bir ortamda &quot;bulut benzeri&quot; bir deneyim sunarak maliyetleri d\u00fc\u015f\u00fcrmek, performans\u0131 art\u0131rmak ve veri gizlili\u011fini sa\u011flamak m\u00fcmk\u00fcn m\u00fc? Evet, Docker Compose ile bu hedefe ula\u015fabilir, MLOps s\u00fcre\u00e7lerinizi yerel makinenizde bile verimli bir \u015fekilde y\u00f6netebilirsiniz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-24T09:01:22+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"28 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Lokal MLOps: Docker Compose ile Bulut Benzeri Veri Bilimi Deneyimi\",\"datePublished\":\"2025-11-24T09:01:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/\"},\"wordCount\":4401,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Docker\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/\",\"name\":\"Lokal MLOps: Docker Compose ile Bulut Benzeri Veri Bilimi Deneyimi\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-11-24T09:01:22+00:00\",\"description\":\"Veri bilimi ve makine \u00f6\u011frenimi projeleri, geli\u015ftirme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinde karma\u015f\u0131kl\u0131klarla doludur. Bulut tabanl\u0131 \u00e7\u00f6z\u00fcmler cazip g\u00f6r\u00fcnse de, lokal bir ortamda \\\"bulut benzeri\\\" bir deneyim sunarak maliyetleri d\u00fc\u015f\u00fcrmek, performans\u0131 art\u0131rmak ve veri gizlili\u011fini sa\u011flamak m\u00fcmk\u00fcn m\u00fc? Evet, Docker Compose ile bu hedefe ula\u015fabilir, MLOps s\u00fcre\u00e7lerinizi yerel makinenizde bile verimli bir \u015fekilde y\u00f6netebilirsiniz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Lokal MLOps: Docker Compose ile Bulut Benzeri Veri Bilimi Deneyimi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Lokal MLOps: Docker Compose ile Bulut Benzeri Veri Bilimi Deneyimi","description":"Veri bilimi ve makine \u00f6\u011frenimi projeleri, geli\u015ftirme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinde karma\u015f\u0131kl\u0131klarla doludur. Bulut tabanl\u0131 \u00e7\u00f6z\u00fcmler cazip g\u00f6r\u00fcnse de, lokal bir ortamda \"bulut benzeri\" bir deneyim sunarak maliyetleri d\u00fc\u015f\u00fcrmek, performans\u0131 art\u0131rmak ve veri gizlili\u011fini sa\u011flamak m\u00fcmk\u00fcn m\u00fc? Evet, Docker Compose ile bu hedefe ula\u015fabilir, MLOps s\u00fcre\u00e7lerinizi yerel makinenizde bile verimli bir \u015fekilde y\u00f6netebilirsiniz.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/","og_locale":"tr_TR","og_type":"article","og_title":"Lokal MLOps: Docker Compose ile Bulut Benzeri Veri Bilimi Deneyimi","og_description":"Veri bilimi ve makine \u00f6\u011frenimi projeleri, geli\u015ftirme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinde karma\u015f\u0131kl\u0131klarla doludur. Bulut tabanl\u0131 \u00e7\u00f6z\u00fcmler cazip g\u00f6r\u00fcnse de, lokal bir ortamda \"bulut benzeri\" bir deneyim sunarak maliyetleri d\u00fc\u015f\u00fcrmek, performans\u0131 art\u0131rmak ve veri gizlili\u011fini sa\u011flamak m\u00fcmk\u00fcn m\u00fc? Evet, Docker Compose ile bu hedefe ula\u015fabilir, MLOps s\u00fcre\u00e7lerinizi yerel makinenizde bile verimli bir \u015fekilde y\u00f6netebilirsiniz.","og_url":"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-11-24T09:01:22+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"28 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Lokal MLOps: Docker Compose ile Bulut Benzeri Veri Bilimi Deneyimi","datePublished":"2025-11-24T09:01:22+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/"},"wordCount":4401,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Docker"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/","url":"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/","name":"Lokal MLOps: Docker Compose ile Bulut Benzeri Veri Bilimi Deneyimi","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-11-24T09:01:22+00:00","description":"Veri bilimi ve makine \u00f6\u011frenimi projeleri, geli\u015ftirme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinde karma\u015f\u0131kl\u0131klarla doludur. Bulut tabanl\u0131 \u00e7\u00f6z\u00fcmler cazip g\u00f6r\u00fcnse de, lokal bir ortamda \"bulut benzeri\" bir deneyim sunarak maliyetleri d\u00fc\u015f\u00fcrmek, performans\u0131 art\u0131rmak ve veri gizlili\u011fini sa\u011flamak m\u00fcmk\u00fcn m\u00fc? Evet, Docker Compose ile bu hedefe ula\u015fabilir, MLOps s\u00fcre\u00e7lerinizi yerel makinenizde bile verimli bir \u015fekilde y\u00f6netebilirsiniz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/lokal-mlops-docker-compose-ile-bulut-benzeri-veri-bilimi-deneyimi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Lokal MLOps: Docker Compose ile Bulut Benzeri Veri Bilimi Deneyimi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34985","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=34985"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/34985\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=34985"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=34985"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=34985"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}