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

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

使用 TensorFlow-Neuron 与AmazonNeuron 编译器

本教程介绍如何使用Amazon神经元编译器来编译 Keras ResNet-50 模型并将其作为保存的模型导出到 SavedModel 格式的日期和时间。这种格式是典型的 TensorFlow 模型可互换格式。您还可以学习如何使用示例输入,在 Inf1 实例上运行推理过程。 

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

先决条件

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

激活 Conda 环境

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

source activate aws_neuron_tensorflow_p36

要退出当前 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)]

下一个步骤

使用AmazonNeuron TensorFlow 供应