【机器学习】使用MLflow管理机器学习模型版本
作者 | àlex Escolà Nixon?
編譯 | VK?
來源 | Towards Data Science
在機器學習項目中工作通常需要大量的實驗,例如嘗試不同的模型、特征、不同的編碼方法等。
我們都遇到過一個非常常見的問題,就是改變模型中的一些設置或參數,并意識到我們之前的運行可能會產生更好的結果。我們可以回到過去并不容易。或者由于其他原因,我們的可追溯性可能會發生變化,或者因為其他原因,我們的模型會發生變化。
這就是MLflow發揮作用的地方,在我們的機器學習生命周期中帶來可追溯性和可再現性。
在這篇文章中,我將向你展示如何在本地設置MLflow以及使用PostgreSQL注冊模型和管理端到端機器學習生命周期的數據庫備份存儲。
另外,在這里有一個筆記本,上面有所有的代碼和解釋:https://github.com/AlexanderNixon/Machine-learning-reads/blob/master/Model_versioning_with_MLflow.ipynb
介紹
MLflow提供了四個主要組件:跟蹤、項目、模型和注冊表。在這篇文章中,我們將關注所有組件。項目,這是一個用于打包數據科學代碼的更通用的工具思想。而下面簡要概述了其他組件的目標:
MLflow跟蹤:記錄和查詢實驗:代碼、數據、配置和結果
MLflow模型:在不同的服務環境中記錄和部署機器學習模型
模型注冊表:在中央存儲庫中存儲、注釋、發現和管理模型
換句話說,「MLflow跟蹤」將允許我們記錄模型運行的所有參數、指標等。
我們將使用「MLflow模型」來記錄給定的模型(盡管這個組件也用于部署ML模型)。而「模型注冊表」可以對現有模型進行“版本化”,將它們從發布過渡到生產,并更好地管理ML項目的生命周期。
模型注冊表,需要為要存儲的所有數據設置一個數據庫。在后端存儲區中說明:
?為了使用模型注冊表功能,必須使用支持的數據庫來運行服務器
?我們可以在本地文件中記錄所有的度量和模型,但是如果我們想利用MLflow的模型注冊表組件,我們需要建立一個數據庫。
在本文中,我們將學習如何:
設置本地postgreSQL數據庫作為MLflow的后端存儲
創建MLflow實驗并跟蹤參數、度量和其他
注冊模型,允許階段轉換和模型版本控制
安裝程序
我將使用WSL來處理一個Ubuntu終端環境,這將使后端存儲的設置更加容易,conda將創建一個具有我們所需依賴關系的環境。
讓我們先用python 3.8創建一個環境,以及我們將要使用的一些基本依賴項:
conda?create?--name?mlflow?python==3.8?matplotlib?scikit-learn然后通過conda安裝postgresql:
conda?install?-y?-c?conda-forge?postgresql設置postgreSQL
然后,我們需要做的第一件事是通過initdb創建一個新的PostgreSQL數據庫集群,并使用以下命令啟動de database server:
initdb pg_ctl?-D?/home/<your?user>/pgdata?-l?logfile?start現在我們將使用psql來啟動PostgreSQL交互終端。我們可以通過訪問postgres數據庫來完成此操作,該數據庫已在安裝中提供:
psql?--dbname?postgres我們需要指定一些現有的數據庫(例如postgres),因為默認情況下psql將嘗試連接到與你的用戶同名的數據庫,由于它不存在,它將返回一個錯誤。
進入交互終端后,為mlflow創建一個新的數據庫,以存儲所有注冊的模型:
postgres=#?CREATE?DATABASE?mlflow_db;并添加新的用戶和密碼以在訪問數據庫時進行身份驗證:
CREATE?USER?mlflow?WITH?ENCRYPTED?PASSWORD?'mlflow'; GRANT?ALL?PRIVILEGES?ON?DATABASE?mlflow_db?TO?mlflow;我們可以看到,用戶已正確創建為:
postgres=#?\du我們還可以檢查數據庫是否已正確創建,并且用戶mlflow可以訪問:
\list如果一切正常,現在可以退出控制臺:
postgres=#?\q「postgreSQL中到底有哪些內容?」
我們建立的本地數據庫將包含與我們注冊的模型相關的數據。我們可以通過使用psql--dbname mlflow_db連接到數據庫來查看其內容。然后,我們可以使用\dt查看MLflow正在創建的表:
例如,params表包含注冊模型版本的所有生成參數:
MLflow
現在是時候開始MLflow了。讓我們從pip安裝mlflow和psycolpg2開始,這是一個針對Python的PostgreSQL適配器,我們將需要:
pip?install?mlflow pip?install?psycopg2-binary并為MLflow創建一個目錄,以存儲每次運行中生成的所有文件:
mkdir?~/mlruns現在一切都準備好運行MLflow跟蹤服務器了!為此,運行mlflow server,將postgreSQL指定為--backend-store-uri,其格式通常為<dialect>+<driver>://<username><password>@<host>:<post>/<database>,以及--default-artifact-root,其中包含我們創建mlruns文件夾的路徑:
mlflow?server?--backend-store-uri?postgresql://mlflow:mlflow@localhost/mlflow_db?--default-artifact-root?file:/home/<your?user>/mlruns?-h?0.0.0.0?-p?8000你應該會看到這樣的東西:
現在可以訪問指定地址中的MLflow UIhttp://localhost:8000,并應看到:
請注意,有兩個主要部分:
實驗:你將保存你的不同的“項目”
模型:包含所有已注冊的模型(下一節將對此進行詳細說明)
請注意,每個實驗都與一個實驗ID相關聯,這一點很重要,因為MLflow將在mlruns下創建一個新的文件夾,其中包含每次運行中生成的模型和工件。
在討論MLflow的跟蹤和模型組件的一些示例之前,讓我們先用我們創建的環境設置一個筆記本。
Jupyter筆記本設置
如果還沒有安裝jupyter,我們首先需要在環境中安裝jupyter:
conda?install?jupyter設置——沒有瀏覽器會阻止瀏覽器在筆記本被服務后自動打開,如果通過WSL執行,則會引發錯誤。
jupyter?notebook?--port=8889?--no-browser現在復制指定的url,其格式為http://localhost:8889/?token=<some token>。進入瀏覽器并創建一個筆記本。你會注意到你創建的conda環境不能作為內核使用。為此,你必須先安裝它。運行:
sudo?/home/<your?user>/anaconda3/envs/mlflow_training/bin/python?-m?ipykernel?install?--name?mlflow如果你現在刷新筆記本,你應該可以看到環境。
登錄MLflow
要開始登錄MLflow,你需要將MLflow_TRACKING_URI環境變量設置為MLflow正在服務的跟蹤操作系統環境os.environ['MLFLOW_TRACKING_URI'] = 'http://localhost:8000/'。
讓我們創建一個虛擬示例,將DecisionTreeClassifier擬合到iris數據集:
from?matplotlib?import?pyplot?as?plt from?sklearn.datasets?import?load_iris from?sklearn.model_selection?import?train_test_split from?sklearn.tree?import?DecisionTreeClassifier,?plot_tree,?export_graphviz from?sklearn.metrics?import?accuracy_score import?osos.environ['MLFLOW_TRACKING_URI']?=?'http://localhost:8000/'#?加載iris數據集 X,?y?=?load_iris(return_X_y=True) X_train,?X_test,?y_train,?y_test?=?train_test_split(X,?y,?train_size=.3)#?分類器的擬合與測試 dt_params?=?{'max_depth':?5,?'max_features':?'sqrt',?'min_samples_split':6} dt?=?DecisionTreeClassifier(**dt_params) dt.fit(X_train,?y_train) y_pred?=?dt.predict(X_test) acc?=?accuracy_score(y_test,?y_pred).round(3)#?保存 plt.figure(figsize=(10,10)) t?=?plot_tree(dt,feature_names=['sepal?length',?'sepal?width',?'petal?length',?'petal?width'],class_names=load_iris()['target_names'],filled=True,label='all',rounded=True) tree_plot_path?=?"dtree.jpg" plt.savefig(tree_plot_path)現在讓我們創建一個MLflow實驗,并記錄模型、其參數和我們獲得的度量:
import?mlflowmlflow.set_experiment('DecisionTreeClassifier')with?mlflow.start_run(run_name='basic?parameters'):mlflow.sklearn.log_model(sk_model=dt,artifact_path='',registered_model_name='tree_model')mlflow.log_params(dt_params)mlflow.log_metric('Accuracy',?acc)mlflow.log_artifact(tree_plot_path,?artifact_path='plots')使用with語句,我們記錄的所有內容都將與同一次運行相關,并且一旦退出子句,就結束MLflow。
MLflow有一組內置的模型風格,這正是我們在這里通過mlflow.sklearn.log_model注銷scikit-learn模型所使用的風格。在部署這些模型時,這很方便,因為MLflow為每種風格添加了許多專門考慮的工具。
注意,除了將上述所有內容記錄到運行中,我們還將這個模型注冊為一個新版本(如果它不存在,它將創建這個模型和一個0版本),因為我們在mlflow.sklearn.log_model中使用了參數registered_model_name。
首先讓我們看看記錄的運行在UI中是什么樣子:
現在,你將在創建的決策樹分類器實驗中看到一個新的運行,其中包含所有記錄的信息。我們可以通過單擊“開始時間”下的實際運行來查看更多詳細信息。在這里,我們將看到有關參數和指標的更多信息:
以及其他一些字段,如日志記錄、自動生成的conda環境(如果我們想部署模型,則非常有用)和序列化模型:
MLflow模型
在“模型”部分,你將找到已注冊的所有模型。通過選擇其中一個,本例中的tree_model,你將看到該模型的所有現有版本。請注意,每次以相同的名稱注冊新模型時,都會創建一個新版本。
一旦運行了一些已注冊的模型,你將得到如下內容:
通過選擇特定模型并單擊“階段”部分,可以將模型從一個階段過渡到另一個階段:
在一篇文章中,這些知識可能已經足夠了:)
在下一篇文章中,我將向你展示使用MLflow的一些更高級的示例,展示它的一些其他特性,例如自動日志記錄,或者如何為注冊的模型提供服務。
非常感謝你抽出時間閱讀這篇文章。
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯 本站知識星球“黃博的機器學習圈子”(92416895) 本站qq群704220115。 加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【机器学习】使用MLflow管理机器学习模型版本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win11 32位官方版原版镜像文件v2
- 下一篇: 【数据竞赛】图像赛排行榜拉开100名差距