sponsored links

攜程機器學習開發部署一體化平臺實踐之路

本文根據許鵬老師在〖2021 DAMS中國資料智慧管理峰會〗現場演講內容整理而成。

攜程機器學習開發部署一體化平臺實踐之路

(複製文末地址可獲取完整PPT)

講師介紹

許鵬,攜程 研發總監。專注於分散式計算和儲存,對Spark和PostgreSQL有深入研究,擁有多年Presto和Elasticsearch的運維經驗。

分享概要

一、模型開發到部署 – 路漫漫

二、模型開發全生命週期管理

三、MLFLOW全鏈路管理

四、統一化部署

五、小結

機器學習模型的開發和使用日趨火熱,隨著較大範圍的採用,一些隱藏的問題也浮出水面,最常見的就是模型開發部署鏈路太長,開發週期長,迭代成本高。本文就簡單聊一聊攜程機票是如何引入MLFLow來進行機器學習模型開發的全生命週期管理,對MLFlow進行了哪些適配和改進。

一、模型開發到部署 – 路漫漫

機器學習模型從開發到部署上線,並提供線上預測功能,是一個非常長的鏈路,用山路十八彎來形容一點不為過。

一般來說,整體流程涉及到以下幾個階段

  • 特徵工程
  • 模型選擇
  • 模型訓練
  • 模型測試
  • 模型部署
  • 模型效果評估和迭代

在整個開發鏈路中,演算法分析團隊負責模型訓練, 系統團隊負責模型部署。但分析團隊以何種方式把模型交給系統開發團隊來部署呢? 常見的是PMML檔案,這種方式最大的缺點就是模型呼叫前的資料預處理和預測後的資料整合要由系統開發團隊來完成,這意味著機器學習模型的程式碼邏輯要同時由演算法分析團隊和系統開發團隊來完成,不僅添加了轉譯成本,同時延長了整個模型上線的週期。

理想的方式是系統開發團隊實現一個好的模型部署平臺,演算法分析人員開發的模型程式碼中包含了資料預處理和模型結果的後處理功能,並且這個模型程式碼可以被平臺直接載入執行,系統開發團隊不直接觸及某一具體模型的程式碼開發。

演算法分析人員負責模型開發,而系統開發人員負責整個模型平臺的開發,以及滿足測試效能的模型上線。演算法分析團隊和系統開發團隊的職責範圍和邊界有清楚的規範和釐清。

二、模型開發全生命週期管理

有問題就有方案,在開源的世界裡就是這麼神奇!沒有做不到,只有想不到。

模型開發到部署的全生命週期管理方案可能就是我們要找的方向, 但具體選用哪一家就成了一個問題。

模型開發全生命週期管理的方案有很多,MLFlow是知名度很高的一個,由Apache Spark之後的公司Databricks出品,具有天然的品牌優勢和品牌號召力,該專案在github上獲得的星數超過10K。

三、MLFLOW全鏈路管理

MLFlow中涉及到的概念和元件比較多,一下子丟擲全圖,會引起理解上的偏差和混亂。我們先從最簡單最核心的問題開始,看看最樸素的方案是什麼,然後以此為前提和MLFLOW這個成熟的方案中元件對應起來理解,就要方便很多。

模型生命週期管理中最核心的問題是模型的儲存和載入, 如果由自己來實現這個功能,會如何進行操作?

其實思路也很簡單和直接,大體步驟如下

  • 訓練模型
  • 訓練好的模型進行序列化
  • 在生產環境反序列化模型並載入

以scikit-learn為例,舉一個最精簡的例子

1)模型訓練和持久化

from sklearn import svm
from sklearn import datasets
clf = svm.SVC()
X, y= datasets.load_iris(return_X_y=True)
clf.fit(X, y)
import pickle
model_filename = 'finalized_model.sav'
pickle.dumps(clf, open(model_filename, 'wb'))

2)模型載入和反序列化

model_filename = 'finalized_model.sav'
clf2 = pickle.loads(model_filename,'rb')
clf2.predict(X[0:1])

1、MLFlow主要功能模組

MLFLOW眾多元件中, 以Tracking Server最為核心和關鍵,Tracking Server充當模型管理中心的角色。

  • 訓練階段 訓練好的模型序列化之後儲存到Tracing Server
  • 部署階段 從tracking server下載檔案並反序列化

攜程機器學習開發部署一體化平臺實踐之路

