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