MLflow系列2:MLflow追蹤


英文鏈接: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()即可,參考TensorflowKeras的例子。

自動記錄以下信息:

注意 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)

其他參考項目


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM