<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    【機(jī)器學(xué)習(xí)】使用MLflow管理機(jī)器學(xué)習(xí)模型版本

    共 5512字,需瀏覽 12分鐘

     ·

    2021-02-02 20:48

    作者 | àlex Escolà Nixon?

    編譯 | VK?

    來(lái)源 | Towards Data Science

    在機(jī)器學(xué)習(xí)項(xiàng)目中工作通常需要大量的實(shí)驗(yàn),例如嘗試不同的模型、特征、不同的編碼方法等。

    我們都遇到過(guò)一個(gè)非常常見(jiàn)的問(wèn)題,就是改變模型中的一些設(shè)置或參數(shù),并意識(shí)到我們之前的運(yùn)行可能會(huì)產(chǎn)生更好的結(jié)果。我們可以回到過(guò)去并不容易?;蛘哂捎谄渌?,我們的可追溯性可能會(huì)發(fā)生變化,或者因?yàn)槠渌?,我們的模型?huì)發(fā)生變化。

    這就是MLflow發(fā)揮作用的地方,在我們的機(jī)器學(xué)習(xí)生命周期中帶來(lái)可追溯性和可再現(xiàn)性。

    在這篇文章中,我將向你展示如何在本地設(shè)置MLflow以及使用PostgreSQL注冊(cè)模型和管理端到端機(jī)器學(xué)習(xí)生命周期的數(shù)據(jù)庫(kù)備份存儲(chǔ)。

    另外,在這里有一個(gè)筆記本,上面有所有的代碼和解釋?zhuān)篽ttps://github.com/AlexanderNixon/Machine-learning-reads/blob/master/Model_versioning_with_MLflow.ipynb


    介紹

    MLflow提供了四個(gè)主要組件:跟蹤、項(xiàng)目、模型和注冊(cè)表。在這篇文章中,我們將關(guān)注所有組件。項(xiàng)目,這是一個(gè)用于打包數(shù)據(jù)科學(xué)代碼的更通用的工具思想。而下面簡(jiǎn)要概述了其他組件的目標(biāo):

    • MLflow跟蹤:記錄和查詢(xún)實(shí)驗(yàn):代碼、數(shù)據(jù)、配置和結(jié)果

    • MLflow模型:在不同的服務(wù)環(huán)境中記錄和部署機(jī)器學(xué)習(xí)模型

    • 模型注冊(cè)表:在中央存儲(chǔ)庫(kù)中存儲(chǔ)、注釋、發(fā)現(xiàn)和管理模型

    換句話(huà)說(shuō),「MLflow跟蹤」將允許我們記錄模型運(yùn)行的所有參數(shù)、指標(biāo)等。

    我們將使用「MLflow模型」來(lái)記錄給定的模型(盡管這個(gè)組件也用于部署ML模型)。而「模型注冊(cè)表」可以對(duì)現(xiàn)有模型進(jìn)行“版本化”,將它們從發(fā)布過(guò)渡到生產(chǎn),并更好地管理ML項(xiàng)目的生命周期。

    模型注冊(cè)表,需要為要存儲(chǔ)的所有數(shù)據(jù)設(shè)置一個(gè)數(shù)據(jù)庫(kù)。在后端存儲(chǔ)區(qū)中說(shuō)明:

    ?

    為了使用模型注冊(cè)表功能,必須使用支持的數(shù)據(jù)庫(kù)來(lái)運(yùn)行服務(wù)器

    ?

    我們可以在本地文件中記錄所有的度量和模型,但是如果我們想利用MLflow的模型注冊(cè)表組件,我們需要建立一個(gè)數(shù)據(jù)庫(kù)。

    在本文中,我們將學(xué)習(xí)如何:

    • 設(shè)置本地postgreSQL數(shù)據(jù)庫(kù)作為MLflow的后端存儲(chǔ)

    • 創(chuàng)建MLflow實(shí)驗(yàn)并跟蹤參數(shù)、度量和其他

    • 注冊(cè)模型,允許階段轉(zhuǎn)換和模型版本控制


    安裝程序

    我將使用WSL來(lái)處理一個(gè)Ubuntu終端環(huán)境,這將使后端存儲(chǔ)的設(shè)置更加容易,conda將創(chuàng)建一個(gè)具有我們所需依賴(lài)關(guān)系的環(huán)境。

    讓我們先用python 3.8創(chuàng)建一個(gè)環(huán)境,以及我們將要使用的一些基本依賴(lài)項(xiàng):

    conda?create?--name?mlflow?python==3.8?matplotlib?scikit-learn

    然后通過(guò)conda安裝postgresql:

    conda?install?-y?-c?conda-forge?postgresql

    設(shè)置postgreSQL

    然后,我們需要做的第一件事是通過(guò)initdb創(chuàng)建一個(gè)新的PostgreSQL數(shù)據(jù)庫(kù)集群,并使用以下命令啟動(dòng)de database server:

    initdb
    pg_ctl?-D?/home//pgdata?-l?logfile?start

    現(xiàn)在我們將使用psql來(lái)啟動(dòng)PostgreSQL交互終端。我們可以通過(guò)訪(fǎng)問(wèn)postgres數(shù)據(jù)庫(kù)來(lái)完成此操作,該數(shù)據(jù)庫(kù)已在安裝中提供:

    psql?--dbname?postgres

    我們需要指定一些現(xiàn)有的數(shù)據(jù)庫(kù)(例如postgres),因?yàn)槟J(rèn)情況下psql將嘗試連接到與你的用戶(hù)同名的數(shù)據(jù)庫(kù),由于它不存在,它將返回一個(gè)錯(cuò)誤。

    進(jìn)入交互終端后,為mlflow創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù),以存儲(chǔ)所有注冊(cè)的模型:

    postgres=#?CREATE?DATABASE?mlflow_db;

    并添加新的用戶(hù)和密碼以在訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)時(shí)進(jìn)行身份驗(yàn)證:

    CREATE?USER?mlflow?WITH?ENCRYPTED?PASSWORD?'mlflow';
    GRANT?ALL?PRIVILEGES?ON?DATABASE?mlflow_db?TO?mlflow;

    我們可以看到,用戶(hù)已正確創(chuàng)建為:

    postgres=#?\du

    我們還可以檢查數(shù)據(jù)庫(kù)是否已正確創(chuàng)建,并且用戶(hù)mlflow可以訪(fǎng)問(wèn):

    \list

    如果一切正常,現(xiàn)在可以退出控制臺(tái):

    postgres=#?\q

    「postgreSQL中到底有哪些內(nèi)容?」

    我們建立的本地?cái)?shù)據(jù)庫(kù)將包含與我們注冊(cè)的模型相關(guān)的數(shù)據(jù)。我們可以通過(guò)使用psql--dbname mlflow_db連接到數(shù)據(jù)庫(kù)來(lái)查看其內(nèi)容。然后,我們可以使用\dt查看MLflow正在創(chuàng)建的表:

    例如,params表包含注冊(cè)模型版本的所有生成參數(shù):


    MLflow

    現(xiàn)在是時(shí)候開(kāi)始MLflow了。讓我們從pip安裝mlflow和psycolpg2開(kāi)始,這是一個(gè)針對(duì)Python的PostgreSQL適配器,我們將需要:

    pip?install?mlflow
    pip?install?psycopg2-binary

    并為MLflow創(chuàng)建一個(gè)目錄,以存儲(chǔ)每次運(yùn)行中生成的所有文件:

    mkdir?~/mlruns

    現(xiàn)在一切都準(zhǔn)備好運(yùn)行MLflow跟蹤服務(wù)器了!為此,運(yùn)行mlflow server,將postgreSQL指定為--backend-store-uri,其格式通常為+://@:/,以及--default-artifact-root,其中包含我們創(chuàng)建mlruns文件夾的路徑:

    mlflow?server?--backend-store-uri?postgresql://mlflow:mlflow@localhost/mlflow_db?--default-artifact-root?file:/home//mlruns?-h?0.0.0.0?-p?8000

    你應(yīng)該會(huì)看到這樣的東西:

    現(xiàn)在可以訪(fǎng)問(wèn)指定地址中的MLflow UIhttp://localhost:8000,并應(yīng)看到:

    請(qǐng)注意,有兩個(gè)主要部分:

    • 實(shí)驗(yàn):你將保存你的不同的“項(xiàng)目”

    • 模型:包含所有已注冊(cè)的模型(下一節(jié)將對(duì)此進(jìn)行詳細(xì)說(shuō)明)

    請(qǐng)注意,每個(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è)置

    如果還沒(méi)有安裝jupyter,我們首先需要在環(huán)境中安裝jupyter:

    conda?install?jupyter

    設(shè)置——沒(méi)有瀏覽器會(huì)阻止瀏覽器在筆記本被服務(wù)后自動(dòng)打開(kāi),如果通過(guò)WSL執(zhí)行,則會(huì)引發(fā)錯(cuò)誤。

    jupyter?notebook?--port=8889?--no-browser

    現(xiàn)在復(fù)制指定的url,其格式為http://localhost:8889/?token=。進(jìn)入瀏覽器并創(chuàng)建一個(gè)筆記本。你會(huì)注意到你創(chuàng)建的conda環(huán)境不能作為內(nèi)核使用。為此,你必須先安裝它。運(yùn)行:

    sudo?/home//anaconda3/envs/mlflow_training/bin/python?-m?ipykernel?install?--name?mlflow

    如果你現(xiàn)在刷新筆記本,你應(yīng)該可以看到環(huán)境。

    登錄MLflow

    要開(kāi)始登錄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?os

    os.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)

    #?分類(lèi)器的擬合與測(cè)試
    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?mlflow

    mlflow.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語(yǔ)句,我們記錄的所有內(nèi)容都將與同一次運(yùn)行相關(guān),并且一旦退出子句,就結(jié)束MLflow。

    MLflow有一組內(nèi)置的模型風(fēng)格,這正是我們?cè)谶@里通過(guò)mlflow.sklearn.log_model注銷(xiāo)scikit-learn模型所使用的風(fēng)格。在部署這些模型時(shí),這很方便,因?yàn)镸Lflow為每種風(fēng)格添加了許多專(zhuān)門(mén)考慮的工具。

    注意,除了將上述所有內(nèi)容記錄到運(yùn)行中,我們還將這個(gè)模型注冊(cè)為一個(gè)新版本(如果它不存在,它將創(chuàng)建這個(gè)模型和一個(gè)0版本),因?yàn)槲覀冊(cè)趍lflow.sklearn.log_model中使用了參數(shù)registered_model_name。

    首先讓我們看看記錄的運(yùn)行在UI中是什么樣子:

    現(xiàn)在,你將在創(chuàng)建的決策樹(shù)分類(lèi)器實(shí)驗(yàn)中看到一個(gè)新的運(yùn)行,其中包含所有記錄的信息。我們可以通過(guò)單擊“開(kāi)始時(shí)間”下的實(shí)際運(yùn)行來(lái)查看更多詳細(xì)信息。在這里,我們將看到有關(guān)參數(shù)和指標(biāo)的更多信息:

    以及其他一些字段,如日志記錄、自動(dòng)生成的conda環(huán)境(如果我們想部署模型,則非常有用)和序列化模型:

    MLflow模型

    在“模型”部分,你將找到已注冊(cè)的所有模型。通過(guò)選擇其中一個(gè),本例中的tree_model,你將看到該模型的所有現(xiàn)有版本。請(qǐng)注意,每次以相同的名稱(chēng)注冊(cè)新模型時(shí),都會(huì)創(chuàng)建一個(gè)新版本。

    一旦運(yùn)行了一些已注冊(cè)的模型,你將得到如下內(nèi)容:

    通過(guò)選擇特定模型并單擊“階段”部分,可以將模型從一個(gè)階段過(guò)渡到另一個(gè)階段:


    在一篇文章中,這些知識(shí)可能已經(jīng)足夠了:)

    在下一篇文章中,我將向你展示使用MLflow的一些更高級(jí)的示例,展示它的一些其他特性,例如自動(dòng)日志記錄,或者如何為注冊(cè)的模型提供服務(wù)。

    非常感謝你抽出時(shí)間閱讀這篇文章。


    往期精彩回顧





    本站知識(shí)星球“黃博的機(jī)器學(xué)習(xí)圈子”(92416895)

    本站qq群704220115。

    加入微信群請(qǐng)掃碼:

    瀏覽 89
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)
    評(píng)論
    圖片
    表情
    推薦
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    日韩黄片大全亚卅久久… | 尤物网在线观看 | 久久网站免费 | 国模格格(1) | 这里只有精品视频 |