具體來說, Tracking Server負責儲存的內容分為兩大類:

  • 模型檔案 內容儲存到artifacts server, 支援HDFS、S3、FTP Server
  • 元資料 內容儲存到資料庫backend store, 支援的資料庫包括MySQL、Sql Server、PostgreSQL

舉一個例子吧, examples/sklearn_elasticnet_wine/train.py, 這是mlflow專案中的一個example, mlflow的git地址:https://github.com/mlflow/mlflow.git

import os
import warnings
import sys
import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn.linear_model import ElasticNet
from urllib.parse import urlparse
import mlflow
import mlflow.sklearn
import logging

logging.basicConfig(level=logging.WARN)
logger = logging.getLogger(__name__)

def eval_metrics(actual, pred):
    rmse = np.sqrt(mean_squared_error(actual, pred))
    mae = mean_absolute_error(actual, pred)
    r2 = r2_score(actual, pred)
    return rmse, mae, r2

if __name__ == "__main__":
    warnings.filterwarnings("ignore")
    np.random.seed(40)

    # Read the wine-quality csv file from the URL
    csv_url = (
        "http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
    )
    try:
        data = pd.read_csv(csv_url, sep=";")
    except Exception as e:
        logger.exception(
            "Unable to download training & test CSV, check your internet connection. Error: %s", e
        )

    # Split the data into training and test sets. (0.75, 0.25) split.
    train, test = train_test_split(data)

    # The predicted column is "quality" which is a scalar from [3, 9]
    train_x = train.drop(["quality"], axis=1)
    test_x = test.drop(["quality"], axis=1)
    train_y = train[["quality"]]
    test_y = test[["quality"]]

    alpha = float(sys.argv[1]) if len(sys.argv) > 1 else 0.5
    l1_ratio = float(sys.argv[2]) if len(sys.argv) > 2 else 0.5

    with mlflow.start_run():
        lr = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, random_state=42)
        lr.fit(train_x, train_y)

        predicted_qualities = lr.predict(test_x)

        (rmse, mae, r2) = eval_metrics(test_y, predicted_qualities)

        print("Elasticnet model (alpha=%f, l1_ratio=%f):" % (alpha, l1_ratio))
        print("  RMSE: %s" % rmse)
        print("  MAE: %s" % mae)
        print("  R2: %s" % r2)

        mlflow.log_param("alpha", alpha)
        mlflow.log_param("l1_ratio", l1_ratio)
        mlflow.log_metric("rmse", rmse)
        mlflow.log_metric("r2", r2)
        mlflow.log_metric("mae", mae)

        tracking_url_type_store = urlparse(mlflow.get_tracking_uri()).scheme

        # Model registry does not work with file store
        if tracking_url_type_store != "file":

            # Register the model
            # There are other ways to use the Model Registry, which depends on the use case,
            # please refer to the doc for more information:
            # https://mlflow.org/docs/latest/model-registry.html#api-workflow
            mlflow.sklearn.log_model(lr, "model", registered_model_name="ElasticnetWineModel")
        else:
            mlflow.sklearn.log_model(lr, "model")

上述程式碼和一般的模型訓練的區別不大,就是引入了mlflow包,注意持久化模型,需要執行 start_fun(), 然後結合使用到的機器學習庫呼叫 log_model

2、線上模型服務

1)訓練和持久化模型

python train.py

模型訓練完成後,接下來要做的是模型部署和線上測試。

雖然訓練好的模型可以透過tracking server來拿到,但是為了成功實現反序列化, 模型使用到的依賴模組必須在執行環境中也要存在,不然會出現反序列化失敗。

MLFLOW自身支援serve功能,serve需要依賴於conda, 把依賴的library用conda.yaml來進行宣告。

2)MLProject

name: tutorial
conda_env: conda.yaml
entry_points:
  main:
    parameters:
      alpha: {type: float, default: 0.5}
      l1_ratio: {type: float, default: 0.1}
    command: "python train.py {alpha} {l1_ratio}"

3)conda.yaml

name: tutorial
channels:
  - conda-forge
dependencies:
  - python=3.7
  - pip
  - pip:
      - scikit-learn==0.23.2
      - mlflow>=1.0
      - pandas

4)conda自動安裝執行

mlflow models serve -m /Users/mlflow/mlflow-prototype/mlruns/0/7c1a0d5c42844dcdb8f5191146925174/artifacts/model -p 1234

3、自定義模型pyfunc

如果模型非常複雜,需要同時使用scikit learn和keras中的模型,那麼可以使用pyfunc模組來進行組裝。

