文章目录

  • 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服务相关推荐

  1. Win10 基于Docker使用tensorflow serving部署模型

    目录 安装Docker for Windows 安装 tensorflow-serving-api tensorflow serving on docker 测试tf server 方法3:grpc ...

  2. 基于docker部署的微服务架构(九): 分布式服务追踪 Spring Cloud Sleuth

    为什么80%的码农都做不了架构师?>>>    前言 微服务架构中完成一项功能经常会在多个服务之间远程调用(RPC),形成调用链.每个服务节点可能在不同的机器上甚至是不同的集群上,需 ...

  3. Docker学习篇——使用Docker部署账单微服务项目

    Docker概念 Docker 是一个开源的应用容器引擎 诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc) Docker 可以让开发者打包他们 ...

  4. Win10下基于Docker使用tensorflow serving部署模型

    windows就是更坑 安装Docker for Windows 前提:Docker for Windows需要带有Hyper-V的64位Windows 10 Pro,如果您的系统不符合运行Docke ...

  5. docker部署tomcat+mysql服务

    mysql服务 以sql文件clock_in.sql为例 当然也可以选择直接先起一个mysql容器,用数据库管理工具建.这边主要是为了自动部署. clock_in.sql /* Navicat MyS ...

  6. docker部署zabbix6.0服务

    前言 服务器 ip 规格 相关信息 CentOS7.9 Linux localhost 3.10.0-1160.83.1.el7.x86_64 192.168.56.110 1c2g40GB dock ...

  7. 基于docker部署的微服务架构(四): 配置中心

    原文:http://www.jianshu.com/p/b17d65934b58%20 前言 在微服务架构中,由于服务数量众多,如果使用传统的配置文件管理方式,配置文件分散在各个项目中,不易于集中管理 ...

  8. Docker部署运行微服务

    1.环境准备: 主机: X-shell X-ftp jar包 这里只说下jar包,另外两个到官网下载即可 Idea打包jar包流程 先按这四步走 先点击左下的框框,再点击maven,出现右边的窗口,点 ...

  9. ubuntu用Docker部署kafka消息服务

    ** 为了方便后续的配置,以下部署的时候IP都统一使用同一个IP ** 首先,先下载两个官方images: docker pull wurstmeister/kafka docker pull wur ...

最新文章

  1. uva 11212 Editing a Book
  2. 内存的静态分配和动态分配的区别【转】 静态分配内存与动态分配内存的区别
  3. 基于bert模型的文本分类研究:“Predict the Happiness”挑战
  4. SpringCloud中父子pom的结构和写法
  5. 【渝粤教育】国家开放大学2018年春季 8638-22T薪酬制度与薪酬管理 参考试题
  6. python模拟购物车购物过程_Python基于数列实现购物车程序过程详解
  7. Spring注解大全(更新中)
  8. ffplay.exe操作方式
  9. SpringMVC的RESTful(二)定制格式
  10. Google亲儿子 Nexus/Pixel 手机刷机Root之旅
  11. JavaScript高级知识总结(高级篇)
  12. android 手势密码存储,Android 简易手势密码开源库详解
  13. java docx4j 目录,1、带你一起拥有docx4j
  14. STM32单片机最小系统详解
  15. 华为交换机5855设置ssh
  16. mysql 等距随机_随机起点对称等距抽样公式的简便运用
  17. 几种实现数据扁平化的方法
  18. 远程终端工具Xshell、Xftp传输工具、VMware 、CentOS7的下载、安装和使用教程(完整版)
  19. scratch课程设计
  20. jQuery判断元素是否显示与隐藏

热门文章

  1. 红河学院计算机科学与技术,2016年红河学院计算机科学与技术专业最低分是多少?...
  2. 单例设计模式-静态内部类
  3. 解决:Navicat for mysql 设置外键出错
  4. python实现哈希表
  5. linux内核的I2C子系统详解4——i2c-s3c2410.c文件中的adapter、algorithm
  6. (二)AS给button添加点击事件
  7. PowerBuilder调用.Net编译好的DLL
  8. [转载] 杜拉拉升职记——39 充满变数的时期
  9. InterDev 调试错误信息: Unable to set server into correct debugging state automatically....的解决办法...
  10. Delphi作为客户端调用.Net写的WCF服务端?