0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Cloudera AI - Experiment 機能の紹介 & 使い方

0
Posted at

Cloudera AI の Experiment とは

Cloudera AI ワークベンチ には Experiment という機能があります。

Experiment は、MLflow による試行の結果を自動的に統一的なファイルシステム上に保管し、UIにより管理・アクセスできるようにする仕組みです。

この記事では、そんな Experiment の機能でできることの紹介と、使い方について解説します。

image.png

※「MLflow ってなんですか?」という人よりは、MLflow にある程度習熟していて、 run などの結果をもっと統一的に管理したい! というニーズを抱えている人向けの機能なので、この記事では MLflow については特に解説しません。

Experiment 機能でできること

Experiment は、MLflow を普通に使う感覚で Cloudera AI ワークベンチのノートブック上のコードを実行すると、その内容を自動的に拾ってくれて統合管理できる仕組みです。

image.png

Experiment機能では、MLflow の run の結果を以下のように、GUIで表示することができます。

image.png

run の詳細画面では、各種のメトリクスやパラメータを表示するとともに・・・

image.png

その run で利用したファイルを参照することもできます。

データセットの情報
image.png

予測結果の画像
image.png

Experiment 機能の使い方

前述のとおり、Experiment は、 Cloudera AI ワークベンチのノートブックで実行された MLflow の結果を自動的に拾ってくれて統合管理できる仕組みです。

MLflow のどのコードを実行することで、 Experiment 上でどのように見えるのかを解説します。

まずは各コードの役割を説明した上で、最後に全体を統合したコードサンプルを掲載します。

mlflow のインポート

Cloudera AI 上でコードを実行する際も、mlflow のインポートは必要になるのでインポートします。

インポート
import mlflow

Experiment を指定する - set_experiment("Experiment名")

set_experiment("Experiment名") で、以後の run をその名前のExperiment 配下で実行するように指定します。

Experiment を指定する

mlflow.set_experiment("Experiment名")

指定した名前の Experiment が存在しない場合は、初回実行時に作成します。

Experiment を指定しない場合、run は default の Experiment に入ります。

image.png

パラメータを記録する - log_param("パラメータ名", 値)

log_param("パラメータ名", 値) で、該当する値を指定したパラメータ名で記録します。

パラメータの記録

mlflow.log_param("パラメータ名", )

image.png

※実際のコードでは、値の部分は run の中で変数化されていることが多いと思います。Experiment 機能が実行時点の変数の中身を拾い、記録していきます。

メトリクスを記録する - log_metric("メトリクス名", 値)

log_metric("メトリクス名", 値) で、該当する値を指定したパラメータ名で記録します。

メトリクスの記録

mlflow.log_metric("メトリクス名", )

image.png

※実際のコードでは、値の部分は run の中で変数化されているかと思います。Experiment 機能が実行時点の変数の中身を拾い、記録していきます。

モデルを保管する - sklearn.log_model(モデル, "モデル名")

sklearn.log_model(モデル, "モデル名") を実行することで、モデルが run のアーティファクトとして自動的に管理されます。

モデルの保管

mlflow.sklearn.log_model(モデル, "モデル名")

image.png

モデル以外の関連ファイルを記録する - log_artifact(ファイル)

log_artifact(ファイル) を実行することで、任意のファイルを run のアーティファクトとして管理することができます。

モデル以外のファイルの保管

mlflow.log_artifact(ファイル)

image.png

フルコードサンプル

上記で解説したコードを、一連の流れの中で実行するサンプルコードです。
Cloudera ワークベンチのノートブックに以下のコードをコピーし実行することで、以下の結果を得られます。(箇条書きの○内数字はコード内のコメントに対応)

  • ① iris-classification-demo という名前の Experiment を作る
  • ② パラメータ(n_estimators, max_depth, random_state)を記録する
  • ③ メトリクス(accuracy, precision, recall)を記録する
  • ④ プロット結果の画像ファイルをアーティファクトとして保管する
  • ⑤ メタデータのレポートを格納した json ファイルをアーティファクトとして保管する
  • ⑥ モデルを保管する
モデル以外のファイルの保管

import mlflow
import mlflow.sklearn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import json

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix

# ---------------------------------------------------------
# 1. データセット(Iris)の準備
# ---------------------------------------------------------
iris = load_iris()
X = pd.DataFrame(iris.data, columns=iris.feature_names)
y = iris.target

# データを訓練用とテスト用に分割 (これで y_test も定義されます)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# ---------------------------------------------------------
# 2. MLflow Experiment の設定(①)
# ---------------------------------------------------------
mlflow.set_experiment("iris-classification-demo") 


# ---------------------------------------------------------
# 3. 実験(Run)の実行関数
# ---------------------------------------------------------
def run_iris_experiment(n_estimators: int, max_depth: int, run_name: str):
    
    with mlflow.start_run(run_name=run_name):
        # --- (A) パラメータの記録 ---  (②)
        mlflow.log_param("n_estimators", n_estimators)
        mlflow.log_param("max_depth", max_depth)
        mlflow.log_param("random_state", 42)

        # --- (B) モデルの訓練と予測 ---
        model = RandomForestClassifier(
            n_estimators=n_estimators, 
            max_depth=max_depth, 
            random_state=42
        )
        model.fit(X_train, y_train)
        predictions = model.predict(X_test)

        # --- (C) メトリクスの記録 --- (③)
        acc = accuracy_score(y_test, predictions)
        prec = precision_score(y_test, predictions, average="macro")
        rec = recall_score(y_test, predictions, average="macro")

        mlflow.log_metric("accuracy", acc)
        mlflow.log_metric("precision", prec)
        mlflow.log_metric("recall", rec)

        # ---------------------------------------------------------
        # ★ (D) Artifacts への保存処理
        # ---------------------------------------------------------
        
        # 1. 画像ファイル (混同行列のヒートマップ)
        cm = confusion_matrix(y_test, predictions)
        plt.figure(figsize=(6, 4))
        sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', 
                    xticklabels=iris.target_names, yticklabels=iris.target_names)
        plt.title(f'Confusion Matrix ({run_name})')
        plt.xlabel('Predicted')
        plt.ylabel('Actual')
        plt.tight_layout()
        
        plot_filename = "confusion_matrix.png"
        plt.savefig(plot_filename)
        plt.close() # メモリ解放
        
        # MLflow Artifact にアップロード(④)
        mlflow.log_artifact(plot_filename)

        # 2. メタデータ/レポートファイル (JSON)
        extra_info = {
            "dataset": "Iris Dataset",
            "train_samples": len(X_train),
            "test_samples": len(X_test),
            "features": list(X.columns)
        }
        json_filename = "data_info.json"
        with open(json_filename, "w") as f:
            json.dump(extra_info, f, indent=4)
            
        # MLflow Artifact にアップロード(⑤)
        mlflow.log_artifact(json_filename)  

        # 3. 学習済みモデル本体の保存 (⑥)
        mlflow.sklearn.log_model(model, "random_forest_model") 

        print(f"[{run_name}] 完了 - Accuracy: {acc:.4f} (Artifacts も保存されました)")


# ---------------------------------------------------------
# 4. 実験の実行
# ---------------------------------------------------------
run_iris_experiment(n_estimators=10, max_depth=2, run_name="run_small_tree")
run_iris_experiment(n_estimators=100, max_depth=10, run_name="run_large_tree")

以上!

いかがでしたか?
上記を参考に、ぜひ Cloudera AI ベンチの便利機能 Experiment を使いこなしてください✨

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?