class MyModel(mlflow.pyfunc.PythonModel):
    def load_context(self, context):
        # load your artifacts

    def predict(self, context, model_input):
        return my_predict(model_input.values)

1)模型持久化

mlflow.pyfunc.save_model(
        path=mlflow_pyfunc_model_path,
        python_model=MyModel(),
        artifacts=artifacts)

2)模型載入

loaded_model = mlflow.pyfunc.load_model(mlflow_pyfunc_model_path)

四、統一化部署

攜程機器學習開發部署一體化平臺實踐之路

MLFlow社群版已經提供了模型的tracking和部署,能夠滿足基本的生產環境部署要求。如果我們需要部署更多的模型或者支援同一模型不斷進行迭代,那麼還需要做一些改進和加強。

基於MLFLOW社群版,結合公司的生產部署工具,我們開發實現了EMOSS(Easy Model One-Stop Service), 下表給出了兩者之間的區別。

攜程機器學習開發部署一體化平臺實踐之路

攜程機器學習開發部署一體化平臺實踐之路

模型服務整體架構如上圖,呼叫流程描述如下:

  • 模型應用的客戶端會首先和模型的SOA Server進行互動,傳遞的訊息中含有要呼叫的Model名稱和餵給Model的入引數據
  • Model SOA Server根據Model名稱,把請求智慧路由到後臺的Model Restapi Server
  • Model Restapi Server負責模型的真正預測

1、基於pyfunc的統一化模板

class MyModel(mlflow.pyfunc.PythonModel):
    def preProcess(self, context, model_input):
      # preprocess

    def load_context(self, context):
        # load your artifacts

    def postProcess(self, context, model_input):
      # postprocess

    def predict(self, context, model_input):
      #preProcess
      #real_model = load_real_model
      #predict
      #postProcess  

每一個模型抽像成,預測前/預測/預測後

  • 預測前: 負責資料處理和部分特徵載入
  • 預測: 將處理好的資料餵給真正的模型
  • 預測後:將預測後的結果處理成客戶端易於理解的形式並返回

2、部署Docker化

Model Restapi Server執行在Docker環境, 所需要的Python Module會在Dockerfile指明,這樣生成的映象就會含有執行時所有的依賴檔案。如果後續迭代的模型版本依賴檔案發生更改,就意味著要修改Dockerfile並重新生成映象。

Model Restapi Server基於FastAPI進行開發, 採用和uvicorn結合的方式,請求能在較短時間內完成處理,提供了很好的服務效能。

3、水平擴容方案

如果模型呼叫的請求量非常大,需要考慮水平擴容。在水平擴容的方案上,使用的是7層代理的模式,使用公司提供的SLB服務,我們可以在幾分鐘內完成擴容工作。

這當中遇到的問題是基於7層的代理來水平擴容,會有比較明顯的長尾效應,P999的響應時間不是特別好。後續會嘗試Service Mesh和其它方案。

4、服務效能監控

為了方便效能監控,在Model SOA Server側和Model Restapi Server側分別進行了效能埋點,利用這些埋點資料可以方便計算出預測耗時和介面呼叫耗時。

這些埋點資料首先會落入到Kafka, 利用Flink同步到PostgreSQL, 在PostgreSQL中使用了timescaledb外掛 ,該外掛對時序資料自動進行分割槽,基於時間過濾掉不必要的分割槽,我們很快計算出相應的效能指標。

攜程機器學習開發部署一體化平臺實踐之路

五、小結

在我們的實踐中,還沒有涉及到單一一個請求,在做預測的時候,計算非常複雜,需要分散式計算才能滿足效能要求的場景, 這一塊如果後續在實際業務中有需求時,我們會做進一步的調研和試用。

本文的描述比較簡略,MLFLOW的功能很強大,迭代速度也很快,我們只使用到其中部分功能,難免有不夠準確的地方,還請各位看官多指正。

↓點這裡可下載本文PPT,提取碼:xp17

https://pan.baidu.com/share/init?surl=AGUM2kr2aFL3jC1ocpkI_w

關注公眾號【dbaplus社群】,獲取更多原創技術文章和精選工具下載

分類: 娛樂
時間: 2022-01-08

相關文章

《你好檢察官》,一部披著職場劇外衣的狗血弱智戀愛瑪麗蘇偶像劇

