メインコンテンツへスキップ
見出し画像

SIGNATE_おれおれ環境構築備忘録_2(MLflow追加編)

    はじめに

    前回の記事では、Docker環境でJupyter Notebookを使用する基本的な環境構築について説明しました。今回は、機械学習の実験管理ツールであるMLflowを追加し、モデルの開発・管理をより効率的に行える環境を構築します。

    MLflowについては下記サイトの他、解説を参照願います。

    変更点の概要

    前回の環境から以下の機能を追加します:

    • MLflow UIによる実験管理

    • 実験結果の可視化

    • モデルのバージョン管理

    設定ファイルの変更

    Dockerfile

    FROM condaforge/miniforge3:latest
    
    RUN apt update && \
        apt install -y build-essential
    
    COPY requirements.txt /tmp
    RUN pip install -r /tmp/requirements.txt
    RUN pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu
    
    # 必要なディレクトリを作成
    RUN mkdir /home/work
    RUN mkdir -p /mlflow/artifacts
    
    # ポートの設定
    EXPOSE 8888 5000
    
    # 作業ディレクトリを設定
    WORKDIR /home/work
    
    # MLflowサーバーとJupyter Notebookを起動
    CMD mlflow server --host 0.0.0.0 --port 5000 --backend-store-uri file:///mlflow/mlruns --default-artifact-root file:///mlflow/mlruns & \
        jupyter notebook \
        --port=8888 \
        --ip=0.0.0.0 \
        --allow-root \
        --no-browser \
        --NotebookApp.token='' \
        --NotebookApp.notebook_dir='/home/work'

    docker-compose.yml

    version: "3"
    
    services:
      jupyter-mlflow:
        build: ./
        shm_size: '2gb'
        ports:
          - "8888:8888"
          - "5001:5000"
        volumes:
          - "./:/home/work"
          - "./mlflow:/mlflow"
        environment:
          - MLFLOW_TRACKING_URI=/mlflow/mlruns

    requirements.txt に追加

    mlflow
    scikit-learn

    環境構築と基本操作

    コンテナのビルドと起動

    docker-compose up -d --build

    アクセス方法

    MLflowの使い方

    基本的な実験の記録

    import mlflow
    import numpy as np
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import mean_squared_error
    from sklearn.linear_model import LinearRegression
    
    # MLflowの設定
    mlflow.set_tracking_uri("file:///mlflow/mlruns")
    
    # 実験名を設定
    experiment_name = "linear_regression_test"
    try:
        experiment_id = mlflow.create_experiment(experiment_name)
    except mlflow.exceptions.MlflowException:
        experiment_id = mlflow.get_experiment_by_name(experiment_name).experiment_id
    
    mlflow.set_experiment(experiment_name)
    
    # サンプルデータの作成
    X = np.array([[1], [2], [3], [4], [5]])
    y = np.array([2, 4, 6, 8, 10])
    
    # データの分割
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    
    # MLflowで実験を記録
    with mlflow.start_run() as run:
        print(f"Run ID: {run.info.run_id}")
        
        # モデルのトレーニング
        model = LinearRegression()
        model.fit(X_train, y_train)
        
        # 予測と評価
        predictions = model.predict(X_test)
        mse = mean_squared_error(y_test, predictions)
        
        # パラメータと指標を記録
        mlflow.log_param("model_type", "LinearRegression")
        mlflow.log_param("train_size", len(X_train))
        mlflow.log_param("test_size", len(X_test))
        
        # より多くのメトリクスを記録
        mlflow.log_metric("mse", mse)
        mlflow.log_metric("rmse", np.sqrt(mse))
        mlflow.log_metric("coefficient", model.coef_[0])
        mlflow.log_metric("intercept", model.intercept_)
        
        # 入力例とモデルシグネチャを設定してモデルを保存
        signature = mlflow.models.infer_signature(
            X_train, 
            model.predict(X_train)
        )
        
        input_example = X_train[0:2]
        
        mlflow.sklearn.log_model(
            model, 
            "model",
            signature=signature,
            input_example=input_example
        )
        
        print(f"MSE: {mse}")
        print(f"RMSE: {np.sqrt(mse)}")
        print(f"Coefficient: {model.coef_[0]}")
        print(f"Intercept: {model.intercept_}")


    画像
    notebook上で実行した結果
    画像
    localhost:5001を確認すると実行結果が追加されている
    画像
    IDや値を確認することができる。

    注意点

    • .gitignoreに以下を追加し、MLflow関連ファイルをGit管理から除外

    mlflow/
    mlruns/
    artifacts/

    まとめ

    MLflowを追加することで、以下のような利点が得られます:

    • 実験結果の可視化と比較が容易に

    • モデルのバージョン管理が可能に

    • パラメータとメトリクスの追跡が簡単に

    前回の環境に比べ、より本格的な機械学習開発が可能になりました。

     
     

    yu

     
     
    '09年総合職で自動車部品メーカー入社、7年間金型管理・設計エンジニア。'17年職業訓練校でソフトウェア学習。'18年〜現在プログラマー。 https://nishi10000.github.io/portfolio/

    あなたへのおすすめ