MLflow机器学习工作流管理使用教程
MLflow簡介
機器學習不是一個單向的pipeline,而是一個迭代的循環。其中包括四大部分:數據預處理、模型訓練、模型部署、數據更新。
行業痛點:
MLflow是一個管理機器學習生命周期的開源平臺( Github項目地址),直面行業痛點。
接下來對MLflow的使用分為三個流程介紹:參數追蹤、工程、模型
參數追蹤(MLflow Tracking)
Tracking server
使用參數追蹤功能前需要指定追蹤服務器,默認情況下單機啟動mlflow本機將作為參數服務器,默認uri為http://localhost:5000。如果參數服務器部署在遠端,參數服務器可以收集多臺client端運行得到的參數。
啟動server命令行如下:
- –backend-store-uri是記錄任務參數、指標、標簽等字段信息的地址,默認會存本地路徑,即這些字段信息以文件的形式存在server啟動目錄下的./mlruns路徑中。除了本地路徑,還可以用數據庫記錄這些字段的信息。
- –default-artifact-root是存儲client端輸出的大型文件,如文本、圖片、模型文件等。artifacts文件默認會存在client端運行工程的./mlruns路徑下,官方建議將artifacts存在Amazon S3, FTP server, HDFS等共享文件路徑下。
- –workers可以指定gunicorn worker的數量,默認是4個。
- –gunicorn-opts可以添加額外操作。
在代碼中使用Tracking
參數追蹤能選擇性記錄入口程序的參數和性能指標(如模型的超參、模型性能指標、業務評價指標等),理論上入口程序中暴露的任何參數和指標都可以記錄,使用者可以依據需求靈活記錄需要的指標。
使用tracking記錄參數是代碼侵入式的,在最開始需要指定追蹤服務器的uri、實驗的名字、選擇性添加實驗標簽(標簽必須是key : value形式,string類型)
下面是示例實驗的配置:
下面的代碼是一個記錄黑盒調參結果的demo:
# hyperopt黑盒調參 def mlflow_hyperopt(data_cleaner):train_data, test_data, eva_data = data_cleaner.do_job()lr = LogisticRegressionTrainer(train_data, test_data, Processing.SEPARATE.value)def objective(args):log_reg = LogisticRegression(C=args["C"], max_iter=int(args["max_iter"]),solver="lbfgs",class_weight={0: 0.9, 1: 0.1})log_reg.fit(lr.get_x_train().values, lr.get_y_train().values.ravel())y_pred = log_reg.predict(lr.get_x_test())return -accuracy_score(lr.get_y_test().values.ravel(), y_pred)space = {"max_iter": hp.choice("max_iter", range(50, 250)), # 確定參數搜索范圍"C": hp.uniform("C", 0.1, 1)}max_evals = 20algo = tpe.suggest # 選擇尋參函數best = fmin(objective, space, algo=algo, max_evals=max_evals, verbose=1)# mlflow代碼入侵部分# 記錄黑盒調參的最優參數和結果with mlflow.start_run(run_name='V0.0.4', nested=True):mlflow.log_params(best)mlflow.log_param("max_evals", str(max_evals))mlflow.log_metric('accuracy', abs(objective(best)))代碼第21行用’with’開頭調用start_run()表示tracking開始,用這種方式不需要再使用end_run()去終止當前實驗。
start_run(run_id=None, experiment_id=None, run_name=None, nested=False)- run_id:可以手動指定也可以自動生成,如果沒有指定則可以使用experiment_id和run_name標簽
- experiment_id:實驗所處目錄名稱
- run_name:多次實驗可以處在同一個experiment_id對應目錄下,本次實驗的名稱,可以作為區分每次實驗的標簽
- nested:本次實驗是否某一次實驗的子實驗
- log_param以key: value的形式記錄參數,且參數均為string類型
- log_params以字典的形式記錄多個參數,且參數均為string類型
- log_metric以key: value的形式記錄指標,key是string類型value為float類型
- log_metrics以字典的形式記錄多個參數,字典key、value字段類型同與log_metric一致
在MLflow UI中進行實驗篩選和對比
MLflow支持類sql的方式,依據實驗標簽或者實驗結果對多次實驗進行篩選(可以參考下面兩個圖示的操作)。此外MLflow還支持簡單的可視化實驗結果對比,這部分功能可以在實踐中慢慢嘗試和摸索。
當然除了UI篩選,MLflow還支持java和python使用api的方式對實驗結果篩選。
工程(MLflow Projects)
構建工程
注意:工程依賴環境有多種選擇,以下案例工程均以conda作為依賴環境
構建MLflow工程只需要在原始工程根目錄下添加MLproject和conda.yaml兩個文件。MLproject負責記錄這個項目的主要信息,conda.yaml記錄項目依賴環境。
如上MLproject示例文件所示,文件包含:
- 項目名稱
- 依賴環境文件
- 入口程序(可以是多個)
- 如果在入口程序中設置了監聽外界輸入,可以指定入口程序的參數(也可以是默認參數)
如上conda.yaml示例文件所示,文件包含:
- 頻道默認為conda
- 項目名稱
- 依賴包
如果依賴的包比較多可以使用如下的命令將整個虛擬環境中的包都導出,建議每個項目在單獨的虛擬環境中開發保證最小的依賴。
運行工程
目前支持工程本地運行和git運行,本質上二者并無區別,使用git運行工程時會將整個工程從遠程倉庫拖拽到本地的臨時路徑中。建議使用git管理工程項目,方便版本管理與實驗結果對比。
運行工程可以使用api也可以使用命令行的方式。
在cmd下使用 mlflow run 命令即可實現任務的提交,下面是一個提交運行的示例:
提交任務的option含義如下:
- -v 版本:git管理的工程可以提交指定版本的任務,方便任務的復現
- -e 入口程序:默認調用MLproject文件中的main,調用其他入口需要指定
- -p 參數:入口程序中的參數列表,未提供調用默認參數
- -b 工程部署方式:默認使用local部署方式
- –no-conda 依賴環境:指定后任務將會在當前環境中運行,否則會下載conda.yaml中的依賴包
其他參數可以通過 $ mlflow run --help 命令查看
注意:由于工程依賴環境有多種,工程部署也可以多種方式,如databricks、kubernetes
模型(MLflow Models)
生成模型
MLflow Models相關文檔對Models模塊的定義為:這是一套標準格式來對模型結果進行打包,并可以被下游工具(如在線REST API服務和Apache Spark的批處理)所使用。
目前MLflow支持主流框架的模型格式,即下文提到的模型flavor參數,目前支持的flavor有如下幾種:
在tracking中使用api即可完成對模型文件的存儲,下例是使用sk-learn風格對模型文件存儲:
使用任一方式均可
模型存儲地址默認為工程任務提交路徑下 ./mlruns 文件夾下,也可以通過 --default-artifact-root 參數指定模型文件存儲在hdfs等共享文件夾下。
將模型文件放在工程artifacts文件下可以看到模型文件包含:
- MLmodel:模型基本信息描述
- conda.yaml:依賴環境
- model.pkl:模型壓縮文件
模型部署
UI部署
MLflow支持在artifacts路徑下使用ui點擊實現模型部署,生成模型服務如下例所示:
目前ui部署存在bug:不支持本地路徑artifacts下的模型部署
目前可以使用數據庫存儲的解決案例,但是該本部分依舊需要官方給出具體解決方案。
命令行下serve部署
啟動模型serve命令行如下:
- –model-uri 模型文件所在路徑,如本地文件runs:/runid/model
- –workers 指定處理請求的worker數量,默認為4
- –no-conda 指定后使用本地conda環境,否則會下載模型文件依賴環境中的包
命令行下起模型服務后即可用api調用服務,下面是使用’post’方式調用的示例:
注意:發送數據的json格式與request中的字段格式一致
模型批處理
在命令行下使用模型文件能進行數據的批量預測,批量預測命令行如下:
mlflow models predict [OPTIONS] mlflow models predict \--model-uri <model_uri> \--input-path <input_path> \--output-path <output_path> \--content-type <content_type> \--json-format <json_format> \--no-conda- –model-uri 模型文件所在路徑,如本地文件runs:/runid/model
- –input-path 輸入文件
- –output-path 輸出文件路徑,默認與輸入文件路徑一致
- –content-type 輸入文件格式,csv或json
- –json-format 如果輸入文件是json格式,需要指定json的風格
- –no-conda 指定后使用本地conda環境,否則會下載模型文件依賴環境中的包
除了命令行批量處理,還可以調用api使用spark udf實現批量預測。
該種方法的核心思想是將模型文件加載成spark_udf,利用udf實現分布式批量預測。spark udf批量預測示例如下:
該種方法比較適用于需要大批量預測的場景。
更詳細的文檔使用參考MLflow官方文檔
總結
以上是生活随笔為你收集整理的MLflow机器学习工作流管理使用教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: access查找出生日期年份_acces
- 下一篇: CPU和GPU对比