《你好檢察官》,一部披著職場劇外衣的狗血弱智戀愛瑪麗蘇偶像劇
<你好檢察官> 滿心歡喜的開啟<你好檢察官>,僅僅看了一集,我已經非常非常不好了. 這特麼又是一部以檢察官這個群體為噱頭的狗屎瑪麗蘇的無腦垃圾偶像戀愛劇. 我居然僅僅因為看了一 ...

顏值下滑用力過猛收視不如人意?請孫儷將有質感的職場劇進行到底

顏值下滑用力過猛收視不如人意?請孫儷將有質感的職場劇進行到底
"喜大普奔,國產都市職場劇終於支稜起來了!"這是我在看完<理想之城>後的最大感受!簡直都要喜極而泣,國產都市劇跌跌撞撞地走到現在,終於產生了一部真正意義上的都市職場劇. ...

初入職場的第一隻表,就這麼選

初入職場的第一隻表,就這麼選
愛寶時EPOS Emotion日夜無間機械男表:來自瑞士的獨立製表品牌,採用獨家24小時盤面,區分開白晝和黑夜的獨特風格設計,既可商務也可休閒. 漢米爾頓美國經典系列伯頓小秒針石英錶:全新伯頓腕錶融合 ...

《請叫我總監》林更新,譚松韻攜手演繹全新職場

《請叫我總監》林更新,譚松韻攜手演繹全新職場
譚松韻這位演員,不管是參演古裝劇還是現代劇,對人物設定的體現都很貼合.尤其是鄰家女孩的形象很是深入人心. 距離她上一部古裝劇<錦心似玉>落幕沒多久,很多人還沉浸在羅十一娘和徐令宜的感情中. ...

職場女生的獨特魅力

職場女生的獨特魅力
我喜歡職場女生. 當她們穿上工裝,或是收腰的黑色小西裝,或是潔白的收腰白襯衣,搭配修長的腿型的西褲,既能凸顯她們的身材,走起路來清新帶風,努力工作時又專注迷人. 她們的工裝,又或是小西裝搭配包臀裙,那 ...

給機會不珍惜?湖南臺女主持失誤頻頻,曾在《浪姐》吐槽不受重視

給機會不珍惜?湖南臺女主持失誤頻頻,曾在《浪姐》吐槽不受重視
對於湖南衛視的節目主持人,你最看好的是誰? 對於這個問題,如果在早幾年的時候,或許大家都會毫不猶豫地把票投給了何炅. 然而,自從去年收禮風波,以及今年因為父親被強制執行事件之後,何炅在大家心中的好感度 ...

秒殺白蓮花,氣場兩米八的6位女星,誰是你心中的職場女王?

秒殺白蓮花,氣場兩米八的6位女星,誰是你心中的職場女王?
現在很多現代都市劇中,最少不了的就是職場女性了,她們獨立又強大,靠著自己出色的工作能力,成為了職場精英. 這些職場女精英,外表上光鮮亮麗,內心也非常強大,和以前影視劇中,那些什麼都不懂,靠著主角光環成 ...

甘比看不出41歲了,穿條紋襯衫好年輕,配高腰褲有職場精英範兒

甘比看不出41歲了,穿條紋襯衫好年輕,配高腰褲有職場精英範兒
甘比最近亮相的穿搭,挺有職場精英範兒,雖然41歲了但她依舊活力滿滿,身上縈繞著一股少女氣息.最近參加活動時的打扮也格外優雅,一件條紋襯衫搭配高腰條紋西褲,同為條紋元素,卻一點都不顯得突兀,得益於色調和 ...

逃離“內卷”的生活!羅曼炮B型房車,專為職場精英打造

逃離“內卷”的生活!羅曼炮B型房車,專為職場精英打造
最近"內卷"這個詞頻繁地出現在大眾的視線裡,不少上班族平時都承受著或多或少的生活壓力,在城市快節奏的生活中,擁有一輛既能商務通勤,又能自駕旅居的房車尤為重要!讓你在閒暇時光來一場短 ...

秋季太適合穿職場裝,高階大氣還有範,過了40穿還顯年輕

秋季太適合穿職場裝,高階大氣還有範,過了40穿還顯年輕
職場裝是小編非常喜歡穿的服裝風格,雖然和工作有一定的關係,但是職場裝的獨特氣質也是小編這麼喜歡穿職場裝的原因之一了. 高階還大氣的職場裝能更好地展示出我們的高階感,秋季太適合穿職場裝,高階大氣還有範, ...

喝酒不重要,文化才重要,社會酒文化與職場酒規則

喝酒不重要,文化才重要,社會酒文化與職場酒規則
在中國,酒不僅是一種飲品,更是一種文化符號. 酒, 似水,味香, 慕詩客,愛豪俠, 五穀相容,糟香十里, 烈火然高溫,蒸餾原漿液, 李白月夜詩飲,劉伶暮晨醉臥, 邀朋名呼食前列,會友禮於茶後行! 華夏 ...

為什麼職場人更換手機如此頻繁?說透3點內情,你是哪一種心態?

為什麼職場人更換手機如此頻繁?說透3點內情,你是哪一種心態?
目前國內手機主要分為三大陣營:安卓體系.iOS體系和鴻蒙系統.其中,iOS體系是蘋果獨有的系統,安卓體系則覆蓋了小米.oppo.vivo.一加.傳音.中興.魅族等幾乎所有的手機.目前,華為的鴻蒙系統正 ...

張韶涵真會混搭,上身“潮流”下身“職場”,但意外的挺時髦

張韶涵真會混搭,上身“潮流”下身“職場”,但意外的挺時髦
擁有好身材的女性,就會用盡各種辦法,將自己的好身材秀出來,想要秀出好身材,那麼對於服裝單品就需要去注意挑選的方式了. 能夠展現出身材優勢的服裝單品是有很多的,不同的剪裁設計對於身材的展現也是有一定的區 ...

帶著新本去上班!除了MacBook Pro,ROG幻16也成職場全能本

帶著新本去上班!除了MacBook Pro,ROG幻16也成職場全能本
每年"金九銀十"前後都是企業招聘的黃金時期,也有很多應屆畢業生都會在這個時候透過各種途徑來找到心儀的工作,然而不管是面試還是入職,一臺趁手的膝上型電腦都是不可或缺的,無論是外觀還是 ...

孫莉新劇高調殺青!劇照終於曝光,她穿西裝變職場女強人美回巔峰

孫莉新劇高調殺青!劇照終於曝光,她穿西裝變職場女強人美回巔峰
孫莉作為明星,自從結婚當媽後一直都是隱退的狀態,默默地成為了黃磊背後的女人,而如今她時隔12年終於復出,首部新劇如今也正式殺青,可以說是讓大家十分期待了. 職場裝的演繹重點 孫莉在這部劇的造型並沒有太 ...

娃上幼兒園,寶媽還在“家裡蹲”,這兩個原因,比職場殘酷更扎心

娃上幼兒園,寶媽還在“家裡蹲”,這兩個原因,比職場殘酷更扎心
現在有很多媽媽因為孩子的原因不得不辭掉自己的工作,專心在家帶孩子,但是等到孩子到達了上幼兒園的年紀時,一些媽媽也開始為自己的工作擔心,甚至還有很多媽媽都面臨著無法找到工作的窘境. 小林在最開始懷孕的時 ...

辦公數字化市場有多大?職場環境變化帶動消費升級
職場環境變化帶動消費升級 辦公數字化市場有多大 孟 飛 自新冠肺炎疫情暴發以來,不少企事業單位開始實行線上遠端辦公,以降低集中辦公帶來的疫情傳播風險.在此情況下,無論是個人辦公軟體下載量還是辦公企業智 ...

職場寶媽成長之路一早餐篇

職場寶媽成長之路一早餐篇
兒子13年屬蛇的,我們倆人都屬於三十而立了,出了三十天的月子,就自己帶孩子,一直到現在快8歲.前三年全職,上幼兒園之後我也開始上班,唯獨與大多數職場寶媽不同的是自己開店,有員工,稍微自由點.從幼兒園開 ...

謝霆鋒王菲複合七年再同臺,細數這場晚會值得期待的五大亮點

謝霆鋒王菲複合七年再同臺,細數這場晚會值得期待的五大亮點
2021年9月20日晚,電影頻道官方正式釋出了"2021年大灣區中秋電影音樂晚會"的節目單.值得一提的是,這場晚會將在9月21日20:15於多個平臺同步直播.那麼在這場晚會中都有哪 ...

藝見紫金|探訪“藝動青春”曲藝專場背後,師徒之間如同經歷一場“戀愛長跑”
2021紫金文化藝術節期間,"藝動青春"江蘇優秀青年曲藝人才專場演出10日晚在江南劇院上演.本次紫金文化藝術節"藝動青春"板塊曲藝專場由中共江蘇省委宣傳部.江蘇 ...