- N +

锐步,手把手教你运用TF效劳将TensorFlow模型布置到出产环境,上海市

原标题:锐步,手把手教你运用TF效劳将TensorFlow模型布置到出产环境,上海市

导读:

介绍将机器学习模型应用于生产环境已成为一个火热的的话题,许多框架提供了旨在解决此问题的不同解决方案。...

文章目录 [+]

摘要: 练习好的模型不知道怎样安置到出产环境?快来学习一下吧!


手把手教你运用TF效力将TensorFlow模型安置到出产环境

介绍

将机器学习(ML)模型应用于出产环境已成为一个炽热的的论题,许多结构供给了旨在处理此问题的不同琳琳马航处理方案。为处理这一问题,谷歌发布了TensorFlow(TF)效力,以等待处理将ML模型安置到出产中的问题。

本文供给了一个关于效力于预先练习的卷积语义切割网络的实践教程。阅览本文后,你将能够运用TF效力来安置和向TF练习的深度CNN宣布恳求等操作。别的,本文将概述TF效力的API及其作业原理。假如你想学习本教程并在核算机上运转示例,请完好了解本文。可是,假如你只想了解TensorFlow效力,你能够专心于前两部分。

TensorFlow效力库-概述

首要咱们需求花一些时刻来了解TF Serving怎样处理ML模型的整个生命周期。在这儿,咱们将介绍TF效力的首要构建块,本部分的方针是供给TF效力API的介绍。如需深化了解,请拜访TF效力文档页面。

TensorFlow效力由一些笼统组成,这些笼统类用于不同使命的API,其间最重要的是Servable,Loader,Source和Manager,让咱们来看看他们之间是怎样互动的:

手把手教你运用TF效力将TensorFlow模型安置到出产环境

简略来说,当TF Serving辨认磁盘上的模型时,Source组件就开端作业啦,整个效力生命周期也算开端了,Source组件担任辨认应加载的新模型。实践上,它会亲近重视文件体系,以确认新模型版别何时抵达磁盘。当它看到新版别模型时,它会为该特定版别的模型创立一个Loader。

总归,Loader简直了解模型的一切内容,包括怎样加载以及怎样估量模型所需的资源,例如恳求的RAM和GPU内存。Loader还有一个指向磁盘上模型的指针以及用于加载它的一切必要的元数据。可是有一个问题:加载器不答应加载模型。创立Loader后,Source女囚吧会将其作为Aspired Version发送给Manager。

收到模型的Aspired Version后,Manager持续履行效力进程。这儿有两种或许性,一个是推送第一个模型版别进行安置,在这种状况下,Manager将保证所需的资源可用,完结后,Manager会颁发Loader加载模型的权限;第二是咱们推出现有模型的新版别,在这种状况下,管理员有必要先咨询版别战略插件,然后再持续操作,版别战略确认锐步,手把手教你运用TF效力将TensorFlow模型安置到出产环境,上海市怎样进行加载新模型版别的进程。

具体来说,在第一种状况下,咱们能够保证咱们的体系一直可用于传入客户的恳求。此刻,咱们一起加载了两个模型版别,只要在加载完结后,Manager才会卸载旧版别,而且能够安全地在模型之间切换。另一方面,假如咱们想经过不运用额定缓冲区来节约资源,咱们能够挑选保存数据。最终,当客户端恳求模型的handle时,管理器回来Servable的handle。

在接下来的部分中,咱们将介绍怎样运用TF效力供给卷积神经网络(CNN)。

导出效力模型

为TensorFlow构建的ML模型供给效力的第一步是保证它的格局正确,为此,TensorFlow供给了SavedModel类。

SavedModel是TensorFlow模型的通用序列化格局,假如你了解TF,则能够运用TensorFlo柏桐英豪w Saver来保存模型的变量。

TensorFlow Saver供给了将模型的检查点文件保存到磁盘或从磁盘康复的功用。实践上,SavedModel包装了TensorFlow Saver,它是导出TF模型进行效力的规范办法。

