⾃动部署开源AI模型到⽣产环境:Sklearn、XGBoost、LightGBM、和PySpark ⽬录
背景介绍
AI的⼴泛应⽤是由AI在开源技术的进步推动的,利⽤功能强⼤的开源模型库,数据科学家们可以很容易的训练⼀个性能不错的模型。但是因为模型⽣产环境和开发环境的不同,涉及到不同⾓⾊⼈员:模型训练是数据科学家和数据分析师的⼯作,但是模型部署是开发和运维⼯程师的事情,导致模型上线部署却不是那么容易。
DaaS(Deployment-as-a-Service)是AutoDeployAI公司推出的基于Kubernetes的AI模型⾃动部署系统,提供⼀键式⾃动部署开源AI模型⽣成REST API,以⽅便在⽣产环境中调⽤。下⾯,我们主要演⽰在DaaS中如何部署经典机器学习模型,包括Scikit-learn、XGBoost、LightGBM、和PySpark ML Pipelines。关于深度学习模型的部署,会在下⼀章中介绍。
部署准备
我们使⽤DaaS提供的Python客户端(DaaS-Client)来部署模型,对于XGBoost和LightGBM,我们同样使⽤它们的Python API来作模型训练。在训练和部署模型之前,我们需要完成以下操作。
1. 安装Python DaaS-Client。
pip install --upgrade git+github/autodeployai/daas-client.git
2. 初始化DaasClient。使⽤DaaS系统的URL、账户、密码登陆系统,⽂本使⽤的DaaS演⽰系统安装在本地的Minikube上。完整
Jupyter Notebook,请参考:
from daas_client import DaasClient
client = DaasClient('192.168.64.3:30931','username','password')
3. 创建项⽬。DaaS使⽤项⽬管理⽤户不同的分析任务,⼀个项⽬中可以包含⽤户的各种分析资产:模型、部署、程序脚本、数据、数据
源等。项⽬创建成功后,设置为当前活动项⽬,发布的模型和创建的部署都会存储在该项⽬下。create_project函数接受三个参数:
1. 项⽬名称:可以是任意有效的Linux⽂件⽬录名。
2. 项⽬路由:使⽤在部署的REST URL中来唯⼀表⽰当前项⽬,只能是⼩写英⽂字符(a-z),数字(0-9)和中横线-,并且-不能在
开头和结尾处。
3. 项⽬说明(可选):可以是任意字符。
project ='部署测试'
if not client.project_exists(project):
client.set_project(project)
4. 初始化数据。我们使⽤流⾏的分类数据集iris来训练不同的模型,并且把数据分割为训练数据集和测试数据集以⽅便后续使⽤。
from sklearn import datasets
del_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)
5. 模型部署流程。主要包含以下⼏步:
1. 训练模型。使⽤模型库提供的API,在iris数据集上训练模型。
2. 发布模型。调⽤publish函数发布模型到DaaS系统。
3. 测试模型(可选)。调⽤test函数获取测试API信息,可以使⽤任意的REST客户端程序测试模型在DaaS中是否⼯作正常,使⽤
的是DaaS系统模型测试API。第⼀次执⾏test会⽐较慢,因为DaaS系统需要启动测试运⾏时环境。
4. 部署模型。发布成功后,调⽤deploy函数部署部署模型。可以使⽤任意的REST客户端程序测试模型部署,使⽤的是DaaS系统
正式部署API。
部署Scikit-learn模型
1. 训练⼀个Scikit-learn分类模型:SVC。
from sklearn.svm import SVC
model = SVC(probability=True, random_state=seed)
model.fit(X_train, y_train)
2. 发布Scikit-learn模型。
2. 发布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函数必须要指定前两个参数,第⼀个model是训练的模型对象,第⼆个是模型名称,其余是可选参数:
1. mining_function:指定挖掘功能,可以指定为regression(回归)、classification(分类)、和clustering(聚类)。
2. X_test和y_test:指定测试训练集,发布时计算模型评估指标,⽐如针对分类模型,计算正确率(Accuracy),对于回归模
型,计算可释⽅差(explained Variance)。
3. data_test: 同样是指定测试训练集,但是该参数⽤在Spark模型上,⾮Spark模型通过X_test和y_test指定。
4. description:模型描述。
5. params:记录模型参数设置。
publish_resp是⼀个字典类型的结果,记录了模型名称,和发布的模型版本。该模型是iris模型的第⼀个版本。
{'model_name':'iris','model_version':'1'}
3. 测试Scikit-learn模型。
test_resp = st(publish_resp['model_name'], model_version=publish_resp['model_version'])
pprint(test_resp)
test_resp是⼀个字典类型的结果,记录了测试REST API信息。如下,其中access_token是访问令牌,
⼀个长字符串,这⾥没有显⽰出来。endpoint_url指定测试REST API地址,payload提供了测试当前模型需要输⼊的请求正⽂格式。
{'access_token':'A-LONG-STRING-OF-BEARER-TOKEN-USED-IN-HTTP-HEADER-AUTHORIZATION',
'endpoint_url':'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调⽤测试API,这⾥我们直接使⽤test_resp返回的测试payload,您也可以使⽤⾃定义的
数据X,但是参
数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())
返回结果,不同于正式部署API,除了预测结果,测试API会同时返回标准控制台输出和标准错误输出内容,以⽅便⽤户碰到错误时,查看相关信息。
{'result':[{'PredictedValue':0,
'Probabilities':[0.8977133931668801,
0.05476023239878367,
0.047526374434336216]}],
'stderr':[],
'stdout':[]}
4. 部署模型。
deploy_resp = client.deploy(model_name='iris',
deployment_name='iris-svc',
model_version=publish_resp['model_version'],
model_version=publish_resp['model_version'],
replicas=1)
pprint(deploy_resp)
deploy函数必须要指定模型名称,和部署名称。模型版本默认为当前最新版本(latest),副本数默认
是1。为了确保部署服务的稳定性,还可以输⼊部署运⾏时环境分配指定CPU核数和使⽤内存量,默认为None,让系统⾃动分配。
deploy_resp是⼀个字典类型的结果,记录了正式部署REST API信息。如下,可以看到和测试结果类似,在payload中,我们不需要在输⼊模型名称和版本,因为正式部署服务在创建是已经记录了这些信息,并且是⼀个独占式服务。
{'access_token':'A-LONG-STRING-OF-BEARER-TOKEN-USED-IN-HTTP-HEADER-AUTHORIZATION',
'endpoint_url':'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调⽤测试API,这⾥我们直接使⽤test_resp返回的测试payload,您也可以使⽤⾃定义的数据。
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())
返回结果:
{'result':[{'PredictedValue':0,
'Probabilities':[0.8977133931668801,
python新建项目教程0.05476023239878367,
0.047526374434336216]}]}
部署XGBoost模型
XGBoost提供了两套Python API,⼀套是原⽣Python API,另⼀套是基于Scikit-learn包装API。您可以使⽤任何⼀种,下⾯的例⼦中我们使⽤基于Scikit-learn的Python API。
1. 训练⼀个分类XGBoost模型:
from xgboost import XGBClassifier
model = XGBClassifier(max_depth=3, objective='multi:softprob', random_state=seed)
model = model.fit(X_train, y_train)
2. 发布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'}
3. 测试XGBoost模型。和Scikit-learn流程相同。
4. 部署模型。和Scikit-learn流程相同,这⾥我们暂时先不创建独⽴部署,后⾯我们会介绍如何在DaaS系统中管理部署,如何切换部署
模型版本。
部署LightGBM模型
同XGBoost类似,LightGBM同样提供了两套Python API,⼀套是原⽣Python API,另⼀套是基于Scikit-learn包装API。您可以使⽤任何⼀种,下⾯的例⼦中我们使⽤基于Scikit-learn的Python API。
1. 训练⼀个分类LightGBM模型:
from lightgbm import LGBMClassifier
model = LGBMClassifier()
model = model.fit(X_train, y_train, eval_set=[(X_test, y_test)])
2. 发布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'}
3. 测试LightGBM模型。和Scikit-learn流程相同。
4. 部署模型。和Scikit-learn流程相同,这⾥我们暂时先不创建独⽴部署。
部署PySpark模型

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。