本文主要完成以下内容
- 使用MNIST模型进行训练
- 基于Tensorflow Serveing 搭建过程,基于Docker
- 模型测试
- Tensorflow-Serveing gRPC 远端预测调用
- Tensorflow -Serveing RESTful 远端预测调用
过程图
Tensorfow 基于Docker 搭建过程
MNIST 模型训练并生成model
- 上传mnist 对应的代码。避免下载训练数据失败, 这里一并上传。
- 进入notebook的容器, 运行训练数据
python /notebooks/mnist/source/mnist_saved_model.py --training_iteration=5000 --model_version=1 --work_dir=/notebooks/mnist/data /notebooks/model
3. 训练完后 , 数据被保存在了/notebooks/model中对应宿主机的/home/notebooks/model中
启动tensorflow-serveing docker 并指定model位置
docker run --rm -p 8501:8501 -p 8500:8500 \
-v "/home/notebooks/model:/models/mnist" \
-e MODEL_NAME=mnist -t tensorflow/serving &
说明:8500 gRPC使用端口, 8501 RESTful使用端口
mnist 模型名称
模型测试
启动后,使用mnist_client估算模型(因为需要tensorflow环境,这里直接进入notebook的容器执行)
python ./mnist/source/mnist_client.py --server=172.17.0.3:8500 --work_dir=./mnist/data
执行中会提示缺少tensorflow_serving的模组。
因为我们使用的是1.12.3的tensorflow的版本,这边需要使用pip下载该模组
pip install 'tensorflow-serving-api~=1.12.3'
到此tensorflow-serveing 已经启动,相关内容可以参考:官网
查看metadata定义
http://:8501/v1/models/mnist/metadata
外部访问tensorflow-serveing gRPC方式识别
参考“TensorFlow 建立过程(单机版)” 可以创建单机版本的Tensorflow+notebook 的环境, 并通过该环境执行py文件对图片进行识别。 conda 启动tensorflow12 的环境, 启动jupyter
以下为调用的方法
import time
import numpy as np
import grpc
from tensorflow.contrib.util import make_tensor_proto
from tensorflow.contrib import util as contrib_util
from tensorflow_serving.apis import predict_pb2
from tensorflow_serving.apis import prediction_service_pb2_grpc
import imageio
import matplotlib.pyplot as plt
from PIL import Image
def run(host, port, image, model, signature_name):
channel = grpc.insecure_channel('{host}:{port}'.format(host=host, port=port))
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
# Read an image
data = imageio.imread(image)
data = data.astype(np.float32)
#data = imageprepare(image)
data1 = Image.open(image);
plt.imshow(data1)
plt.axis('off') # 不显示坐标轴
plt.show()
#print(data)
start = time.time()
# Call classification model to make prediction on the image
request = predict_pb2.PredictRequest()
request.model_spec.name = model
request.model_spec.signature_name = signature_name
#mtp = make_tensor_proto(data, shape=[1, 784])
mtp = contrib_util.make_tensor_proto(data, shape=[1, 784])
request.inputs['images'].CopyFrom(mtp)
#print(request)
result = stub.Predict(request, 10.0)
end = time.time()
time_diff = end - start
print('耗时: {}'.format(time_diff))
response = np.array(result.outputs['scores'].float_val)
prediction = np.argmax(response)
print('{}{}'.format('识别为:',prediction))
run("ip地址", 8500, "./data/1.png", "mnist", "predict_images")
run("ip地址", 8500, "./data/2.png", "mnist", "predict_images")
run("ip地址", 8500, "./data/3.png", "mnist", "predict_images")
外部通过RESTful API的方式呼叫
以下通过python的方法来使用,因为各种语言均可使用RESTful的呼叫。 则Python通过其他也可以一样通过。
run("ip地址", 8501, "./data/1.png", "mnist", "predict_images")
run("ip地址", 8501, "./data/2.png", "mnist", "predict_images")
run("ip地址", 8501, "./data/3.png", "mnist", "predict_images")