ð TL;DR (3è¡èŠçŽ)
- äœïŒ: æ©æ¢°åŠç¿ã®å®éšïŒã¢ãã«ãããŒã¿ããã©ã¡ãŒã¿ãçµæïŒãèªåã§èšé²ã»ç®¡çããåçŸæ§ãé«ããããã®ãã©ãããã©ãŒã ã§ãã
- ãã€äœ¿ãïŒ: è€æ°ã®ã¢ãã«ããã€ããŒãã©ã¡ãŒã¿ã詊è¡é¯èª€ããæãè¯ãçµæãè¿œè·¡ã»æ¯èŒããããšãã«çµ¶å€§ãªåšåãçºæ®ããŸãã
- å©ç¹ïŒ: ããã®æã©ããã£ãã£ãïŒããšããæ©ã¿ãè§£æ¶ããããŒã éçºãã¢ãã«ã®ãããã€ãé©ãã»ã©ã¹ã ãŒãºã«ããŸãã
1. ð€ äžäœmlflowãšã¯äœïŒïŒæ žå¿çãªåœ¹å²ãšäž»ãªäœ¿çšäŸïŒ
ããã«ã¡ã¯ïŒäººæ°ããã¬ãŒã®[ããªãã®åå]ã§ããPythonã§ã®ããŒã¿ãµã€ãšã³ã¹ãæ©æ¢°åŠç¿ã®åŠç¿ãé²ãã§ããŸããïŒ
çãããPythonã§æ©æ¢°åŠç¿ã¢ãã«ãéçºããéãå¿ ãçŽé¢ãããããåé¡ãããããŸããããã¯ããå®éšã®åçŸæ§ããšã管çã®ç ©éããã§ãã
æ žå¿çãªåœ¹å²ïŒæ©æ¢°åŠç¿ã®ããã®ãããžã¿ã«å®éšå®€ã
æ©æ¢°åŠç¿ã®ã¢ãã«éçºã¯ããŸãã§æçã®ã¬ã·ãéçºã«äŒŒãŠããŸãã
- ææïŒããŒã¿ïŒ ãå€ããŠã¿ãã
- èª¿çæ³ïŒã¢ã«ãŽãªãºã ããã€ããŒãã©ã¡ãŒã¿ïŒ ãå€ããŠã¿ãã
- çµæïŒã¢ãã«ã®æ§èœïŒ ãèšé²ããã
ãããäœåºŠãç¹°ãè¿ããã¡ã«ããããïŒååäžçªè¯ãã£ãã¢ãã«ãã©ã®ãã©ã¡ãŒã¿ã䜿ã£ããã ã£ãïŒãããã®çµæãåºããããŒã¿ã»ããã¯ã©ãã ã£ãïŒããšæ··ä¹±ããŠããŸãã®ããªãã§ããç¹ã«æ°é±éåŸãæ°ã¶æåŸã«åãçµæãåçŸããããšãããšãå°çãèŠãŸãã
ããã§ç»å Žããã®ããæ¬æ¥äž»åœ¹ã®ã©ã€ãã©ãªãmlflow ã§ãã
𧪠æ¯å©ã§çè§£ããmlflow
mlflowã®æ žå¿çãªåœ¹å²ã¯ãçããã®æ©æ¢°åŠç¿ãããžã§ã¯ãããæ··æ²ãšããããã¡ããã¡ãã®ãããã³ããããæŽç¶ãšãããææ°éã®ããžã¿ã«å®éšå®€ãã«å€ããããšã§ãã
mlflowã¯äž»ã«ä»¥äžã®3ã€ã®ã³ã³ããŒãã³ãïŒæ©èœïŒã§æ§æãããŠããŸãããåå¿è ã®æ¹ããŸãçç®ãã¹ãã¯ãMLflow TrackingïŒãã©ããã³ã°ïŒãã§ãã
-
MLflow TrackingïŒå®éšããŒãã®èªåèšé²ïŒ:
- ã¢ãã«ã®åŠç¿ãå®è¡ãããã³ã«ã䜿çšãããã€ããŒãã©ã¡ãŒã¿ãåŠç¿æéãè©äŸ¡ææšïŒç²ŸåºŠãF1ã¹ã³ã¢ãªã©ïŒããããŠåŠç¿ã«äœ¿ã£ãããŒã¿ã»ããã®æ å ±ãèªåã§èšé²ããŠãããŸãã
- ããã¯ãçãããææžãã§ããŒãã«ãæ¥ä»ïŒ10/25ããã©ã¡ãŒã¿ïŒÎ±=0.01ãçµæïŒAccuracy 85%ããšèšé²ããŠããäœæ¥ããã³ãŒããæ°è¡è¿œå ããã ãã§èªååããŠãããã€ã¡ãŒãžã§ãã
-
MLflow ModelsïŒã¢ãã«ã®æšæºåãããä¿åïŒ:
- åŠç¿ãå®äºãããæåã¢ãã«ãããã©ã®ç°å¢ã§ãç°¡åã«ããŒãã§ããããã«æšæºåããã圢åŒã§ä¿åããŠãããŸããããã«ãããPythonç°å¢ãéã£ãŠããåãã¢ãã«ãããã«å©çšã§ããŸãã
-
MLflow ProjectsïŒåçŸæ§ã®é«ãããã±ãŒãžåïŒ:
- ä»ã®äººãããªãã®ã³ãŒããå®è¡ããéã«ãå¿ èŠãªäŸåé¢ä¿ïŒã©ã€ãã©ãªã®ããŒãžã§ã³ãªã©ïŒãèªåã§èšå®ãã誰ã§ãåãçµæãåºããããã«ãããžã§ã¯ããããã±ãŒãžåããŸãã
ã€ãŸããmlflowã¯ãæ©æ¢°åŠç¿ã®å®éšãåçŸæ§ããããã€ã¡ã³ãã®ã©ã€ããµã€ã¯ã«å šäœã管çãããªãŒãã³ãœãŒã¹ãã©ãããã©ãŒã ããªã®ã§ãã
äž»ãªäœ¿çšäŸïŒmlflowãç䟡ãçºæ®ããç¬é
mlflowã®å°å ¥ãæã广ãçºæ®ããã®ã¯ãããªããã詊è¡é¯èª€ããç¹°ãè¿ããŠããæãã€ãŸãæ©æ¢°åŠç¿éçºã®æãéèŠãªãã§ãŒãºã§ãã
ð¯ 䜿çšäŸ 1: ãã©ã¡ãŒã¿ãã¥ãŒãã³ã°ã®ãæŠçžŸã管ç
æãäžè¬çãªçšéã§ããäŸãã°ãããžã¹ãã£ãã¯ååž°ã®Cå€ãããã¥ãŒã©ã«ãããã¯ãŒã¯ã®åŠç¿çïŒLearning RateïŒãå€ããŠã¢ãã«ãåŠç¿ããããšããŸãã
mlflowã䜿ããšãååŠç¿å®è¡ïŒRunïŒããšã«ã䜿çšããCå€ãšããã®çµæåŸããã粟床ïŒAccuracyïŒãèªåçã«ããŒã¿ããŒã¹ã«èšé²ãããŸããåŸããå°çšã®Web UIïŒãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ïŒãéãã ãã§ãã©ã®ãã©ã¡ãŒã¿ãæè¯ã®çµæããããããã®ããã°ã©ãã衚ã§äžç®çç¶ã«æ¯èŒã§ããŸãã
â mlflowããªãå Žå: æ¯åçµæãExcelãJupyter Notebookã®ã»ã«ã«åºåããæåã§æ¯èŒããã â mlflowãããå Žå: å®è¡ããã ãã§èªåã§æŽçããããã€ã§ãWeb UIã§ç¢ºèªã§ããã
ð 䜿çšäŸ 2: éå»ã®ãæåã¢ãã«ãã®å®å šåçŸ
æ°ã¶æåã«éçºããã¢ãã«ãéåžžã«è¯ãæ§èœãåºããŠããŠããããæ¬çªç°å¢ã«ãããã€ããå¿ èŠãåºãŠãããšããŸãã
mlflowã¯ãã¢ãã«ãã¡ã€ã«èªäœã ãã§ãªããããã®ã¢ãã«ãåŠç¿ããæã®ãã€ããŒãã©ã¡ãŒã¿ãã䜿çšãããã¬ãŒãã³ã°ããŒã¿ã®ãã¹ããå®è¡ããPythonã³ãŒãã®ããã·ã¥å€ïŒgitã³ãããIDãªã©ïŒããŸã§å šãŠçŽä»ããŠèšé²ããŸãã
ããã«ãããéå»ã®Run IDãæå®ããã ãã§ããå®å šã«åãæ¡ä»¶ãã§ã¢ãã«ãåçŸãããããããã€ãããããããšãå¯èœã«ãªããŸããããã¯ãç¹ã«èŠå¶ã®å³ããæ¥çããããŒã ã§éçºããéã«ãä¿¡é Œæ§ãæ ä¿ããäžã§äžå¯æ¬ ãªæ©èœã§ãã
ð€ 䜿çšäŸ 3: ããŒã éã§ã®å®éšçµæã®å ±æ
ããŒã¿ãµã€ãšã³ã¹ããŒã ã§è€æ°ã®ã¡ã³ããŒãåæã«ç°ãªãã¢ãããŒãã§ã¢ãã«éçºãé²ããŠããç¶æ³ãæ³åããŠãã ããã
mlflowã®ãã©ããã³ã°ãµãŒããŒãå ±æããããšã§ãAãããå®è¡ããå®éšã®çµæããBãããããã«Web UIäžã§ç¢ºèªã§ããŸããããã«ãããç¡é§ãªéè€å®éšãé¿ãããããäºãã®ç¥èŠãããã«å ±æãããããããšãå¯èœã«ãªããããŒã å šäœã®éçºå¹çãåçã«åäžããŸãã
mlflowã¯ãåãªããèšé²ããŒã«ãã§ã¯ãªããæ©æ¢°åŠç¿ãããžã§ã¯ãã®ãä¿¡é Œæ§ããšãå¹çããé£èºçã«åäžãããããã®ããŸãã«å¿ é ã®ã€ã³ãã©ã¹ãã©ã¯ãã£ãªã®ã§ãã
2. ð» ã€ã³ã¹ããŒã«æ¹æ³
mlflowã®ã€ã³ã¹ããŒã«ã¯éåžžã«ç°¡åã§ããPythonã®ããã±ãŒãžç®¡çããŒã« pip ã䜿ã£ãŠã以äžã®ã³ãã³ããå®è¡ããã ãã§ãã
pip install mlflow scikit-learn pandas
â» ä»åã®ãµã³ãã«ã³ãŒãã§ã¯scikit-learnãšpandasã䜿çšããã®ã§ãäžç·ã«ã€ã³ã¹ããŒã«ããŠãããšäŸ¿å©ã§ãã
ã€ã³ã¹ããŒã«ãå®äºããããæ¬¡ã«é²ãåã«ãmlflowã®ãã©ããã³ã°ãµãŒããŒãèµ·åããŠãããŸããããããããå®éšçµæãèšé²ããWeb UIã§ç¢ºèªããããã®ãããžã¿ã«å®éšå®€ãã®å ¥ãå£ã§ãã
ããŒã«ã«ç°å¢ã§èµ·åããå Žåã以äžã®ã³ãã³ããã¿ãŒããã«ã§å®è¡ããŸãã
mlflow ui
ãã®ã³ãã³ããå®è¡ãããšãé垞㯠http://127.0.0.1:5000 ã®ãããªã¢ãã¬ã¹ã衚瀺ãããŸãããã©ãŠã¶ã§ãã®URLãéããŠã¿ãŠãã ããããŸã äœãèšé²ãããŠããªãã®ã§çã£çœã§ããããããmlflowã®ç®¡çç»é¢ã§ãïŒãã®ã¿ãŒããã«ã¯èµ·åãããŸãŸã«ããŠãããŠãã ããã
3. ð ïž å®éã«åäœãããµã³ãã«ã³ãŒã
ããã§ã¯ãå®éã«scikit-learnã®ç°¡åãªã¢ãã«ãmlflowã䜿ã£ãŠç®¡çããã³ãŒããèŠãŠã¿ãŸããããããã¯ã³ããŒïŒããŒã¹ãã§å³åº§ã«å®è¡å¯èœã§ãã
ãã®äŸã§ã¯ãæåãªIrisïŒã¢ã€ã¡ïŒããŒã¿ã»ããã䜿ã£ãŠãããžã¹ãã£ãã¯ååž°ã¢ãã«ãåŠç¿ãããã®ãã©ã¡ãŒã¿ãšè©äŸ¡ææšãmlflowã«èšé²ããŸãã
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import mlflow
import mlflow.sklearn
# ----------------------------------------------------------------------
# 1. å®éšã®èšå®
# ----------------------------------------------------------------------
# å®éšåãå®çŸ©ïŒãããæå®ããªããš'Default'ã«ãªããŸãïŒ
EXPERIMENT_NAME = "Iris_Classification_Experiment"
mlflow.set_experiment(EXPERIMENT_NAME)
# ----------------------------------------------------------------------
# 2. ããŒã¿ã®æºå (IrisããŒã¿ã»ãããæš¡æ¬)
# ----------------------------------------------------------------------
# æ¬æ¥ã¯ããŒã¿ã»ãããããŒãããŸãããããã§ã¯ç°¡åãªãããŒããŒã¿ã§ä»£çš
data = {
'sepal_length': [5.1, 4.9, 4.7, 4.6, 5.0, 7.0, 6.4, 6.9, 5.5, 6.5],
'sepal_width': [3.5, 3.0, 3.2, 3.1, 3.6, 3.2, 3.2, 3.1, 2.3, 2.8],
'petal_length': [1.4, 1.4, 1.3, 1.5, 1.4, 4.7, 4.5, 4.9, 4.0, 4.6],
'target': [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
}
df = pd.DataFrame(data)
X = df[['sepal_length', 'sepal_width', 'petal_length']]
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# ----------------------------------------------------------------------
# 3. MLflow Runã®éå§ãšã¢ãã«åŠç¿
# ----------------------------------------------------------------------
# ããããmlflowã®è¿œè·¡ãå§ãŸããŸã
with mlflow.start_run():
# --- 3-1. ãã€ããŒãã©ã¡ãŒã¿ã®å®çŸ©ãšèšé² ---
# ä»å詊ããããã©ã¡ãŒã¿
C_param = 0.1
random_state_param = 42
# mlflowã«ãã©ã¡ãŒã¿ãèšé²
mlflow.log_param("C", C_param)
mlflow.log_param("random_state", random_state_param)
# --- 3-2. ã¢ãã«ã®åŠç¿ ---
model = LogisticRegression(C=C_param, random_state=random_state_param)
model.fit(X_train, y_train)
# --- 3-3. ã¢ãã«ã®è©äŸ¡ãšèšé² ---
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"ã¢ãã«ã®ç²ŸåºŠ (Accuracy): {accuracy}")
# mlflowã«è©äŸ¡ææšãèšé²
mlflow.log_metric("accuracy", accuracy)
# --- 3-4. ã¢ãã«ã®ä¿å ---
# ã¢ãã«èªäœãmlflowã®Artifactsã«ä¿å
mlflow.sklearn.log_model(model, "model")
# è£è¶³æ
å ±ãèšé²ïŒã¿ã°ä»ãïŒ
mlflow.set_tag("Model Type", "Logistic Regression")
mlflow.set_tag("Data Source", "Dummy Iris Data")
print("å®éšãå®äºããçµæãmlflowã«èšé²ãããŸããã")
print("mlflow UI (http://127.0.0.1:5000) ã§çµæã確èªããŠãã ããã")
ãã®ã³ãŒããå®è¡ããåŸããã©ãŠã¶ã§ http://127.0.0.1:5000 ãéããŠã¿ãŠãã ãããæ°ããäœæãããIris_Classification_Experimentãã®äžã«ãä»å®è¡ããRunïŒå®éšïŒãèšé²ãããŠããã¯ãã§ãïŒ
4. ð ã³ãŒãã®è©³çŽ°èª¬æ
äžèšã®ãµã³ãã«ã³ãŒãããmlflowã®åºæ¬çãªäœ¿ãæ¹ïŒTrackingïŒã®ãã¹ãŠãç¶²çŸ ããŠããŸããåå¿è ã®æ¹ãç¹ã«çè§£ãã¹ãã³ãŒãã®å¡ïŒãã£ã³ã¯ïŒã«ã€ããŠã詳ãã解説ããŸãã
A. å®éšã®å®çŸ©ãšéå§ (mlflow.set_experiment & mlflow.start_run)
# å®éšåãå®çŸ©ïŒãããæå®ããªããš'Default'ã«ãªããŸãïŒ
EXPERIMENT_NAME = "Iris_Classification_Experiment"
mlflow.set_experiment(EXPERIMENT_NAME)
# ããããmlflowã®è¿œè·¡ãå§ãŸããŸã
with mlflow.start_run():
# ... ã¢ãã«åŠç¿ã³ãŒã ...
ð¡ 解説ïŒå®éšïŒExperimentïŒãšå®è¡ïŒRunïŒã®éã
mlflowãçè§£ããäžã§æãéèŠãªã®ããExperimentïŒå®éšïŒãšRunïŒå®è¡ïŒã®é¢ä¿ã§ãã
- Experiment (å®éš): 倧æ ã®ãããžã§ã¯ãåããŸãã¯ç¹å®ã®ã¿ã¹ã¯åã§ããäŸãã°ããIrisããŒã¿ã»ããã®åé¡ãããæ ªäŸ¡äºæž¬ã¢ãã«v2ããªã©ãé¢é£ããè€æ°ã®è©Šè¡ããŸãšãããã©ã«ãã®ãããªãã®ã§ãã
mlflow.set_experiment()ã§æå®ããŸãã - Run (å®è¡): Experimentã®äžã§è¡ããããå ·äœçãªãäžåºŠã®è©Šè¡ãã§ãããã©ã¡ãŒã¿ãå€ããŠåŠç¿ãããã³ã«ãæ°ããRunãéå§ãããŸãã
with mlflow.start_run(): ã¯ãããããä»ããæ°ãã詊è¡ãå§ãããïŒããšãã宣èšã§ãããã® with ãããã¯ã®äžã§å®è¡ãããã¢ãã«åŠç¿ã«é¢ãããã¹ãŠã®æ
å ±ããèªåçã«ãã®Runã«çŽä»ããããŠèšé²ãããŸãã
B. ãã©ã¡ãŒã¿ã®èšé² (mlflow.log_param)
# ä»å詊ããããã©ã¡ãŒã¿
C_param = 0.1
random_state_param = 42
# mlflowã«ãã©ã¡ãŒã¿ãèšé²
mlflow.log_param("C", C_param)
mlflow.log_param("random_state", random_state_param)
ð¡ 解説ïŒåçŸæ§ã®ãéµã
mlflow.log_param() ã¯ãã¢ãã«ã®åŠç¿ã«åœ±é¿ãäžãããã€ããŒãã©ã¡ãŒã¿ãèšå®å€ãèšé²ããããã«äœ¿çšããŸãã
æ©æ¢°åŠç¿ã«ãããŠãçµæãåçŸããããã«ã¯ãã©ã®ãã©ã¡ãŒã¿ã䜿ã£ããããç¥ãããšãäžå¯æ¬ ã§ãããã®ã³ãŒãã§ã¯ãããžã¹ãã£ãã¯ååž°ã®æ£ååãã©ã¡ãŒã¿ C ãšãä¹±æ°ã®ã·ãŒã random_state ãèšé²ããŠããŸãã
mlflow UIã§ã¯ãRunããšã«ãããã®ãã©ã¡ãŒã¿ã衚圢åŒã§è¡šç€ºãããããããã©ã¡ãŒã¿ãå°ããã€å€ããŠ10åå®è¡ããå Žåãã©ã®Cå€ãè¯ãã£ãã®ããç¬æã«æ¯èŒã§ããŸãã
C. è©äŸ¡ææšã®èšé² (mlflow.log_metric)
# ã¢ãã«ã®è©äŸ¡ãšèšé²
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
# mlflowã«è©äŸ¡ææšãèšé²
mlflow.log_metric("accuracy", accuracy)
ð¡ 解説ïŒçµæã®ãèŠããåã
mlflow.log_metric() ã¯ãã¢ãã«ã®æ§èœã瀺ãè©äŸ¡ææšïŒã¡ããªãã¯ïŒãèšé²ããŸãããã®äŸã§ã¯ accuracy ãèšé²ããŠããŸãããF1ã¹ã³ã¢ãRMSEãAUCãªã©ããããžã§ã¯ãã«å¿ããŠå¿
èŠãªææšãããã€ã§ãèšé²ã§ããŸãã
ã¡ããªãã¯ã¯ããã©ããã³ã°UIäžã§èªåçã«ã°ã©ãåãããŸããäŸãã°ãåŠç¿ã®ãšããã¯ããšã®æå€±ïŒLossïŒãèšé²ããŠãããšãåŠç¿æ²ç·ã®æšç§»ãèŠèŠçã«è¿œè·¡ã§ãããããã¢ãã«ããªãŒããŒãã£ããã£ã³ã°ïŒéåŠç¿ïŒããŠããªãããªã©ã倿ããã®ã«åœ¹ç«ã¡ãŸãã
D. ã¢ãã«ã®ä¿å (mlflow.sklearn.log_model)
# ã¢ãã«èªäœãmlflowã®Artifactsã«ä¿å
mlflow.sklearn.log_model(model, "model")
ð¡ 解説ïŒãããã€ã®ãæºåã
ããã¯éåžžã«åŒ·åãªæ©èœã§ããmlflow.sklearn.log_model() ãå®è¡ãããšãåŠç¿ãå®äºãã model ãªããžã§ã¯ãããmlflowç¬èªã®æšæºåœ¢åŒã§ä¿åãããŸãã
ãã®ä¿åãããã¢ãã«ã¯ãmlflowã®ArtifactsïŒææç©ïŒãšããŠRunã«çŽä»ããããŸããä¿åãããã®ã¯ã¢ãã«ãã¡ã€ã«ã ãã§ãªãããã®ã¢ãã«ãããŒãããããã«å¿ èŠãªç°å¢æ å ±ïŒconda.yamlãã¡ã€ã«ãªã©ïŒãäžç·ã«ä¿åãããŸãã
ããã«ãããåŸã§ãã®ã¢ãã«ãæ¬çªç°å¢ã§äœ¿ãéãmlflow.sklearn.load_model() ãšããç°¡åãªã³ãã³ãäžã€ã§ãå¿
èŠãªäŸåé¢ä¿ãããšãã¢ãã«ã埩å
ããããã«äºæž¬ã«äœ¿ããç¶æ
ã«ã§ããŸãã
E. ã¿ã°ã®èšé² (mlflow.set_tag)
# è£è¶³æ
å ±ãèšé²ïŒã¿ã°ä»ãïŒ
mlflow.set_tag("Model Type", "Logistic Regression")
mlflow.set_tag("Data Source", "Dummy Iris Data")
ð¡ è§£èª¬ïŒæ€çŽ¢ãšåé¡ãå©ãããã©ãã«ã
mlflow.set_tag() ã¯ããã©ã¡ãŒã¿ã§ãã¡ããªãã¯ã§ããªããRunã«é¢ããä»»æã®ã¡ã¿ããŒã¿ãèšé²ããããã«äœ¿ãããŸãã
äŸãã°ãããã®å®éšã¯Aããã®ã¢ã€ãã¢ã«åºã¥ããŠãããããã®ã¢ãã«ã¯GPUã䜿ã£ãŠåŠç¿ããããšãã£ããåŸã§Runãæ€çŽ¢ãããåé¡ãããããã®ã«åœ¹ç«ã€æ å ±ãèªç±ã«ä»äžã§ããŸããããã«ãããèšå€§ãªå®éšèšé²ã®äžããç®çã®RunãçŽ æ©ãèŠã€ãåºãããšãã§ããŸãã
5. â ïž æ³šæç¹ãŸãã¯ãã³ã
mlflowã䜿ãå§ããã°ããã®åå¿è ãã€ãŸãããããç¹ããŸãã¯ç¥ã£ãŠãããšéçºãæ Œæ®µã«æ¥œã«ãªããã³ãã2ã€å³éžããŠç޹ä»ããŸãã
ðš æ³šæç¹ 1: ãã©ããã³ã°ãµãŒããŒïŒUIïŒã®èµ·åãå¿ããªãããš
å€ãã®æ¹ãé¥ããããã®ããmlflow ui ã³ãã³ããå®è¡ãå¿ããŠãã³ãŒããå®è¡ããŠããŸãããšã§ãã
ã³ãŒãå
ã§ mlflow.start_run() ãå®è¡ãããšãmlflowã¯ããã©ã«ãã§ããŒã«ã«ã®ãã¡ã€ã«ã·ã¹ãã ïŒéåžžã¯å®è¡ãããã£ã¬ã¯ããªå
ã® ./mlruns ãã©ã«ãïŒã«å®éšçµæãèšé²ããããšããŸãã
mlflow uiãèµ·åããŠããå Žå: èšé²ãããçµæããã©ãŠã¶ã§èŠèŠçã«ç¢ºèªã§ããŸããmlflow uiãèµ·åããŠããªãå Žå: çµæã¯èšé²ãããŸããããã©ãŠã¶ã§ç¢ºèªã§ããããããïŒèšé²ãããŠããªãïŒããšåéãããŠããŸãããšããããŸãã
ãã³ã: éçºç°å¢ïŒããŒã«ã«PCïŒã§äœæ¥ããå Žåãå¿
ãã¿ãŒããã«ã2ã€éããçæ¹ã§ mlflow ui ãå®è¡ãããŸãŸã«ããŠãããŸãããããŸãã¯ãã³ãŒãã®æåã« mlflow.set_tracking_uri("file:///path/to/your/mlruns") ã®ããã«æç€ºçã«èšé²å
ãæå®ãããã®å ŽæãèŠããŠããããã«ããŸãããã
ð¡ ãã³ã 2: autolog æ©èœã§èšé²ã®æéããŒãã«ïŒ
mlflowã«ã¯ãäž»èŠãªæ©æ¢°åŠç¿ã©ã€ãã©ãªïŒscikit-learn, TensorFlow, PyTorchãªã©ïŒãšé£æºããŠããã©ã¡ãŒã¿ãã¡ããªãã¯ã®èšé²ãèªååããŠãããéåžžã«äŸ¿å©ãªæ©èœããããŸããããã mlflow.autolog() ã§ãã
äŸãã°ãscikit-learnã䜿ãå Žåãã¢ãã«ã®åŠç¿ã³ãŒãã®åã«ãã£ãäžè¡è¿œå ããã ãã§ããã€ããŒãã©ã¡ãŒã¿ãã¡ããªãã¯ããããŠåŠç¿æžã¿ã¢ãã«ã®ä¿åãŸã§ãå šãŠãèªåã§ãã£ãŠãããŸãã
import mlflow.sklearn
# 远跡ãéå§ããåã«autologãæå¹ã«ãã
mlflow.sklearn.autolog()
# with mlflow.start_run(): ã¯åŒãç¶ãæšå¥šãããŸããã
# autologãæå¹ãªããlog_paramãlog_metricãèªåã§æžãå¿
èŠã¯ãããŸããïŒ
# ã¢ãã«åŠç¿ã³ãŒã...
# model.fit(X_train, y_train)
# ããã ãã§ãC, random_state, accuracyãªã©ãèªåã§èšé²ãããŸãïŒ
åå¿è
ã®ãã¡ã¯ãŸã log_param ã log_metric ã§æåèšé²ã®ä»çµã¿ãçè§£ããã®ãè¯ãã§ãããå®åã«å
¥ã£ãã autolog ãæŽ»çšããããšã§ãèšé²æŒããé²ããéçºã¹ããŒãã倧å¹
ã«åäžãããããšãã§ããŸãã
6. ð äžç·ã«èŠãŠãããšè¯ãã©ã€ãã©ãª
mlflowãã¢ãã«ã®å®éšçµæãã¡ã¿ããŒã¿ã®ç®¡çïŒMLOpsã®MïŒModel ManagementïŒã«ç¹åããŠããã®ã«å¯Ÿããæ©æ¢°åŠç¿ã®åçŸæ§ã«ãããŠããäžã€éåžžã«éèŠãªèŠçŽ ããããŸããããã¯ãããŒã¿ãã§ãã
次ã«åŠã¶ã¹ãã¯ãDVC (Data Version Control) ã§ãã
DVC (Data Version Control)
圹å²
DVCã¯ãGitãã³ãŒãã®ããŒãžã§ã³ã管çããããã«ãããŒã¿ã»ãããæ©æ¢°åŠç¿ã¢ãã«ã®ããŒãžã§ã³ã管çããããã®ããŒã«ã§ãã
ãªãäžç·ã«åŠã¶ã¹ããïŒ
mlflowã¯ããã®ãã©ã¡ãŒã¿ã§ãã®çµæãåºãããšããã¡ã¿ããŒã¿ãèšé²ããŸããããã®ãçµæããçã¿åºããããŒã¿ã»ããèªäœãæéã®çµéãšãšãã«å€ãã£ãŠããŸããšãåçŸæ§ã¯ä¿èšŒã§ããŸããã
DVCã䜿ããšããv1ã®ããŒã¿ã»ããããv2ã®ããŒã¿ã»ãããã®ããã«ãããŒã¿ã«æç¢ºãªããŒãžã§ã³ãã€ããã©ã®Runãã©ã®ããŒãžã§ã³ã®ããŒã¿ã䜿ã£ãã®ãã远跡ã§ããŸãã
- mlflow: å®éšã®ã¬ã·ãïŒãã©ã¡ãŒã¿ãšçµæïŒã管ç
- DVC: å®éšã®ææïŒããŒã¿ïŒã管ç
ãã®äºã€ãçµã¿åãããããšã§ããã©ã®ã³ãŒããã©ã®ããŒã¿ãã©ã®ãã©ã¡ãŒã¿ãã§åŠç¿ããã®ããå®å šã«è¿œè·¡ã§ããã匷åºãªæ©æ¢°åŠç¿ã®åçŸæ§åºç€ã宿ããŸãã
7. ð ãŸãšã
仿¥ã¯ãæ©æ¢°åŠç¿éçºã«ããããæ··ä¹±ãããç§©åºãã«å€ãã匷åãªããŒã«ãmlflowã«ã€ããŠåŠã³ãŸããã
mlflowã¯ãåãªã䟿å©ãªããŒã«ã§ã¯ãªããçŸä»£ã®æ©æ¢°åŠç¿ãããžã§ã¯ããæåã«å°ãããã®ãæšæºçãªã€ã³ãã©ãã«ãªãã€ã€ãããŸãããã®ã©ã€ãã©ãªã䜿ãããªãããã©ããã§ãçããã®ãããžã§ã¯ãã®å質ãšãããŒã ã§ã®éçºå¹çã倧ããå€ãã£ãŠããŸãã
ð 仿¥ã®èŠç¹å確èª
- mlflow Tracking ã¯ãã¢ãã«ã®åŠç¿ã«å¿
èŠãªãã©ã¡ãŒã¿ãã¡ããªãã¯ãã¢ãã«ãã¡ã€ã«ãªã©ãRunïŒå®è¡ïŒåäœã§èªåèšé²ããŸãã2.
mlflow uiã³ãã³ãã§ãã©ããã³ã°ãµãŒããŒãèµ·åãããã©ãŠã¶ã§çµæãèŠèŠçã«ç¢ºèªã§ããŸãã3. ExperimentïŒå®éšïŒ ãš RunïŒå®è¡ïŒ ã®æŠå¿µãçè§£ããããšããmlflow掻çšã®ç¬¬äžæ©ã§ãã4.log_param()ãlog_metric()ãlog_model()ã®3ã€ã®é¢æ°ãè¿œè·¡ã®æ žå¿ã§ãã
ð¡ èªè ãžã®ææŠèª²é¡
ãµã³ãã«ã³ãŒããäžåºŠå®è¡ããŠæºè¶³ããã ãã§ãªãããã²ä»¥äžã®ææŠã詊ããŠã¿ãŠãã ããã
- ãã©ã¡ãŒã¿ãå€ããŠåå®è¡: ãµã³ãã«ã³ãŒãã®
C_paramã0.001ã1.0ãªã©ã«å€ããŠãåèš3åå®è¡ããŠã¿ãŠãã ããã2. UIã§æ¯èŒ:mlflow uiãéããŠã3ã€ã®Runã®çµæããã§ãã¯ããã¯ã¹ã§éžæãããCompareããã¿ã³ãæŒããŠã¿ãŠãã ãããã©ã®ãã©ã¡ãŒã¿ãæãé«ã粟床ïŒAccuracyïŒãåºããã®ããäžç®ã§æ¯èŒã§ããã¯ãã§ãã3. ã¡ããªãã¯ã®è¿œå :mlflow.log_metric()ã䜿ã£ãŠãscikit-learnã®f1_scoreã远å ã§èšé²ããŠã¿ãŠãã ããã
ãã®ææŠãéããŠãmlflowãããªãã®å®éšç®¡çã®åŒ·åãªå³æ¹ã«ãªãããšã宿ã§ããã¯ãã§ãã
ããæŽç·ŽãããããŒã¿ãµã€ãšã³ãã£ã¹ããžã®äžæ©ãèžã¿åºããŸãããïŒããã§ã¯ããŸã次åã®èšäºã§ãäŒãããŸãããïŒð
ð æšå¥šã¿ã° (ããã·ã¥ã¿ã°)
-
æ©æ¢°åŠç¿
-
mlflow