使用AmazonNeuron TensorFlow 供应 - 深度学习 AMI
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用AmazonNeuron TensorFlow 供应

本教程介绍如何构建图形,并将Amazon导出已保存的模型以与 Neuron 一起使用之前的编译步骤 TensorFlow Serving。 TensorFlow Serving 是一个服务系统,使您能够在网络中扩展推理。Neuron TensorFlow Serving 使用与普通 API TensorFlow Serving。唯一的区别是必须为编译保存的模型Amazon推理和入口点是一个名为的不同的二进制文件tensorflow_model_server_neuron. 二进制文件位于/usr/local/bin/tensorflow_model_server_neuron并已预安装在 DLAMI 中。

有关Neuron 开发工具包的更多信息,请参阅AmazonNeuron 开发工具包.

先决条件

使用本教程之前,您应已完成 启动 DLAMI 实例AmazonNeuron 中的设置步骤。您还应该熟悉深度学习知识以及如何使用 DLAMI。

激活 Conda 环境

激活 TensorFlow-Neuron Conda 环境使用以下命令:

source activate aws_neuron_tensorflow_p36

如果需要退出当前 Conda 环境,请运行:

source deactivate

编译和导出保存的模型

创建一个名为的 Python 脚本tensorflow-model-server-compile.py包含以下内容。 此脚本构建一个图形,并使用 Neuron 编译该图形。然后,它将编译的图形导出为保存的模型。 

import tensorflow as tf import tensorflow.neuron import os tf.keras.backend.set_learning_phase(0) model = tf.keras.applications.ResNet50(weights='imagenet') sess = tf.keras.backend.get_session() inputs = {'input': model.inputs[0]} outputs = {'output': model.outputs[0]} # save the model using tf.saved_model.simple_save modeldir = "./resnet50/1" tf.saved_model.simple_save(sess, modeldir, inputs, outputs) # compile the model for Inferentia neuron_modeldir = os.path.join(os.path.expanduser('~'), 'resnet50_inf1', '1') tf.neuron.saved_model.compile(modeldir, neuron_modeldir, batch_size=1)

使用以下命令编译该模型:

python tensorflow-model-server-compile.py

您的输出应与以下内容类似:

... INFO:tensorflow:fusing subgraph neuron_op_d6f098c01c780733 with neuron-cc INFO:tensorflow:Number of operations in TensorFlow session: 4638 INFO:tensorflow:Number of operations after tf.neuron optimizations: 556 INFO:tensorflow:Number of operations placed on Neuron runtime: 554 INFO:tensorflow:Successfully converted ./resnet50/1 to /home/ubuntu/resnet50_inf1/1

处理保存的模型

当模型编译完成后,您可以使用以下命令,通过 tensorflow_model_server_neuron 二进制文件处理保存的模型:

tensorflow_model_server_neuron --model_name=resnet50_inf1 \     --model_base_path=$HOME/resnet50_inf1/ --port=8500 &

您的输出应与以下内容类似。编译的模型由服务器暂存在Inferentia 设备的 DRAM 中,以准备好执行推理过程。

... 2019-11-22 01:20:32.075856: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:311] SavedModel load for tags { serve }; Status: success. Took 40764 microseconds. 2019-11-22 01:20:32.075888: I tensorflow_serving/servables/tensorflow/saved_model_warmup.cc:105] No warmup data file found at /home/ubuntu/resnet50_inf1/1/assets.extra/tf_serving_warmup_requests 2019-11-22 01:20:32.075950: I tensorflow_serving/core/loader_harness.cc:87] Successfully loaded servable version {name: resnet50_inf1 version: 1} 2019-11-22 01:20:32.077859: I tensorflow_serving/model_servers/server.cc:353] Running gRPC ModelServer at 0.0.0.0:8500 ...

生成发送给模型服务器的推理请求

创建一个名为 tensorflow-model-server-infer.py 的 Python 脚本,其中包含以下内容。该脚本通过 GRPC(这是一个服务框架)运行推理过程。

import numpy as np import grpc import tensorflow as tf from tensorflow.keras.preprocessing import image from tensorflow.keras.applications.resnet50 import preprocess_input from tensorflow_serving.apis import predict_pb2 from tensorflow_serving.apis import prediction_service_pb2_grpc from tensorflow.keras.applications.resnet50 import decode_predictions if __name__ == '__main__':     channel = grpc.insecure_channel('localhost:8500')     stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)     img_file = tf.keras.utils.get_file(         "./kitten_small.jpg",         "https://raw.githubusercontent.com/awslabs/mxnet-model-server/master/docs/images/kitten_small.jpg")     img = image.load_img(img_file, target_size=(224, 224))     img_array = preprocess_input(image.img_to_array(img)[None, ...])     request = predict_pb2.PredictRequest()     request.model_spec.name = 'resnet50_inf1'     request.inputs['input'].CopyFrom(         tf.contrib.util.make_tensor_proto(img_array, shape=img_array.shape))     result = stub.Predict(request)     prediction = tf.make_ndarray(result.outputs['output'])     print(decode_predictions(prediction))

通过使用 GRPC 以及以下命令,在模型上运行推理过程:

python tensorflow-model-server-infer.py

您的输出应与以下内容类似:

[[('n02123045', 'tabby', 0.6918919), ('n02127052', 'lynx', 0.12770271), ('n02123159', 'tiger_cat', 0.08277027), ('n02124075', 'Egyptian_cat', 0.06418919), ('n02128757', 'snow_leopard', 0.009290541)]]