SavedModel object有一些很好的功用。首要,它答应你将多个元图保存到单个SavedModel目标,换句话说,它答应咱们为不同的使命供给不同的图表。例如,假定你刚刚完结了模型的练习。在大多数状况下,要履行推理,你的图表不需求某些特定于练习的操作。这些操作或许包括优化器的变量,学习速率调度张量,额定的预处理操作等。此外,你或许希望为移动安置供给量化版别的图形。

在此环境中,SavedModel答应你运用不同的装备保存图形。在咱们的比如中,咱们有三个不同的图形和相应的标签,如“练习”、“推理”和“移动”。此外,这三个图形为了提高内存功率还同享相同的变量集。

就在不久前,假如咱们想在移动设备上安置TF模型时,咱们需求知道汤沪平输入和输出张量的称号,以便向模型供给数据或从模型获取数据。这需求强制程序员在图的一切张量中查找他们所需的张量。假如张量没有正确命名,那么使命或许十分繁琐。

为了简化操作,SavedModel供给对SignatureDefs的支撑,SignatureDefs界说了TensorFlow支撑的核算的签名。它确认了核算锐步,手把手教你运用TF效力将TensorFlow模型安置到出产环境,上海市图的正确输入和输出张量,也就是说运用这些签名,你能够指定用于输入和输出的切当节点。要运用其内置的效力API,TF Serving要求模型包括一个或多个SignatureDefs。

要创立此类签名,咱们需求供给输入,输出和所需办法称号的界说,输入和输出表明从字符串到TensorInfo目标的映射。在这儿,咱们界说了默许张量,用于向图表输入数据和从图表接纳数据。

现在,有三种效力API:分类,猜测和回归。每个签名界说都与特定的RPC API相匹配,Classification SegnatureDef用于Classify RPC API,Predict SegnatureDef用于Predict RPC API等等依此类推。

关于分类签名,有必要有输入张量(接纳数据)和两个或许的输出张量中的至少一个:类或分数。Regression SignatureDef只需求一个张量用于输入,另一个用于输出。最终,Predict signature答应动态数量的输入和输出张量。此外,SavedModel支撑数据存储,以用于ops初始化依靠于外部文件的状况,它还具有在创立SavedModel之前铲除设备的机制。

现在,让咱们看看咱们怎样在实践中做到这一点。

设置环境

在开端之前,咱们需求从Github克隆此TensorFlow DeepLab-v3。DeepLab是谷歌最好的语义切割ConvNet,网络能够将图画作为输入并输出相似掩模的图画,该图画将某些目标与布景分隔。

该版别的DeepLab在Pascal VOC分段数据集进步行了练习,因而,它能够切割和辨认多达20个类。假如你想了解有关语义分段和DeepLab-v3的更多信息胃肠安丸小绿瓶怎样吃,请检查深化深度卷积语义分段网络和Deeplab_V3。

与效力相关的一切文件都存在于:./deeplab_v3/serving/。在那里,你会发现两个重要的文件:锐步,手把手教你运用TF效力将TensorFlow模型安置到出产环境,上海市deeplab_saved_model.py和deeplab_client.ipynb。

在进一步鹅夷草研讨之前,请有必要下载Deeplab-v3预练习模型。前往上面的GitHub存储库,单击checkpoints链接,你应该有一个名为tboard_logs /的文件夹,其间包括16645 /文锐步,手把手教你运用TF效力将TensorFlow模型安置到出产环境,上海市件夹。

现在,咱们需求创立两个Python虚拟环境,一个用于Python 3,另一个用于Python 2,请保证装置必要的依靠项。你能够在serving_requirements.txt和client_requirements.txt文件中找到它们。

你或许很猎奇为什么需求两个Python env,因为咱们的模型DeepLab-v3是在Python 3下开发的,而TensorFlow Serving Python API仅针对Python 2发布。因而,要导出模型并运转TF效力,咱们运用Python 3 env 。

