英文鏈接:https://mlflow.org/docs/latest/tracking.html
本文鏈接:https://www.cnblogs.com/CheeseZH/p/11945089.html
MLflow Tracking
MLflow Tracking組件提供了API和UI,用於記錄並可視化展示機器學習代碼運行過程中的參數,代碼版本,評價指標和輸出文件。MLflow Tracking可以讓你通過Python,REST API,R API或Java API來記錄和查詢試驗。
一些概念
MLflow Tracking圍繞着runs的概念進行組織,runs是一些數據科學代碼片段的執行。一個run記錄了以下信息:
Code Version/代碼版本
如果run是來自一個MLflow項目,那么版本就是代碼的Git提交對應的hash值。
Start&End Time/起止時間
run的開始時間和結束時間。
Source/源文件
啟動run的文件名,或者MLflow項目的項目名和入口。
Parameters/參數
所選輸入參數的Key-Value對,Key和Value都是字符串。
Metrics/評價指標
Key-value指標,value是數值。每個指標都可以在run的執行過程中被更新(比如記錄模型損失函數的收斂曲線),MLflow記錄並可視化指標的完整歷史。
Artifacts/模型產品
任何格式的輸出文件。你可以記錄圖片,模型或者數據文件。
你可以通過MLflow Python,R,Java或者REST APIs來記錄runs。比如你可以記錄一個單獨的程序,可以記錄遠程及其或者交互式notebook。如果你記錄MLflow項目的runs,MLflow會記住項目URI和源文件的版本。
你可以通過experiments來組織runs,experiments是用於特定任務的一組runs。你可以通過以下方式創建一個experiment
:
mlflow experiments
命令- mlflow.create_experiment()
- 使用對應的REST API
- MLflow API和UI讓你可以創建和搜索experiments
當你的runs被記錄之后,你可以通過Tracking UI或者MLflow API來查詢。
Runs被記錄在哪?
MLflow runs可以被存儲在本地文件,SQLAlchemy兼容的數據庫或者遠程的服務器。默認情況下,MLflow Python API會把runs記錄在你的運行程序所在的目錄的mlruns
子目錄。你可以使用mlflow ui
查看記錄的runs。
如果把runs存儲到遠程服務器,需要配置環境變量MLFLOW_TRACKING_URI
或者調用mlflow.set_tracking_uri()
。
URI可以有多種形式:
- 本地路徑,格式為
/my/local/dir
- 數據庫,格式為
<dialect>+<driver>://<username>:<password>@<host>:<port>/<database>
,Mlflow支持mysql,sqlite,postgresql等多種SQLAlchemy數據庫 - HTTP服務器,格式為
https://my-server:5000
,該服務是一個MLflow tracking server。 - Databricks工作空間,格式為
databricks
或者databricks://<profileName>
,一個Databricks CLI profile。更多信息參考文檔或者Databricks社區版快速入門。
把數據保存成runs
你可以通過MLflow Python,R,Java或者REST API來把數據保存成runs,本章節主要介紹Python API。
Logging Functions/日志函數
mlflow.set_tracking_uri() 連接一個記錄URI,也可以通過環境變量MLFLOW_TRACKING_URI
來配置,默認是本地的mlruns
目錄。
mlflow.tracking.get_tracking_uri()返回當前的記錄URI。
mlflow.create_experiment()創建一個新experiment並返回ID。通過將ID傳入mlflow.start_run
可以啟動experiment下面的runs。
mlflow.set_experiment()激活一個experiment。如果experiment不存在,則創建一個。
mlflow.start_run()返回當前激活的run,或者啟動一個新的run並返回一個mlflow.ActiveRun
對象。不需要顯示調用start_run,如果沒有激活狀態的run,日志函數會自動創建一個。
mlflow.end_run()結束當前處於激活狀態的run。
mlflow.active_run()返回一個mlflow.entities.Run對象。
mlflow.log_param()記錄一個當前run的key-value參數。使用mlflow.log_params()可以記錄多個參數。
mlflow.log_metric()記錄一個當前run的key-value指標。MLflow會記錄每個metric的所有歷史值。使用mlflow.log_metrics()可以記錄多個指標。
mlflow.set_tag()給當前run設置一個key-value標簽。使用mlflow.set_tags()設置多個標簽。
mlflow.log_artifact()把一個本地文件或目錄存儲為一個artifact,可以通過artifact_path指定run的artifact URI。Run artifacts可以通過目錄的方式組織。
mlflow.log_artifacts()把指定目錄下的所有文件存儲為一個artifact。
mlflow.get_artifact_uri()返回當前run指定的artifact URI。
在一個程序中啟動多個runs
有時候你希望能夠在一個程序中啟動多個runs,比如你在執行一個超參數搜索程序或者你的experiments運行非常快。mlflow.start_run()返回的ActiveRun對象是一個python context manager。你可以通過以下代碼塊來限定每個run的范圍。
with mlflow.start_run():
mlflow.log_param("x", 1)
mlflow.log_metric("y", 2)
...
在with語句中,這個run會保持打開狀態,語句退出或者有異常時會自動關閉。
通過指標記錄模型表現
你通過log方法來記錄各個指標,log方法提供了兩個可選方法用於區分指標的x-axis:timestamp和step。
timestamp是metric被記錄的時間,默認是當前時間。
step是訓練過程的量化值,可以是迭代次數,輪數或者其他值,默認是0並且有以下要求和特性:
- 一定是個合法的64位整型
- 可以是負數
- 可以是非連續的,比如(1,3,2)也是合法的
- 可以有跳躍性的,比如(1,5,74,-10)也是合法的
你可以同時指定timestamp和step,MLflow會分別存儲。
Python示例:
with mlflow.start_run():
for epoch in range(0, 3):
mlflow.log_metric(key="quality", value=2*epoch, step=epoch)
可視化指標
下圖取自quick start,包含一個step x-axis和兩個timestamp x-axis。
自動記錄TensorFlow和Keras的日志(experimental)
在訓練之前調用mlflow.tensorflow.autolog()或mlflow.keras.autolog()即可,參考Tensorflow和Keras的例子。
自動記錄以下信息:
注意 tf.keras 使用 mlflow.tensorflow.autolog(), 而不是 mlflow.keras.autolog().
組織experiments中的runs
MLflow允許你在experiments中組織runs,這樣可以方便的對比處理同個任務的不同runs。你可以通過命令行mlflow experiments
或者python API mlflow.create_experiment()創建experiments。你可以在命令行中為單獨的run指定experiment,例如mlflow run ... --experiment-name [name]
或者通過環境變量MLFLOW_EXPERIMENT_NAME
來指定。或者用experiment ID(--experiment-id命令行參數或者MLFLOW_EXPERIMENT_ID環境變量)也行。
# Set the experiment via environment variables
export MLFLOW_EXPERIMENT_NAME=fraud-detection
mlflow experiments create --experiment-name fraud-detection
# Launch a run. The experiment is inferred from the MLFLOW_EXPERIMENT_NAME environment
# variable, or from the --experiment-name parameter passed to the MLflow CLI (the latter
# taking precedence)
with mlflow.start_run():
mlflow.log_param("a", 1)
mlflow.log_metric("b", 2)
通過追蹤服務API來管理Experiments和Runs
MLflow提供了更詳細的追蹤服務API來管理experiments和runs,主要是用mlflow.tracking模塊的client SDK。這樣就可以查詢過去runs的數據,記錄更多日志,創建experiments,添加tag等。
from mlflow.tracking import MlflowClient
client = MlflowClient()
experiments = client.list_experiments() # returns a list of mlflow.entities.Experiment
run = client.create_run(experiments[0].experiment_id) # returns mlflow.entities.Run
client.log_param(run.info.run_id, "hello", "world")
client.set_terminated(run.info.run_id)
為Runs添加標簽
mlflow.tracking.MlflowClient.set_tag()方法可以為runs添加個性化標簽。一個標簽一次只能有一個唯一值。例如:
client.set_tag(run.info.run_id, "tag_key", "tag_value")
注意:不要用mlflow作為tag的前綴,以下是系統tags
。
追蹤UI
追蹤UI能夠可視化,搜索,對比runs,也能下載run的產品或者元數據。
如果將runs記錄在本地mlruns目錄,只需要在mlruns的上層目錄中運行mlfow ui就可以。
或者你也可以通過MLflow tracking server來訪問遠程的runs。
UI主要包括以下功能:
- 基於experiment的run列表和對比
- 根據參數或者指標搜索runs
- 可視化run的指標
- 下載run的結果
通過編程查詢runs
引用artifacts
- /Users/me/path/to/local/model
- relative/path/to/local/model
-
/ . 例如: - s3://my_bucket/path/to/model
- hdfs://
: / - runs:/<mlflow_run_id>/run-relative/path/to/model
例如
# Tracking API
mlflow.log_artifacts("<mlflow_run_id>", "/path/to/artifact")
# Models API
mlflow.pytorch.load_model("runs:/<mlflow_run_id>/run-relative/path/to/model")
MLflow Tracking Servers
你可以通過mlflow server
命令啟動一個tracking server,一個樣例配置:
mlflow server \
--backend-store-uri /mnt/persistent-disk \
--default-artifact-root s3://my-mlflow-bucket/ \
--host 0.0.0.0
存儲
一個MLflow tracking server包含兩個存儲組件:后端存儲和產品存儲。
后端存儲用於保存experiment和run的元數據,比如參數,指標,標簽等。后端存儲支持兩種類型:文件存儲,數據庫存儲。通過--backend-store-uri
來配置后端存儲類型。
- ./path_to_store 或者 file:/path_to_store
- SQLAlchemy database URI:
+ 😕/ : @ : / ,比如--backend-store-uri sqlite:///mlflow.db會使用本地的SQLite數據庫。
默認--backend-store-uri是./mlruns目錄。
產品存儲需要存儲大量數據以及客戶端記錄的輸出產品(例如模型)。artifact_location是mlflow.entities.Experiment的一個屬性。artifact_uri是mlflow.entities.RunInfo的一個屬性用於標明當前run的所有artifacts需要保存在哪里。
使用--default-artifact-root (默認./mlruns目錄)來配置默認的存儲位置。
Artifact存儲
- Amazon S3
- Azure Blob Storage
- Google Cloud Storage
- FTP server
- SFTP Server
- NFS
- HDFS
Logging to a Tracking Server
通過環境變量MLFLOW_TRACKING_URI
或者調用mlflow.set_tracking_uri()來指定Tracking服務器。
然后mlflow.start_run(), mlflow.log_param(), 和 mlflow.log_metric()會向指定的tracking服務器發送API請求。
import mlflow
remote_server_uri = "..." # set to your server URI
mlflow.set_tracking_uri(remote_server_uri)
# Note: on Databricks, the experiment name passed to mlflow_set_experiment must be a
# valid path in the workspace
mlflow.set_experiment("/my-experiment")
with mlflow.start_run():
mlflow.log_param("a", 1)
mlflow.log_metric("b", 2)
其他參考項目
- Multistep Workflow Example project:查詢runs並構建一個多步驟工作流
- TensorFlow example:訓練,導出,加載模型並使用模型進行預測。
- Hyperparameter Tuning Example project: 自動搜索模型的最佳超參數