技術筆記 / 機器學習與資料科學

Poetry 版 MLflow + XGBoost Hello World 指南

沒問題!使用 Poetry 來管理依賴絕對是更好的選擇,它能確保你的環境版本鎖定(Locking),讓未來換電腦或部署到 Server 時不會炸開。

這是一份更新後的 Poetry 版 MLflow + XGBoost Hello World 指南。


Step 1: 專案初始化與 Poetry 設定

假設你已經安裝好 Poetry (如果沒裝:pip install poetry)。

1. 建立專案資料夾

mkdir mlflow-poetry-starter
cd mlflow-poetry-starter

2. 初始化 Poetry 環境

這裡我們直接用指令快速建立 pyproject.toml 並安裝需要的套件。

# 初始化 poetry (使用 -n 略過互動問答,直接用預設值)
poetry init -n --name "mlflow-starter" --description "A Hello World example for MLflow with XGBoost"

# 一次安裝所有依賴
poetry add mlflow xgboost pandas scikit-learn

此時你的目錄會多出 pyproject.toml 和 poetry.lock。


Step 2: 撰寫 docker-compose.yml

維持與之前一樣的設定,負責啟動 MLflow Server。

version: '3.7'

services:
  mlflow:
    image: ghcr.io/mlflow/mlflow:v2.10.0
    container_name: mlflow_server
    ports:
      - "5000:5000"
    volumes:
      - ./mlflow_data:/mlflow
    command: >
      mlflow server
      --backend-store-uri sqlite:////mlflow/mlflow.db
      --default-artifact-root /mlflow/artifacts
      --host 0.0.0.0
      --port 5000

Step 3: 撰寫訓練程式 train.py

程式碼邏輯不變,但我們可以加上一點註解,讓你清楚這是在 Poetry 環境下執行的。

import mlflow
import mlflow.xgboost
import xgboost as xgb
from sklearn.datasets import load_diabetes
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score

# ==========================================
# 1. 設定 MLflow 連線
# ==========================================
# 指向 Docker 啟動的 Server
mlflow.set_tracking_uri("http://localhost:5000")
mlflow.set_experiment("Poetry_XGBoost_Demo")

def train():
    # ==========================================
    # 2. 準備資料
    # ==========================================
    X, y = load_diabetes(return_X_y=True, as_frame=True)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

    # ==========================================
    # 3. 啟動 MLflow Run
    # ==========================================
    with mlflow.start_run():
        print("🚀 [Poetry Env] 開始訓練...")

        # 開啟 XGBoost 自動紀錄
        mlflow.xgboost.autolog()

        # ==========================================
        # 4. 訓練 XGBoost 模型
        # ==========================================
        params = {
            "n_estimators": 100,
            "max_depth": 3,
            "learning_rate": 0.1,
            "subsample": 0.8,
            "early_stopping_rounds": 10
        }

        model = xgb.XGBRegressor(**params)

        model.fit(
            X_train, y_train, 
            eval_set=[(X_test, y_test)], 
            verbose=False
        )

        # ==========================================
        # 5. 手動補紀錄 Metric
        # ==========================================
        predictions = model.predict(X_test)
        r2 = r2_score(y_test, predictions)
        mlflow.log_metric("test_r2_score", r2)

        print(f"✅ 訓練完成! R2 Score: {r2:.4f}")
        print("👉 請打開瀏覽器查看: http://localhost:5000")

if __name__ == "__main__":
    train()

Step 4: 執行與驗證

這是使用 Poetry 最關鍵的一步,所有的執行都要透過 poetry run,或是進入 poetry shell。

1. 啟動 MLflow Server (Docker)

docker-compose up -d

2. 執行訓練 (透過 Poetry)

poetry run python train.py

這行指令會確保 python 是使用 Poetry 建立的虛擬環境,而不是你系統原本的 python。

3. 查看結果

打開瀏覽器: http://localhost:5000


可能會遇到的問題

MLflow 版本(3.9.0)還不支援 Pandas 3.0.0 以上的版本

執行時遇到

Because no versions of mlflow match >3.9.0,<4.0.0

 and mlflow (3.9.0) depends on pandas (<3), mlflow (>=3.9.0,<4.0.0) requires pandas (<3).

So, because mlflow-docker-simple depends on both mlflow (^3.9.0) and pandas (^3.0.0), version solving

解決方法

你只需要在安裝時,明確限制 Pandas 的版本在 3.0.0 以下。

請在終端機執行以下指令:

poetry add mlflow "pandas<3.0.0" xgboost scikit-learn

XGBoost 下載太久

Poetry 和 xgboost 疑難雜症

在 GitHub 看原文