请注意,你能够运用bazel中的Serving API抛弃Python 2 env。有关更多详细信息,沈星勇士请参阅TF效力实例。完结这一步后,让咱们从真实重要的作业开端吧。

实例教程

TensorFlow供给了一个易于运用的高档实用程序类运用SavedModel,类名为SavedModelBuilder。SavedModelBuilder类供给了保存多个元图,相关变量和数据的功用。让咱们来看一个怎样导出Deep Segmentation CNN模型进行效力的运转示例。

如上所述,要导出模型,咱们运用啦SavedModelBuilder类。它将生成SavedModel协议缓冲区文件以及模型的变量和资源。

让咱们分析一下代码:

# Create SavedModelBuilder class
# defines where the model will be exported
export_path_base = FLAGS.export_model_dir
export_path = os.path.join(
tf.compat.as_bytes(export_path_base),
tf.compat.as_bytes(s程开耀tr(FLAGS.model_version)))
print('Exporting trained model to', export_path)
builder = tf.saved_model.builder.SavedModelBuilder(export_path)

SavedModelBuilder接纳(作为输入)保存模型数据的目录。这儿,export_path变量是为了衔接export_path_base和model_version。因而,不同的模型版别将保存在export_p幼儿片ath_base文件夹内的独自目录中。

假定咱们在出产中有咱们模型的根底版别,但咱们想要安置它的新版别。因为咱们现已提高了模型的准确性,并希望为咱们的客户供给这个新版别。要导出同一模型的不同版别,咱们只需将FLAGS.model_version设置为更高的整数值即可。然gugool后将在export_path_base文件夹中创立一个不同的文件夹(保存咱们模型的新版别)。

现在,咱们需求指定模型的输入和输出Tensors。为此,咱们运用Signa锐步,手把手教你运用TF效力将TensorFlow模型安置到出产环境,上海市tureDefs,签名界说了咱们要导出的模型类型。它供给了从字符串(逻辑Tensor称号)到TensorInfo目标的映射。咱们的主意是,客户端能够锐步,手把手教你运用TF效力将TensorFlow模型安置到出产环境,上海市引证签名界说的逻辑称号,而不是引证输入/输出的实包世铭际张量称号。

为了效力语义分段CNN,咱们将创立一个猜测签名。请注意,build_signature_def()函数选用输入和输出张量的映射以及所需的API。

SignatureDef需求指定:输入,输出和办法称号,咱们希望输入有三个值:一图画,别的两个张量指定其尺度(高度和宽度)。关于输出,咱们只界说了一个成果-分段输出掩码。

# Creates the TensorInfo protobuf objects that encapsulates the input/output tensors
tensor_info_input = tf.saved_model.utils.build_tensor_info(input_tensor)
tensor_info_height = tf.saved_model.utils.build_tensor_info(image_height_tensor)
tensor_info_width = tf.saved_model.utils.build_tensor_info(image_width_tensor)
# output tensor info
tensor_info_output = tf.saved_model.utils.build_tensor_info(predictions_tf)
# Defines the DeepLab signatures, uses the TF Predict API
# It receives an image and its dimensions and output the segmentation mask
p锐步,手把手教你运用TF效力将TensorFlow模型安置到出产环境,上海市rediction_signature = (
tf.saved_model.signature_def_utils.貂哥寻妻build_signature_def(
inputs={'images': tensor_info_input, 'height': tensor_info_height, 'width': tensor_info_width},
outputs={'segmentation_map': tensor_info_output},
method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))

请注意,字符串‘image',‘height',‘width'和‘segmentation_map'不是张量。相反,它们是引证实践张量input_tensor,image_height_tensor和image_width_tensor的逻辑称号。因而,它们能够是你喜爱的任何仅有字符串。此外,SignatureDefs中的映射与TensorInfo protobuf目标有关,而与实践张量无关。要创立TensorInfo目标,咱们运用实用程序函数:tf.saved_model.夜趣宅男utils.build_tensor_inf长吉乡o(tensor)。

