用Docker部署TensorFlow Serving服务
文章目录
- 1. 安装 Docker
- 2. 使用 Docker 部署
- 3. 请求服务
- 3.1 手写数字例子
- 3.2 猫狗分类例子
参考:
https://tf.wiki/zh_hans/deployment/serving.html#
https://tensorflow.google.cn/tfx/serving/docker
1. 安装 Docker
以下均为 centos7 环境
参考文章:docker安装等操作
2. 使用 Docker 部署
- 拉镜像
docker pull tensorflow/serving
- 模型路径,版本号1,2,默认加载最大数字的
- bash 输入命令,注意路径,
mymodel
跟请求的代码保持一致
docker run -p 8501:8501 --mount type=bind,source=/home/dnn/project/tf2,target=/models/mymodel -e MODEL_NAME=mymodel -t tensorflow/serving
- 手写数字识别 模型代码+导出模型
# 手写数字 tf 实现
import numpy as np
import tensorflow as tfclass MNistLoader():def __init__(self):data = tf.keras.datasets.mnist# 加载数据(self.train_data, self.train_label), (self.test_data, self.test_label) = data.load_data()# 扩展维度,灰度图1通道 [batch_size, 28, 28, chanels=1]self.train_data = np.expand_dims(self.train_data.astype(np.float32) / 255.0, axis=-1)self.test_data = np.expand_dims(self.test_data.astype(np.float32) / 255.0, axis=-1)self.train_label = self.train_label.astype(np.int32)self.test_label = self.test_label.astype(np.int32)# 样本个数self.num_train_data, self.num_test_data = self.train_data.shape[0], self.test_data.shape[0]def get_batch(self, batch_size):# 从训练集里随机取出 batch_size 个样本idx = np.random.randint(0, self.num_train_data, batch_size)return self.train_data[idx, :], self.train_label[idx]# 自定义多层感知机模型
class MLPmodel(tf.keras.Model):def __init__(self):super().__init__()# 除第一维以外的维度展平self.flatten = tf.keras.layers.Flatten()self.dense1 = tf.keras.layers.Dense(units=100, activation='relu')self.dense2 = tf.keras.layers.Dense(units=10)@tf.function # 计算图模式,导出需要def call(self, input):x = self.flatten(input)x = self.dense1(x)x = self.dense2(x)output = tf.nn.softmax(x)return outputnum_epochs = 5
batch_size = 50
learning_rate = 1e-4mymodel = MLPmodel()data_loader = MNistLoader()mymodel.compile(optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate),loss=tf.keras.losses.sparse_categorical_crossentropy,metrics=[tf.keras.metrics.sparse_categorical_accuracy]
)
mymodel.fit(data_loader.train_data, data_loader.train_label,batch_size=batch_size,epochs=num_epochs)# 导出模型
tf.saved_model.save(mymodel, "./2")
# 载入模型
mymodel = tf.saved_model.load('./2')res = mymodel.call(data_loader.test_data)
print(res)
3. 请求服务
3.1 手写数字例子
import numpy as np
import tensorflow as tf
import json
import requests
import matplotlib.pyplot as pltclass MNistLoader():def __init__(self):data = tf.keras.datasets.mnist# 加载数据(self.train_data, self.train_label), (self.test_data, self.test_label) = data.load_data()# 扩展维度,灰度图1通道 [batch_size, 28, 28, chanels=1]self.train_data = np.expand_dims(self.train_data.astype(np.float32) / 255.0, axis=-1)self.test_data = np.expand_dims(self.test_data.astype(np.float32) / 255.0, axis=-1)self.train_label = self.train_label.astype(np.int32)self.test_label = self.test_label.astype(np.int32)# 样本个数self.num_train_data, self.num_test_data = self.train_data.shape[0], self.test_data.shape[0]def get_batch(self, batch_size):# 从训练集里随机取出 batch_size 个样本idx = np.random.randint(0, self.num_train_data, batch_size)return self.train_data[idx, :], self.train_label[idx]size = 6
dataloader = MNistLoader()data = json.dumps({'instances': dataloader.test_data[0:size].tolist()
})headers = {'content-type': 'application/json'}json_response = requests.post(url='http://localhost:8501/v1/models/mymodel:predict',data=data, headers=headers
)pred = np.array(json.loads(json_response.text)['predictions'])
print("预测结果:", np.argmax(pred, axis=-1))# 打印图片
plt.subplots(1, size)
idx = 1
for img in dataloader.test_data[0:size]:plt.subplot(1, size, idx)plt.imshow(img)idx += 1
plt.show()
输出:
预测结果: [7 2 1 0 4 1]
跟图片显示一致
3.2 猫狗分类例子
模型代码
训练完后,导出模型
tf.saved_model.save(model, './3')
import numpy as np
import tensorflow as tf
import json
import requests
import matplotlib.pyplot as plttest_pic = ["./dogs-vs-cats/test/1.jpg","./dogs-vs-cats/test/7.jpg"]# 狗1, 猫0
test_data = np.array([_decode_and_resize(f).numpy() for f in test_pic])data = json.dumps({'instances': test_data.tolist()
})headers = {'content-type': 'application/json'}json_response = requests.post(url='http://localhost:8501/v1/models/mymodel:predict',data=data, headers=headers
)
pred = np.array(json.loads(json_response.text)['predictions'])
print("预测结果:", np.argmax(pred, axis=-1))for img in test_data:plt.imshow(img)plt.show()
输出:
预测结果: [1 0] # 狗,猫
用Docker部署TensorFlow Serving服务相关推荐
- Win10 基于Docker使用tensorflow serving部署模型
目录 安装Docker for Windows 安装 tensorflow-serving-api tensorflow serving on docker 测试tf server 方法3:grpc ...
- 基于docker部署的微服务架构(九): 分布式服务追踪 Spring Cloud Sleuth
为什么80%的码农都做不了架构师?>>> 前言 微服务架构中完成一项功能经常会在多个服务之间远程调用(RPC),形成调用链.每个服务节点可能在不同的机器上甚至是不同的集群上,需 ...
- Docker学习篇——使用Docker部署账单微服务项目
Docker概念 Docker 是一个开源的应用容器引擎 诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc) Docker 可以让开发者打包他们 ...
- Win10下基于Docker使用tensorflow serving部署模型
windows就是更坑 安装Docker for Windows 前提:Docker for Windows需要带有Hyper-V的64位Windows 10 Pro,如果您的系统不符合运行Docke ...
- docker部署tomcat+mysql服务
mysql服务 以sql文件clock_in.sql为例 当然也可以选择直接先起一个mysql容器,用数据库管理工具建.这边主要是为了自动部署. clock_in.sql /* Navicat MyS ...
- docker部署zabbix6.0服务
前言 服务器 ip 规格 相关信息 CentOS7.9 Linux localhost 3.10.0-1160.83.1.el7.x86_64 192.168.56.110 1c2g40GB dock ...
- 基于docker部署的微服务架构(四): 配置中心
原文:http://www.jianshu.com/p/b17d65934b58%20 前言 在微服务架构中,由于服务数量众多,如果使用传统的配置文件管理方式,配置文件分散在各个项目中,不易于集中管理 ...
- Docker部署运行微服务
1.环境准备: 主机: X-shell X-ftp jar包 这里只说下jar包,另外两个到官网下载即可 Idea打包jar包流程 先按这四步走 先点击左下的框框,再点击maven,出现右边的窗口,点 ...
- ubuntu用Docker部署kafka消息服务
** 为了方便后续的配置,以下部署的时候IP都统一使用同一个IP ** 首先,先下载两个官方images: docker pull wurstmeister/kafka docker pull wur ...
最新文章
- uva 11212 Editing a Book
- 内存的静态分配和动态分配的区别【转】 静态分配内存与动态分配内存的区别
- 基于bert模型的文本分类研究:“Predict the Happiness”挑战
- SpringCloud中父子pom的结构和写法
- 【渝粤教育】国家开放大学2018年春季 8638-22T薪酬制度与薪酬管理 参考试题
- python模拟购物车购物过程_Python基于数列实现购物车程序过程详解
- Spring注解大全(更新中)
- ffplay.exe操作方式
- SpringMVC的RESTful(二)定制格式
- Google亲儿子 Nexus/Pixel 手机刷机Root之旅
- JavaScript高级知识总结(高级篇)
- android 手势密码存储,Android 简易手势密码开源库详解
- java docx4j 目录,1、带你一起拥有docx4j
- STM32单片机最小系统详解
- 华为交换机5855设置ssh
- mysql 等距随机_随机起点对称等距抽样公式的简便运用
- 几种实现数据扁平化的方法
- 远程终端工具Xshell、Xftp传输工具、VMware 、CentOS7的下载、安装和使用教程(完整版)
- scratch课程设计
- jQuery判断元素是否显示与隐藏
热门文章
- 红河学院计算机科学与技术,2016年红河学院计算机科学与技术专业最低分是多少?...
- 单例设计模式-静态内部类
- 解决:Navicat for mysql 设置外键出错
- python实现哈希表
- linux内核的I2C子系统详解4——i2c-s3c2410.c文件中的adapter、algorithm
- (二)AS给button添加点击事件
- PowerBuilder调用.Net编译好的DLL
- [转载] 杜拉拉升职记——39 充满变数的时期
- InterDev 调试错误信息: Unable to set server into correct debugging state automatically....的解决办法...
- Delphi作为客户端调用.Net写的WCF服务端?