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

将 TensorFlow-Neuron 与 AWS Neuron 编译器结合使用

本教程演示如何使用 AWS Neuron 编译器编译 Keras Resnet-50 模型,并将该模型以 SavedModel 格式导出为已保存的模型。这种格式是典型的 TensorFlow 模型可交换格式。您还可以学习如何使用示例输入,在 Inf1 实例上运行推理过程。 

有关 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

Resnet50 编译

创建一个名为 tensorflow_compile_resnet50.py 的 Python 脚本,其中包含以下内容。此 Python 脚本编译 Keras ResNet50 模型,并将该模型导出为保存的模型。

import os import time import shutil import tensorflow as tf import tensorflow.neuron as tfn import tensorflow.compat.v1.keras as keras from tensorflow.keras.applications.resnet50 import ResNet50 from tensorflow.keras.applications.resnet50 import preprocess_input # Create a workspace WORKSPACE = './ws_resnet50' os.makedirs(WORKSPACE, exist_ok=True) # Prepare export directory (old one removed) model_dir = os.path.join(WORKSPACE, 'resnet50') compiled_model_dir = os.path.join(WORKSPACE, 'resnet50_neuron') shutil.rmtree(model_dir, ignore_errors=True) shutil.rmtree(compiled_model_dir, ignore_errors=True) # Instantiate Keras ResNet50 model keras.backend.set_learning_phase(0) model = ResNet50(weights='imagenet') # Export SavedModel tf.saved_model.simple_save(  session            = keras.backend.get_session(),  export_dir         = model_dir,  inputs             = {'input': model.inputs[0]},  outputs            = {'output': model.outputs[0]}) # Compile using Neuron tfn.saved_model.compile(model_dir, compiled_model_dir) # Prepare SavedModel for uploading to Inf1 instance shutil.make_archive(compiled_model_dir, 'zip', WORKSPACE, 'resnet50_neuron')

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

python tensorflow_compile_resnet50.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 ./ws_resnet50/resnet50 to ./ws_resnet50/resnet50_neuron ...

编译后,保存的模型将进行压缩,放置在 ws_resnet50/resnet50_neuron.zip 中。使用以下命令对模型解压缩,并下载用于推理的示例图像:

unzip ws_resnet50/resnet50_neuron.zip -d . curl -O https://raw.githubusercontent.com/awslabs/mxnet-model-server/master/docs/images/kitten_small.jpg

ResNet50 推理

创建一个名为 tensorflow_infer_resnet50.py 的 Python 脚本,其中包含以下内容。此脚本使用先前编译的推理模型,对下载的模型运行推理过程。

import os import numpy as np import tensorflow as tf from tensorflow.keras.preprocessing import image from tensorflow.keras.applications import resnet50 # Create input from image img_sgl = image.load_img('kitten_small.jpg', target_size=(224, 224)) img_arr = image.img_to_array(img_sgl) img_arr2 = np.expand_dims(img_arr, axis=0) img_arr3 = resnet50.preprocess_input(img_arr2) # Load model COMPILED_MODEL_DIR = './ws_resnet50/resnet50_neuron/' predictor_inferentia = tf.contrib.predictor.from_saved_model(COMPILED_MODEL_DIR) # Run inference model_feed_dict={'input': img_arr3} infa_rslts = predictor_inferentia(model_feed_dict); # Display results print(resnet50.decode_predictions(infa_rslts["output"], top=5)[0])

使用以下命令对模型运行推理过程:

python tensorflow_infer_resnet50.py

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

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

下一步

使用 AWS Neuron TensorFlow Serving