现在咱们调用add_meta_graph_and_variables()函数来构建SavedModel协议缓冲区目标,然后咱们运转save()办法,它会将模型的快照保存到包括模型变量和资源的磁盘。

builder.add_meta_graph_and_variables(
sess, [tf.saved_model.tag_constants.SERVING],
signature_def_map={
'predict_images':
prediction_signature,
})
# export the model
builder.save(as_text=True)
print('Done exporting!')

现在咱们能够运转deeplab_saved_model.py来导出咱们的模型。

假如一切顺利,你将看到文件夹./serving/versions/1,请注意,“1”表明模型的当时版别。在每个版别子目录中,你将看到以下文件:



saved_model.pb或saved_model.pbtxt,这是序列化的SavedModel文件。它包括模型的一个或多个图形界说,以及签名界说。

变量,该文件夹包括图形的序列化变量。

现在,咱们已准备好发动咱们的模型效力器。为此,请运转:

$ tensorflow_model_server --port=9000 --model_name=deeplab --model_base_path=

该model_base_path指的是输出模型保存,别的,咱们不在途径中指定版别文件夹,模型版别操控由TF效力处理。

生成客户端恳求

客户端代码十分简略,看一下:deeplab_client.ipynb。首要,咱们读取要发送到效力器的图画并将其转换为正确的格局。接下来,咱们创立一个gRPC存根,存根答应咱们调用长途效力器的办法。为此,咱们将实例化prediction_service_pb2模块的beta_create_PredictionService_stub类。此刻,存根坚持调用长途进程的必要逻辑,就像它们是本地的相同。

现在,咱们需求创立和设置恳求目标。因为咱们的效力器完成了TensorFlow Predict API,因而咱们需求解析Predict恳求。要宣布Predict恳求,首要,咱们从predict_pb2模块中实例化PredictRequest类。咱们还需求指定model_spec.name和model_spec.signature_name参数。该称号参数是当咱们推出的效力器界说的“模型称号”的说法,而signature_name是指分配给逻辑称号signature_def_map()的参数add_meta_graph()函数。

# create the RPC stub
channel = implementations.insecure_channel(host, int(port))
s役组词tub = prediction_service_pb2.beta_create_PredictionService_stub(channel)
# create the request object and set the name and signature_name params
request = predict_pb2.PredictRequest()
request.model_spec.name = 'deeplab'
request.model_spec.signature_name = 'predict_images'
# fxiannuhuill in the request object with the necessary data
request.inputs['images'].CopyFrom(
tf.contrib.util.make_tensor_proto(image.astype(dtype=np.float32), shape=[1, height, width, 3]))
request.inputs['height'].CopyFrom(tf.contrib.util.make_tensor_proto(height, shape=[1]))
request.inputs['width'].CopyFrom(tf.contrib.util.make_tensor_proto(width, shape=[1]))

接下来,咱们有必要供给效力器签名中界说的输入数据。请记住,在效力器中,咱们界说女性交配了一个Predict API来预期图画以及两个标量(图画的高度和宽度)。为了将输入数据供给给恳求目标,TensorFlow供给了实用程序tf.make_tensor_proto(),此办法是从Python/numpy创立的TensorProto目标,咱们能够运用它将图画及其尺度供给给恳求目标。

看起来咱们现已准备好调用效力器了。为此,咱们调用Predict()办法(运用存根)并将恳求目标作为参数传递。gRPC支撑:同步和异步调用。因而,假如你在处理恳求时想要做一些作业,咱们能够调用Predict.future()而不是Predict()。

# sync requests
result_future = stub.Predict(request, 30.)
# For async requests
# result_future = stu爱上岳父b.Predict.future(reque广东信华电器有限公司st, 10.)
# Do some work...
# result_future = result_future.result()

现在咱们能够获取并享用成果。


作者:【方向】

有好的文章希望我们帮助分享和推广,猛戳这里我要投稿

返回列表
上一篇:
下一篇: