這篇文章給大家介紹怎樣自動部署開源AI模型到生產(chǎn)環(huán)境Sklearn、XGBoost、LightGBM、和PySpark,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
成都創(chuàng)新互聯(lián)公司主要業(yè)務(wù)有網(wǎng)站營銷策劃、成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、微信公眾號開發(fā)、小程序開發(fā)、成都h5網(wǎng)站建設(shè)、程序開發(fā)等業(yè)務(wù)。一次合作終身朋友,是我們奉行的宗旨;我們不僅僅把客戶當(dāng)客戶,還把客戶視為我們的合作伙伴,在開展業(yè)務(wù)的過程中,公司還積累了豐富的行業(yè)經(jīng)驗、網(wǎng)絡(luò)營銷推廣資源和合作伙伴關(guān)系資源,并逐漸建立起規(guī)范的客戶服務(wù)和保障體系。
AI的廣泛應(yīng)用是由AI在開源技術(shù)的進步推動的,利用功能強大的開源模型庫,數(shù)據(jù)科學(xué)家們可以很容易的訓(xùn)練一個性能不錯的模型。但是因為模型生產(chǎn)環(huán)境和開發(fā)環(huán)境的不同,涉及到不同角色人員:模型訓(xùn)練是數(shù)據(jù)科學(xué)家和數(shù)據(jù)分析師的工作,但是模型部署是開發(fā)和運維工程師的事情,導(dǎo)致模型上線部署卻不是那么容易。
DaaS(Deployment-as-a-Service)是AutoDeployAI公司推出的基于Kubernetes的AI模型自動部署系統(tǒng),提供一鍵式自動部署開源AI模型生成REST API,以方便在生產(chǎn)環(huán)境中調(diào)用。下面,我們主要演示在DaaS中如何部署經(jīng)典機器學(xué)習(xí)模型,包括Scikit-learn、XGBoost、LightGBM、和PySpark ML Pipelines。關(guān)于深度學(xué)習(xí)模型的部署,會在下一章中介紹。
我們使用DaaS提供的Python客戶端(DaaS-Client)來部署模型,對于XGBoost和LightGBM,我們同樣使用它們的Python API來作模型訓(xùn)練。在訓(xùn)練和部署模型之前,我們需要完成以下操作。
安裝Python DaaS-Client。
pip install --upgrade git+https://github.com/autodeployai/daas-client.git
初始化DaasClient。使用DaaS系統(tǒng)的URL、賬戶、密碼登陸系統(tǒng),文本使用的DaaS演示系統(tǒng)安裝在本地的Minikube上。完整Jupyter Notebook,請參考:deploy-sklearn-xgboost-lightgbm-pyspark.ipynb
from daas_client import DaasClient client = DaasClient('https://192.168.64.3:30931', 'username', 'password')
創(chuàng)建項目。DaaS使用項目管理用戶不同的分析任務(wù),一個項目中可以包含用戶的各種分析資產(chǎn):模型、部署、程序腳本、數(shù)據(jù)、數(shù)據(jù)源等。項目創(chuàng)建成功后,設(shè)置為當(dāng)前活動項目,發(fā)布的模型和創(chuàng)建的部署都會存儲在該項目下。create_project
函數(shù)接受三個參數(shù):
project = '部署測試' if not client.project_exists(project): client.create_project(project, 'deployment-test', '部署測試項目') client.set_project(project)
項目名稱:可以是任意有效的Linux文件目錄名。
項目路由:使用在部署的REST URL中來唯一表示當(dāng)前項目,只能是小寫英文字符(a-z),數(shù)字(0-9)和中橫線-
,并且-
不能在開頭和結(jié)尾處。
項目說明(可選):可以是任意字符。
初始化數(shù)據(jù)。我們使用流行的分類數(shù)據(jù)集iris
來訓(xùn)練不同的模型,并且把數(shù)據(jù)分割為訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集以方便后續(xù)使用。
from sklearn import datasets from sklearn.model_selection import train_test_split import pandas as pd seed = 123456 iris = datasets.load_iris() iris_target_name = 'Species' iris_feature_names = iris.feature_names iris_df = pd.DataFrame(iris.data, columns=iris_feature_names) iris_df[iris_target_name] = iris.target X, y = iris_df[iris_feature_names], iris_df[iris_target_name] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=seed)
模型部署流程。主要包含以下幾步:
訓(xùn)練模型。使用模型庫提供的API,在iris
數(shù)據(jù)集上訓(xùn)練模型。
發(fā)布模型。調(diào)用publish
函數(shù)發(fā)布模型到DaaS系統(tǒng)。
測試模型(可選)。調(diào)用test
函數(shù)獲取測試API信息,可以使用任意的REST客戶端程序測試模型在DaaS中是否工作正常,使用的是DaaS系統(tǒng)模型測試API。第一次執(zhí)行test
會比較慢,因為DaaS系統(tǒng)需要啟動測試運行時環(huán)境。
部署模型。發(fā)布成功后,調(diào)用deploy
函數(shù)部署部署模型??梢允褂萌我獾腞EST客戶端程序測試模型部署,使用的是DaaS系統(tǒng)正式部署API。
訓(xùn)練一個Scikit-learn分類模型:SVC。
from sklearn.svm import SVC model = SVC(probability=True, random_state=seed) model.fit(X_train, y_train)
發(fā)布Scikit-learn模型。
publish_resp = client.publish(model, name='iris', mining_function='classification', X_test=X_test, y_test=y_test, description='A SVC model') pprint(publish_resp)
test
函數(shù)必須要指定前兩個參數(shù),第一個model
是訓(xùn)練的模型對象,第二個是模型名稱,其余是可選參數(shù):
publish_resp
是一個字典類型的結(jié)果,記錄了模型名稱,和發(fā)布的模型版本。該模型是iris
模型的第一個版本。
{ 'model_name': 'iris', 'model_version': '1'}
mining_function:指定挖掘功能,可以指定為regression
(回歸)、classification
(分類)、和clustering
(聚類)。
X_test和y_test:指定測試訓(xùn)練集,發(fā)布時計算模型評估指標(biāo),比如針對分類模型,計算正確率(Accuracy),對于回歸模型,計算可釋方差(explained Variance)。
data_test: 同樣是指定測試訓(xùn)練集,但是該參數(shù)用在Spark模型上,非Spark模型通過X_test
和y_test
指定。
description:模型描述。
params:記錄模型參數(shù)設(shè)置。
測試Scikit-learn模型。
test_resp = client.test(publish_resp['model_name'], model_version=publish_resp['model_version']) pprint(test_resp)
test_resp
是一個字典類型的結(jié)果,記錄了測試REST API信息。如下,其中access_token
是訪問令牌,一個長字符串,這里沒有顯示出來。endpoint_url
指定測試REST API地址,payload
提供了測試當(dāng)前模型需要輸入的請求正文格式。
{ 'access_token': 'A-LONG-STRING-OF-BEARER-TOKEN-USED-IN-HTTP-HEADER-AUTHORIZATION', 'endpoint_url': 'https://192.168.64.3:30931/api/v1/test/deployment-test/daas-python37-faas/test', 'payload': { 'args': { 'X': [{ 'petal length (cm)': 1.5, 'petal width (cm)': 0.4, 'sepal length (cm)': 5.7, 'sepal width (cm)': 4.4}], 'model_name': 'iris', 'model_version': '1'}}}
使用requests調(diào)用測試API,這里我們直接使用test_resp
返回的測試payload,您也可以使用自定義的數(shù)據(jù)X
,但是參數(shù)model_name
和model_version
必須使用上面輸出的值。
response = requests.post(test_resp['endpoint_url'], headers={ 'Authorization': 'Bearer {token}'.format(token=test_resp['access_token'])}, json=test_resp['payload'], verify=False) pprint(response.json())
返回結(jié)果,不同于正式部署API,除了預(yù)測結(jié)果,測試API會同時返回標(biāo)準(zhǔn)控制臺輸出和標(biāo)準(zhǔn)錯誤輸出內(nèi)容,以方便用戶碰到錯誤時,查看相關(guān)信息。
{ 'result': [{ 'PredictedValue': 0, 'Probabilities': [0.8977133931668801, 0.05476023239878367, 0.047526374434336216]}], 'stderr': [], 'stdout': []}
部署模型。
deploy_resp = client.deploy(model_name='iris', deployment_name='iris-svc', model_version=publish_resp['model_version'], replicas=1) pprint(deploy_resp)
deploy
函數(shù)必須要指定模型名稱,和部署名稱。模型版本默認(rèn)為當(dāng)前最新版本(latest
),副本數(shù)默認(rèn)是1。為了確保部署服務(wù)的穩(wěn)定性,還可以輸入部署運行時環(huán)境分配指定CPU核數(shù)和使用內(nèi)存量,默認(rèn)為None,讓系統(tǒng)自動分配。
deploy_resp
是一個字典類型的結(jié)果,記錄了正式部署REST API信息。如下,可以看到和測試結(jié)果類似,在payload
中,我們不需要在輸入模型名稱和版本,因為正式部署服務(wù)在創(chuàng)建是已經(jīng)記錄了這些信息,并且是一個獨占式服務(wù)。
{ 'access_token': 'A-LONG-STRING-OF-BEARER-TOKEN-USED-IN-HTTP-HEADER-AUTHORIZATION', 'endpoint_url': 'https://192.168.64.3:30931/api/v1/svc/deployment-test/iris-svc/predict', 'payload': { 'args': { 'X': [{ 'petal length (cm)': 1.5, 'petal width (cm)': 0.4, 'sepal length (cm)': 5.7, 'sepal width (cm)': 4.4}]}}}
使用requests調(diào)用測試API,這里我們直接使用test_resp
返回的測試payload,您也可以使用自定義的數(shù)據(jù)。
response = requests.post(deploy_resp['endpoint_url'], headers={ 'Authorization': 'Bearer {token}'.format(token=deploy_resp['access_token'])}, json=deploy_resp['payload'], verify=False) pprint(response.json())
返回結(jié)果:
{ 'result': [{ 'PredictedValue': 0, 'Probabilities': [0.8977133931668801, 0.05476023239878367, 0.047526374434336216]}]}
XGBoost提供了兩套Python API,一套是原生Python API,另一套是基于Scikit-learn包裝API。您可以使用任何一種,下面的例子中我們使用基于Scikit-learn的Python API。
訓(xùn)練一個分類XGBoost模型:
from xgboost import XGBClassifier model = XGBClassifier(max_depth=3, objective='multi:softprob', random_state=seed) model = model.fit(X_train, y_train)
發(fā)布XGBoost模型。
publish_resp = client.publish(model, name='iris', mining_function='classification', X_test=X_test, y_test=y_test, description='A XGBClassifier model') pprint(publish_resp)
因為仍然使用了iris
這個模型名稱,所以該模型是iris
的第二個版本。
{ 'model_name': 'iris', 'model_version': '2'}
測試XGBoost模型。和Scikit-learn流程相同。
部署模型。和Scikit-learn流程相同,這里我們暫時先不創(chuàng)建獨立部署,后面我們會介紹如何在DaaS系統(tǒng)中管理部署,如何切換部署模型版本。
同XGBoost類似,LightGBM同樣提供了兩套Python API,一套是原生Python API,另一套是基于Scikit-learn包裝API。您可以使用任何一種,下面的例子中我們使用基于Scikit-learn的Python API。
訓(xùn)練一個分類LightGBM模型:
from lightgbm import LGBMClassifier model = LGBMClassifier() model = model.fit(X_train, y_train, eval_set=[(X_test, y_test)])
發(fā)布LightGBM模型。
publish_resp = client.publish(model, name='iris', mining_function='classification', X_test=X_test, y_test=y_test, description='A LGBMClassifier model') pprint(publish_resp)
LightGBM模型是iris
的第三個版本。
{ 'model_name': 'iris', 'model_version': '3'}
測試LightGBM模型。和Scikit-learn流程相同。
部署模型。和Scikit-learn流程相同,這里我們暫時先不創(chuàng)建獨立部署。
訓(xùn)練一個PySpark分類模型:RandomForestClassifier。PySpark模型必須是一個PipelineModel
,也就是說必須使用Pipeline來建立模型,哪怕只有一個Pipeline節(jié)點。
from pyspark.sql import SparkSession from pyspark.ml.classification import RandomForestClassifier from pyspark.ml.feature import VectorAssembler from pyspark.ml import Pipeline spark = SparkSession.builder.getOrCreate() df = spark.createDataFrame(iris_df) df_train, df_test = df.randomSplit([0.7, 0.3], seed=seed) assembler = VectorAssembler(inputCols=iris_feature_names, outputCol='features') rf = RandomForestClassifier(seed=seed).setLabelCol(iris_target_name) pipe = Pipeline(stages=[assembler, rf]) model = pipe.fit(df_train)
發(fā)布PySpark模型。
publish_resp = client.publish(model, name='iris', mining_function='classification', data_test=df_test, description='A RandomForestClassifier of Spark model') pprint(publish_resp)
PySpark模型是iris
的第四個版本。
{ 'model_name': 'iris', 'model_version': '4'}
測試PySpark模型。和Scikit-learn流程相同。
部署模型。和Scikit-learn流程相同,這里我們暫時先不創(chuàng)建獨立部署。
打開瀏覽器,登陸DaaS管理系統(tǒng)。進入項目部署測試
,切換到模型
標(biāo)簽頁,有一個iris
模型,最新版本是v4
,類型是Spark
即我們最后發(fā)布的模型。
點擊模型,進入模型主頁(概述)。當(dāng)前v4
是一個Spark Pipeline模型,正確率是94.23%,并且顯示了iris
不同版本正確率歷史圖。下面羅列了模型的輸入和輸出變量,以及評估結(jié)果,當(dāng)前為空,因為還沒有在DaaS中執(zhí)行任何的模型評估任務(wù)。
點擊v4
,可以自由切換到其他版本。比如,切換到v1
。
v1
版本是一個Scikit-learn SVM分類模型,正確率是98.00%。其他信息與v4
類似。
切換到模型部署
標(biāo)簽頁,有一個我們剛才創(chuàng)建的部署iris-svc
,鼠標(biāo)移動到操作菜單,選擇修改設(shè)置
??梢钥吹?,當(dāng)前部署服務(wù)關(guān)聯(lián)的是模型v1
,就是我們剛才通過deploy
函數(shù)部署的iris
第一個版本Scikit-learn模型。選擇最新的v4
,點擊命令保存并且重新部署
,該部署就會切換到v4
版本。
關(guān)于怎樣自動部署開源AI模型到生產(chǎn)環(huán)境Sklearn、XGBoost、LightGBM、和PySpark就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。