MLFlow ile basit bir uygulama

murat d
BilgeAdam Teknoloji
3 min readDec 20, 2022

MLFlow kullanarak MLOPS ile ilgili süreçlerimizi yönetebiliriz. Model geliştirirken birçok algoritma deneriz. Bunları farklı hiper parametreler ile kullanabiliriz. Elde ettiğimiz metrikleri takip etmemiz ve oluşan modeli de saklamamız gerekir. Tüm bu işlemleri modelimizi canlı sisteme aldıktan sonra da düzenli aralıklarla tekrarlamamız gerekir. MLFLows bu işlemleri kolay bir sekilde yönetmemizi saglar. Kaynaklar bölümünden konu ile ilgili daha detaylı bilgiye ulaşabilirsiniz.

Bu işlemler nasıl gerçekleşiyor basit bir uygulama üzerinde görelim. Python geliştirme arayüzü olarak PyCharm kullandım. Ancak Jupyter Notebook da kullanılabilir.

Aşağıdaki pyhton kodlarını çalıştırdığımızda basit bir ML modeli yapmış olacağız. Elde ettiğimiz Accuracy değerini de MLFlow ile kaydını tutacağız.

import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn.preprocessing import StandardScaler

#1.Bolum
df=pd.read_csv("https://datahub.io/machine-learning/adult/r/adult.csv")
df[df == '?'] = np.nan

#Impute missing values with mode
for col in ['workclass', 'occupation', 'native-country']:
df[col].fillna(df[col].mode()[0], inplace=True)

#Split dataset
X = df.drop(['class'], axis=1)
y = df['class']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 0)

#Encode categorical variables
categorical = ['workclass', 'education', 'marital-status', 'occupation', 'relationship', 'race', 'sex', 'native-country']
for feature in categorical:
label = preprocessing.LabelEncoder()
X_train[feature] = label.fit_transform(X_train[feature])
X_test[feature] = label.transform(X_test[feature])

#Feature Scaling
scaler = StandardScaler()
X_train = pd.DataFrame(scaler.fit_transform(X_train), columns = X.columns)
X_test = pd.DataFrame(scaler.transform(X_test), columns = X.columns)

#Logistic Regression model
LR = LogisticRegression()
LR.fit(X_train, y_train)
y_pred = LR.predict(X_test)
accuracy_score = accuracy_score(y_test, y_pred)

print(accuracy_score)

#2.Bolum
print("mlflow islemleri.....................................................")

import mlflow
from mlflow.entities import Param,Metric,RunTag
print("MLflow Version:", mlflow.__version__)
mlflow.set_tracking_uri("http://localhost:5000")
print("Tracking URI:", mlflow.tracking.get_tracking_uri())
experiment_name = "Gelir_Tahmini"
print("experiment_Adi:", experiment_name)
mlflow.set_experiment(experiment_name)

client = mlflow.tracking.MlflowClient()
experiment_id = client.get_experiment_by_name(experiment_name).experiment_id
print("experiment_Numarasi:", experiment_id)

import time
now = round(time.time())
run_adi = "run_" + time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime(now))

def run(run_origin):
with mlflow.start_run(run_name=run_origin) as run:
print("runId:", run.info.run_uuid)
print("artifact_uri:", mlflow.get_artifact_uri())
print("run_origin:", run_origin)
mlflow.log_metric("accuracy_score", accuracy_score)
mlflow.set_tag("run_adi", run_origin)
params = [ Param("p1 parametresi","0.1"), Param("p2 parametresi","0.2") ]
metrics = [ Metric("m1 metrigi",0.1,now,0), Metric("m2 metrigi",0.2,now,0) ]
tags = [ RunTag("tag1","etiket1"), RunTag("tag2","etiket2") ]
client.log_batch(run.info.run_uuid, metrics, params, tags)

run(run_adi)

Yukarıdaki kodda 1.Bölüm’ de gelir tahmini yapan bir model kurguladık. 2.Bölüm’ de ise bazı parametre ve metrik değerlerini MLFlow ile loglama işlemini yaptık. Burada p1 parametresi, m1 metriği gibi degerlere örnek olması açısından sabit değer girdim. Bu değişkenlere normalde algoritmamızda kullandıgımız değerleri atarız. Burada dinamik olarak kullandıgımız bir tek accuracy_score adlı metriğimiz var.

Bu kod örneği her çalıştığında kodun bulundugu klasorde yer alan “mlruns“ adındaki klasorün altındaki dosyalara kaydedecek. MLFlows da gerekli ayarlamalar yapılarak bu bilgilerin Postgre gibi bir database’e kaydedilmesi de sağlanabilir.

Yazdığımız ML projesinin çalışmalarına ilişkin bu log kayıtlarına klasorden bakmak yerine aşağıdaki şekilde “MLFlow UI” aracı ile de bakabiliriz. Bunun için öncelikle bu aracı açmamız gerekir.

PyCharm aracında “Terminal” penceresinde “mlflow ui” komutunu yazıp enter dediğimizde servisin “http://127.0.0.1:5000” adresinde başladığını gösterir. Bu adrese gittiğimizde yukarıdaki gibi ML modelimize ait çalışma bilgilerini görebiliriz

Not: KubeFlow da MLFlow gibi ML Workflow işlemlerini yapmamızda yardımcı olur. Ancak KubeFlow ile bu işlemler esnasında Kubernates Cluster’ları da kullanabiliriz.

Kaynaklar:

Kaynak Kodlar:

--

--