当前位置: 首页 > 科技观察

一篇带您了解TensorFlowServing架构、部署和应用的文章

时间:2023-03-15 21:59:15 科技观察

开始了。一般机器学习模型训练完成后,需要将模型托管为服务,供用户调用。TensorFlow的机器学习模型的部署也遵循了这种方法。它会通过TensorFlowServing将模型做成一个服务,让用户以一定的方式调用模型,而不是直接运行模型推测的代码,不需要用户进行模型部署和安装。整个过程需要通过TensorFlowServing将模型部署到服务器上。一般而言,服务器应用程序会使用Web框架(例如Flask、Django、Tornado)来创建。此应用程序将托管由TensorFlow生成的机器学习模型。应用启动后,会一直在后台运行,等待客户端请求。当应用检测到有请求时,会执行模型进行推测,并将推测结果返回给用户。本文主要介绍TensorFlowServing的工作原理、安装和应用。TensorFlowServing架构简介如果你想了解TensorFlowServing的架构,你需要了解它包含的组件以及它们如何协同工作。TensorFlowServingComponents首先介绍一下TensorFlowServing的主要组件。TensorFlowServing的功能可以抽象成一些组件。每个组件实现不同的API任务,其中最重要的是Servable、Loader、Source和Manager。我们先来看看。如何定义这些组件。ServableServable是TensorFlowServing中的核心抽象,是客户端用来进行计算(如预测或推理)的底层对象。可服务对象在大小和强度上是灵活的,单个可服务对象可以包含从查找表的单个分片到单个模型或推理模型元组的任何内容。Servables可以是任何类型或接口,这使得未来的改进变得灵活和容易,例如:流式结果、实验性API、异步操作模式。但是,Servables不管理自己的生命周期。由于每个模型都可能被修改,尤其是算法配置和权重等参数会随着对模型的深入理解而调整。TensorFlowServing可以在服务实例的生命周期内处理一个或多个版本的Servable,从而可以随时加载新的算法配置、权重和其他数据。这就是ServablesVersions,它可以同时加载多个版本的Servable。服务时,客户端可以请求模型的最新版本或具有指定版本ID的模型。上面说了一个Servable有多个Versions,所以多个Servable版本的序列就变成了一个ServableStream,会按照版本号从小到大的顺序进行排序。ModelTensorFlowServing将模型表示为一个或多个Servable。机器学习模型可能由一个或多个算法(包括学习的权重)和查找表组成。您可以将复合模型表示为:多个独立的Servable或组合的Servable。Servable也可能是模型的一部分,例如,一个大型查找表可能会拆分为多个不同的TensorFlowServing实例。LoaderLoader管理Servable的生命周期。LoaderAPI提供了一个独立于特定机器学习算法、数据和用户产品用例的通用基础平台。具体来说,Loader主要处理Servable的加载和卸载,并为其提供标准的API。SourceSource是一个用于查找和提供Servable的插件模块,每个Source提供零个或多个ServableStreams。对于每个ServableStream,一个Source提供了一个Loader实例来加载不同版本的支持。(一个Source通常由零个或多个SourceAdapter链接在一起,最后一个将触发Loader。)TensorFlowServing中的Source接口可以从任何存储系统发现Servable,并且TesorFlowServing包含对Source实现的一般引用。例如:Source可以利用RPC等机制,并且可以轮询文件系统。Source可以在多个Servable或不同版本的分片中维护状态,这将有助于Servable在不同版本之间进行更新。Manager前面提到了Servable。它不维护自己的生命周期。管理者需要维护Servable的整个生命周期,包括:加载Servable、为Servable提供服务、卸载Servable。管理人员从源获取信息并跟踪所有版本。Manager会尽力满足Source请求,但在所需资源不存在时拒绝加载AspiredVersions。Manager也可能延迟触发卸载(unload)。例如,基于保证在任何时间点至少加载一个Version的策略,Manager需要等待新的Version加载完成,然后再卸载之前的Version。TensorflowServingManager提供了一个简单的窄接口GetServableHandler(),供客户端访问加载Servable实例。上面的TensorFlowServing工作流程介绍了TensorFlowServing的几个组件,包括:Servable、Model、Loader、Source、Manager。接下来,让我们看看它们是如何协同工作的——TensorFlowServing工作流程。如图1所示,TensorFlowServing的工作流程主要分为以下几个步骤:●首先看图1右下方的Source组件,按照Source向上的箭头为要加载的模型创建一个Loader,而在Loader中会包含要加载的模型的所有信息;●然后,Source通知Manager有新的模型需要加载;●Manager(DynamicManager)通过VersionPolicy决定哪些模型需要下架,哪些模型需要加载;●Manager在确认要加载的模型符合加载策略后,通知Loader加载最新的模型;●Client(客户端)向服务器请求模型结果时,可以通过ServableHandle指定模型的版本(ServableVersion),这部分信息由Manager管理(Manager管理Servable的生命周期),然后通过Manager返回给客户端;图片来源:https://www.tensorflow.org/static/tfx/serving/images/serving_architecture.svg?hl=zh-cn图1TensorFlowServing工作流程TensorFlowServing安装部署上面我们介绍了TensorFlowServing的组成和工作流程,下面我们继续说说如何安装TensorFlowServing,推荐使用docker和apt-get的方式安装。TensorFlowServing的Docker安装方式首先确保Docker已经安装,然后通过运行以下命令拉取最新的TensorFlowServingdocker镜像。dockerpulltensorflow/serving这将拉取安装TensorFlowServing的最小Docker镜像。然后需要设置如下属性,gRPC暴露的8500端口,RESTAPI暴露的8501端口,可选环境变量MODEL_NAME(默认为model),可选环境变量MODEL_BASE_PATH(默认为/models)。这些属性的设置参考如下命令:tensorflow_model_server--port=8500--rest_api_port=8501\--model_name=${MODEL_NAME}--model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME}然后就是设置主机的开放端口,设置正在服务的SavedModel,并设置客户端将引用的模型名称。dockerrun-p8501:8501\--mounttype=bind,source=/path/to/my_model/,target=/models/my_model\-eMODEL_NAME=my_model-ttensorflow/serving上面的命令启动了一个Docker容器,将RESTAPI端口8501发布到主机的端口8501,并采用名为my_model的模型并将其绑定到默认模型基本路径(${MODEL_BASE_PATH}/${MODEL_NAME}=/models/my_model)。最后,填充环境变量MODEL_NAME并将MODEL_BASE_PATH保留为默认值。TensorFlowServingapt-getinstallationsetup安装源如下#添加谷歌的TensorFlowServingsourceecho"deb[arch=amd64]http://storage.googleapis.com/tensorflow-serving-aptstabletensorflow-model-servertensorflow-model-服务器通用”|sudotee/etc/apt/sources.list.d/tensorflow-serving.list#添加gpgkeycurlhttps://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release。pub.gpg|sudoapt-keyadd-更新源后可以使用apt-get安装sudoapt-getupdatesudoapt-getinstalltensorflow-model-serverTensorFlowmodelexport现在TensorFlowServing已经安装好了,需要加载相应的机器学习模型。TensorFlow提供了可以轻松导出为SavedModel格式的Keras模型。假设我们有一个名为model的Keras模型,使用如下代码将模型导出为SavedModel:tf.saved_model.save(model,"savedtargetfoldername")TensorFlow模型部署安装TensorFlowServing并保存模型Export,接下来步骤是将模型部署到TensorFlowServing。我们使用以下命令设置模型暴露的端口号、模型名称和模型存放的路径。想详细了解如何快速应用TensorFlow实现多设备部署的同学可以报名中大MOOC官方课程:https://www.icourse163.org/course/youdao-1467217161#/info,或者看看谷歌开发专家对TensorFlow部署的介绍和解释:https://zhibo.51cto.com/liveDetail/373tensorflow_model_server\--rest_api_port=端口号(比如8501)\--model_name=模型名\--model_base_path="SavedModel格式模型所在文件夹的绝对地址(不含版本号)"调用TensorFlowServing客户端。到这里,我们就完成了TensorFlowServing的安装部署。这个时候,我们训练好的机器学习模型就准备好了。静静的躺在服务器上,只等着客户端的召唤。TensorFlowServing支持gRPC和RESTfulAPI调用。本文主要介绍更通用的RESTfulAPI方法的调用。RESTfulAPI与标准HTTPPOST方法交互,请求和响应都是JSON对象。为了调用服务器端的模型,我们向客户端的服务器发送如下格式的请求:http://服务器地址:端口号/v1/models/模型名称:predict请求的内容如下:{"signature_name":"需要调用Signature的函数(Sequential模式不需要)","instances":inputdata}Python客户端示例以下示例使用Python的Requests库发送前10张图片将MNIST测试集的标签发送到本地的TensorFlowServing服务器,并返回预测结果,同时与测试集的真实标签进行比较。从代码中可以看出,通过MNISTLoader方法获取要加载的数据,通过json.dumps方法输入要请求的数据。然后设置headers,通过requests的post方法向本地8501端口请求TensorFlowServing服务,将返回结果赋值给json_response,最后返回预测结果中的预测进行response处理。importjsonimportnumpyasnpiportrequestsfromzh.model.utilsimportMNISTLoaderdata_loader=MNISTLoader()data=json.dumps({"instances":data_loader.test_data[0:3].tolist()})headers={"content-type":"application/json"}json_response=requests.post('http://localhost:8501/v1/models/MLP:predict',data=data,headers=headers)predictions=np.array(json.loads(json_response.text)['predictions'])print(np.argmax(predictions,axis=-1))print(data_loader.test_label[0:10])总结本文分三部分介绍了TensorFlowServing的组成和工作方式。TensorFlowServing由Servable、Model、Loader、Source和Manager等组件组成。他们各司其职,完成搜索Servable、加载Servable、管理Servable生命周期的工作。接下来我们使用Docket和apt-get安装TensorFlowServing,导出机器学习模型部署到TensorFlowServing上。最后使用客户端(以Python为例)调用机器学习模型并返回结果。本文介绍的TensorFlowServing知识只是冰山一角。如果你想进一步探索机器学习的更多领域,可以学习一下《TensorFlow 入门实操课程 》。如果你想提升机器学习能力,挑战自我,也欢迎你报名TensorFlow开发者认证计划https://tensorflow.google.cn/certificate,掌握更多机器学习技能,增强你的核心竞争力。作者介绍崔浩,社区编辑,资深架构师,拥有20年架构经验。曾任惠普技术专家,参与多个机器学习项目,撰写并翻译了20多篇关于机器学习和NLP的热门技术文章。《分布式架构原理与实践》作者。