教你如何用 Google 云平台 (GCP) 部署机器学习模型丨 翻译征文丨雷锋字幕组
本文为雷锋字幕组“触摸世界前沿科技 | 翻译征文 ”活动收录稿件
将机器学习(ML)模型部署到生产环境,首先要实际构建模型,这一步骤可以有很多方法和工具来完成。
在开发阶段使用的方法和工具,对于保证组成机器学习模型训练流水线的基本单元的顺利集成非常重要。如果在项目开始之前没有考虑这些,那么最终得到的 ML 系统很可能是低效率和高延迟的。
比如,使用一个已被弃用的函数也许仍然可行,但它往往会引发警告,并因此增加系统的响应时间。
为了确保所有系统单元的良好集成,首先要做的是设计好系统中每个逻辑部分的端到端集成关系,搭建一份系统架构(蓝图)。下图是为这个小型项目设计的系统架构。
项目系统架构图
模型开发
当我们讨论模型开发时,我们讨论的是一个迭代过程,在这个过程中,假设得到验证,然后选择模型,训练、测试并构建模型,直到达到预期的结果。
对于数据科学家团队来说,这是最有趣的步骤,他们应用机器学习技能用于探索性数据分析、特征工程、模型训练以及在给定数据上进行评估等任务。
这个项目中使用的模型是在这个Kaggle kernel上使用titanic数据集构建和序列化的。请注意,我只使用了标准包中的现有模块,如 Pandas、NumPy 和 sklearn,以免最终构建自定义模块。可以查看我以前的文章[1]“机器学习模型部署解析(第2部分)”以了解有关自定义流水线的更多信息。
特征变换可以使模型的性能大大提高,但是如果没有 Pandas、NumPy 和其他有用的工具库的组合,大多数在数据上最有效的转换器在 sklearn 上是不可用的,这将导致在部署期间构建额外的模块。为了简化开发部署过程,我将避免深入探讨这些主题。
Kaggle是由数据科学家和机器学习实践者组成的最大的在线社区。Kaggle 允许用户查找和发布数据集,在基于 Web 的数据科学环境中探索和构建模型,并与其他数据科学家和机器学习工程师合作,还能够参加竞赛解决数据科学的挑战。
机器学习的未来即将来临。
在谷歌云平台部署机器学习模型
1)一些部署工具的选择
谷歌云平台(GCP)是云端部署 ML 模型基本的工具之一,此外还有一些其他的,比如亚马逊云平台 AWS,微软云服务平台 Microsoft Azure 等。
通过 GCP,基于你选择的模型部署的方式,有以下三种基础的选项:
-
谷歌 AI 平台:一个人工智能平台,它使机器学习开发人员、数据科学家和数据工程师能够轻松、快速、高效地从构思到生产和部署他们的 ML 项目。从数据工程到“无锁定”灵活性,谷歌的人工智能平台有一个集成的工具链,有助于构建和运行自己的机器学习应用程序。因此,端到端的 ML 模型开发和部署可以在 Google 的 AI 平台上进行,而不需要额外的工具。这样做的好处是,您不必担心选择最好的工具来完成每项工作,以及每个单元与更大系统的集成程度。除此之外,还可以选择 Amazon SageMaker、Microsoft Azure 等平台。
机器学习部署端到端周期
图片来源:谷歌云平台
-
谷歌云函数计算:云函数是运行代码的最简单方法。它是一个事件驱动的、无服务器的计算平台,在需要时可以执行您的函数,而无需在设置或配置任何其他相关计算资源时提供服务[3]。使用云功能的优点包括:根据负载自动扩展;能够简化跨不同语言的复杂应用程序开发;没有服务器可供配置、管理或升级;集成的监视、日志记录和分布式跟踪;在角色和每个功能级别上的内置安全性,基于最小特权原则;以及混合和多云场景的关键网络功能。除此之外,还可以选择 AWS Lambda、Azure Function 等云函数平台。
-
谷歌 app 引擎:Google 的 App Engine 是一个服务平台和云计算平台,主要用于开发和托管 Web 应用程序。App Engine 的自动扩展特性可以自动为 Web 应用程序分配更多资源,以处理额外的需求。这是我在这个项目中尝试的选择。
为什么要将 app 引擎用于此项目?
App Engine 是一个基于云的平台,它非常全面地结合了基础设施即服务(IaaS)、平台即服务(PaaS)和软件即服务(SaaS)。运行时和语言是最新的,有大量文档。预览阶段(beta)中的功能可供大量用户使用,这使我们随时了解未来可能的发展。
2) 要使用终端将此模型部署到 app 引擎上,需要四个主要文件,分别是:
-
序列化的模型和模型工具:这是在数据转换期间使用的已保存的经过训练的模型和其他标准对象。所有这些都将在部署时存储在 Google 存储(bucket)中,以便主脚本可以访问它们以准备测试数据并进行预测。
-
主要脚本 script.py:这是编写预测函数的脚本,其中导入了需求文件中列出的所有必要的库,以便进行端到端的数据准备和预测。我会为每一行代码添加注释,使之更容易阅读。
# importing library import numpy as np import pandas as pd from sklearn.externals import joblib import json from flask import Flask , request, jsonify app = Flask(__name__) # Load all model artifacts model = joblib.load(open("model-v1.joblib","rb")) age_imputer = joblib.load(open("age_imputer.joblib","rb")) embark_imputer = joblib.load(open("embark_imputer.joblib","rb")) One_hot_enc = joblib.load(open("One_hot_enc.joblib","rb")) scaler = joblib.load(open("scaler.joblib","rb")) # data preprocessing properties drop_cols = ['PassengerId','Ticket','Cabin','Name'] gender_dic = {'male':1,'female':0} cat_col = ['Embarked', 'Pclass'] def data_preprocessor(*,jsonify_data) -> 'clean_data': """ this function takes in unprocessed data in json format and process it """ test = pd.read_json(jsonify_data) #read json passenger_id = list(test.PassengerId) #keep record of the passenger ID(s) if test.Fare.isnull().any().any(): test.Fare.fillna(value = test.Fare.mean(),inplace=True) #fill the missing value in the Fare feature with the mean test.Age = age_imputer.transform(np.array(test.Age).reshape(-1,1)) # fill the missing values in the Age feature with the mean age test.Embarked = embark_imputer.transform(np.array(test.Embarked).reshape(-1,1)) # fill the missing values in the Embark feature with the most frequent test.drop(columns=drop_cols,axis=1,inplace = True) # drop colums that were not used during training test['Number_of_relatives'] = test.Parch + test.SibSp #add the feature Number_of_relatives test.drop(columns=['Parch','SibSp'],axis=1,inplace=True) #drop Parch and SibSp features test.Sex = test.Sex.map(gender_dic) #convert the Sex Feature into number encoded_test = pd.DataFrame(data=One_hot_enc.transform(test[cat_col]),columns=['emb_2','emb_3','Pclass_2','Pclass_3']) #encode Embark feature using one_hot_encoding test.drop(columns=cat_col,axis=1,inplace=True) # drop the unprocessed categorical feature test = pd.concat([test,encoded_test],axis=1) # concatenate the encoded categorical features with the test data test = scaler.transform(test) # scale all value return test, passenger_id @app.route('/prediction_endpoint',methods=['GET','POST']) #decorate the prediction_endpoint func with the desired endpoint and methods def prediction_endpoint(): if request.method == 'GET': return 'kindly send a POST request' #return this if request is 'GET' elif request.method == 'POST': input_data = pd.read_csv(request.files.get("input_file")) #get file from via the API as csv testfile_json = input_data.to_json(orient='records') #conver into json #json_raw_data = request.get_json() clean_data, id = data_preprocessor(jsonify_data=testfile_json) #invoke the data preprocessing method passenger_id = list() #empty list of pasenger id for passenger in id: passenger_id.append('Passenger_' + str(passenger)) #populate the list of passenger id #prediction result = list() model_predictions = list(np.where(model.predict(clean_data)==1,'Survived','died')) # convert the binary predictionns into human readable format for index,status in enumerate(model_predictions): result.append([passenger_id[index],status]) response = json.dumps(result) return response #send the model response back to the user if __name__ == "__main__": app.run()#run flask app instance
script.py 文件
-
Requirement.txt:一个简单的文本文件,其中包含模型依赖项和模型训练期间使用的准确版本。为了避免遇到麻烦,最好在开发模型之前检查云上使用的所有库和包的可用版本。
scikit-learn==0.22 numpy==1.18.0 pandas==0.25.3 flask==1.1.1
-
app.yaml 文件:此文件可用于配置 AppEngine 的应用程序设置。此文件指定了 URL 路径与请求处理程序和静态文件的对应方式。这个 app.yaml 文件还包含有关应用程序代码的信息,例如运行时和最新版本标识符。在此文件上忽略的任何配置都将设置为默认状态。对于这个简单的应用程序,我只需要将运行时设置为 python37,这样 AppEngine 就可以知道运行该应用程序的 Docker 映像了。
runtime: python37
还有很多东西需要写入 app.yaml 文件,都可以在谷歌的官方文档中找到[4]。
为了便于部署 app,我们需要将项目放在软件开发版本控制平台上,如 Bitbucket、GitHub 等。可在GitHub上找到项目存储库。
机器学习模型不一定部署在服务器上或云端——它们也可以存在于我们的智能手机上。
[Fritz-AI上有工具可以很容易地教app看、听、感觉和思考。 (//www.fritz.ai/product/studio.html)
在 Google 的 app 引擎上部署模型的步骤
-
在谷歌云平台新建一个项目
-
使用 App Engine 选择并新建一个 app
通过设置 Google 管理应用程序的永久区域来设置应用程序。完成此步骤后,选择编写应用程序时使用的编程语言。 -
从本地计算机下载云 SDK 去部署或从云平台激活 cloud shell。在这个示例中,我使用的是 cloud shell。激活 shell 后,请确保将云平台项目设置为预期的项目 ID。
-
在引擎上执行命令(Git clone < 仓库链接 > )来克隆你的 GitHub 项目仓库。
-
在 App Engine 上运行命令(cd ‘克隆后项目文件夹’)来进入包含要上传的文件的项目目录。您可以通过运行命令 ls 来查看目录。
-
通过运行‘gcloud init’在项目目录中初始化 gcloud。这将引发一些关于 Google Cloud SDK 配置的问题,这些问题非常简单,而且很容易回答。
-
最后一步是通过运行命令‘gcloud app deploy’来部署应用程序。上传文件、安装应用程序依赖项和部署应用程序需要一些时间。
-
上传完成后,您可以运行‘gcloud app browse’在浏览器中启动应用程序,或者在未检测到浏览器的情况下手动复制应用程序 URL。
注意:如果使用自定义预测例程,则需要将 API 端点添加到 URL。对于这个项目,Flask 作为 Web 框架,端点被声明为/prediction_endpoint。
用 Postman 测试 API
用 Postman 测试 app
由于我们没有为该项目构建任何 Web 接口,因此可以使用 Google 应用程序客户端发送 HTTP 请求来测试该应用程序。但是我们还是将使用 Postman 进行测试,因为我们是根据在后端读取数据集的方式成批预测的。下面是应用程序发送 HTTP 请求以获取上传的测试数据的预测值而得到的响应。
API 响应
总结
机器学习模型的部署可以采取不同的形式,这取决于数据集、部署的目标平台以及最终用户将利用它的方式以及许多其他因素。
为了部署模型能够顺利进行,请彻底检查构成您要实现的机器学习系统架构的所有单元。
您可以通过下面的链接克隆 GitHub 仓库
saintyemix1/deployment-of-titanic-on-google-cloud(这是一个在谷歌 app 引擎上部署机器学习模型的简单项目,使用泰坦尼克数据集作为例子)
参考文献
如果概率方法能很好地用于贷款违约算法呢?参考揭秘机器学习模型的部署(第一部分)
关于无风险可贷金额的贷款授信状态预测。参考 揭秘机器学习模型的部署(第二部分)
创建一次你自己的人工智能应用程序,然后在 GCP 和本地轻松运行它们。AI 使之更加简单…
运行代码云功能的最简单方法是 Google Cloud 的事件驱动无服务器计算…
app.yaml参考文件 | python2 App引擎的标准环境
这是 Google 根据您创建应用程序时选择的区域进行配置的代码。
今后的工作
-
通过 App 引擎和 Docker 在 GCP 上部署自定义的机器学习流水线
原文链接://www.yanxishe.com/TextTranslation/2551 ,来自雷锋字幕组提供的选题
本文为雷锋字幕组“触摸世界前沿科技 | 翻译征文 ”活动收录稿件