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

使用 AWS Neuron TensorFlow Serving

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

有关 Neuron 开发工具包的更多信息,请参阅 AWS Neuron 开发工具包文档

先决条件

使用本教程之前,您应已完成 将 DLAMI 与 AWS Neuron 结合使用 中的设置步骤。您还应该熟悉深度学习知识以及如何使用 DLAMI。

激活 Conda 环境

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

source activate aws_neuron_tensorflow_p36

使用以下命令更新 Neuron 程序包:

conda update tensorflow-neuron

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

source deactivate

编译和导出保存的模型

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

import tensorflow as tf 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)]]