Clear ML

ClearML, makine öğrenmesi ve derin öğrenme projelerinde deneylerin izlenmesi, model performansının değerlendirilmesi ve otomatik deney yönetimi için kullanılan açık kaynaklı bir platformdur. ClearML, deneylerin izlenmesi, metriklerin görselleştirilmesi, model performansının karşılaştırılması ve otomatik deney yönetimi için çeşitli araçlar sunar.

1 – ) Pip aracı ile clearml kütüphanesini kuralım.

pip install clearml

2 – ) Clear-ml sitesinden üye oluyoruz. Bizi bir arayüz ekranı karşılıyor. Bu arayüz ekranından sağ üst köşedeki kullanıcı simgesinden ‘settings’ kısmına, gelen ekrandan da soldaki menüden workspace’yi seçiyoruz. Ekrandaki API anahtarımızı kopyalıyoruz.

3 – ) Terminalden ‘clearml-init’ komutunu çalıştırıyoruz. Bizden API anahtarını girmemizi istiyor ve yapıştırıp giriyoruz. Böylece sistem üzerinde clearml kütüphanesini kullanabileceğiz.

alper@alper:/mnt/d/work2/cyberds-yazilar/clearml$ clearml-init
ClearML SDK setup process
Configuration file already exists: /home/alper/clearml.conf
Leaving setup, feel free to edit the configuration file.

4 – ) Bu yazıda CIFAR10 veri setini kullanarak bir sınıflandırma problemi üzerinden ilerleyeceğiz. Aşağıdaki kodu bilgisayarınızda çalıştırın.

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

import tensorflow as tf
from tensorflow.keras.datasets import cifar10
from tensorflow.keras import layers, models, callbacks
from tensorflow.keras.utils import to_categorical

import numpy as np
import pandas as pd
from sklearn.metrics import classification_report

from clearml import Task, Logger

task = Task.init(
    project_name='cifar10-test',
    task_name='CIFAR10 - CNN',
    tags=['classification']
)

(X_train, y_train), (X_test, y_test) = cifar10.load_data()

X_train = X_train.astype('float32') / 255.0
X_test = X_test.astype('float32') / 255.0

y_train = to_categorical(y_train, num_classes=10)
y_test = to_categorical(y_test, num_classes=10)

args = {
    'batch_size': 128,
    'epochs': 10,
    'conv_1': 32,
    'conv_1_filter': (3, 3),
    'pool_1': (2, 2),
    'conv_2': 64,
    'conv_2_filter': (3, 3),
    'pool_2': (2, 2),
    'conv_3': 128,
    'conv_3_filter': (3, 3),
    'pool_3': (2, 2),
    'dense_1': 128,
}

args = task.connect(args)

model = models.Sequential([
    layers.Conv2D(args['conv_1'], args['conv_1_filter'], activation='relu', input_shape=(32, 32, 3)),
    layers.MaxPooling2D(args['pool_1']),
    
    layers.Conv2D(args['conv_2'], args['conv_2_filter'], activation='relu'),
    layers.MaxPooling2D(args['pool_2']),
    
    layers.Conv2D(args['conv_3'], args['conv_3_filter'], activation='relu'),
    layers.MaxPooling2D(args['pool_3']),
    
    layers.Flatten(),
    
    layers.Dense(args['dense_1'], activation='relu'),
    layers.Dense(10, activation='softmax'),    
])

model.compile(optimizer='RMSprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

history = model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=args['epochs'], batch_size=args['batch_size'])
history_df = pd.DataFrame(history.history)

test_loss, test_acc = model.evaluate(X_test, y_test)
print('Test loss:', test_loss)
print('Test accuracy:', test_acc)

for i in range(10):
    Logger.current_logger().report_scalar(
        title='train/loss',
        value=history_df['loss'].values[i],
        series='Loss',
        iteration=i
    )

for i in range(10):
    Logger.current_logger().report_scalar(
        title='evaluate/loss',
        value=history_df['val_loss'].values[i],
        series='Loss',
        iteration=i
    )

for i in range(10):
    Logger.current_logger().report_scalar(
        title='train/accuracy',
        value=history_df['accuracy'].values[i],
        series='Accuracy',
        iteration=i
    )

for i in range(10):
    Logger.current_logger().report_scalar(
        title='evaluate/accuracy',
        value=history_df['val_accuracy'].values[i],
        series='Accuracy',
        iteration=i
    )

y_pred = model.predict(X_test)
y_pred = [np.argmax(pred) for pred in y_pred]
y_pred = to_categorical(y_pred)

cr_dict = classification_report(y_test, y_pred, output_dict=True)
cr_df = pd.DataFrame(data=cr_dict).T

Logger.current_logger().report_table(
    title='Classification Report',
    series='',
    iteration=0,
    table_plot=cr_df
)

task.close()

5 – ) Model eğitimini tamamladıktan sonra site üzerinden proje sayfasını inceleyim. Bu ekrandaki sekmeler;

  • Execution: Bu kısımda kaynak kodu ve yüklü olan paketler hakkında birtakım bilgiler bulunur.
  • Configuration: Bu kısımda modelde ve deney içinde kullanılan hiperparametre bilgileri bulunur.
  • Artifacts: Bu kısımda deneye ait notebook veya kaynak kodu dosyaları bulunur.
  • Info: Deneyin çalıştırıldığı sistem hakkında birtakım bilgiler bulunur. Örneğin kullanıcı adı, ekran kartı, işletim sistemi, python versiyonu gibi.
  • Console: Kod içerisindeki çıktılar ve hatalar burada gösterilir.
  • Scalars: Modelin metriklerinin sonuçları grafikler ile burada gösterilir.
  • Plots: Deney içerisindeki grafikler bu kısımda gösterilir.
  • Debug Samples: Kod içerisindeki video, görsel ve sesler burada gösterilir.