将tensorflow模型部署到服务器上

2023-11-02

基本思路:利用tensorflow官方提供的tensorflow serving进行部署,同时,为了免去环境配置等麻烦操作,可借助docker容器。

一、服务器环境选择

首先肯定要去租一个服务器,例如阿里云。一开始选了window server2012,结果很坑,装不了docker。上网想查解决方法,发现别人也遇到过这个问题。

了解的原因大概是:docker需要在linux的环境下运行。但通过在window server2012下使用vitural box运行linux虚拟机的办法不行,因为这样会造成二次虚拟(官方解释:阿里云给的轻量应用服务器是运行在虚拟机上的,所以不能再开虚拟机)。

不过网上一些大佬好像也给出了骚操作,但总之太过麻烦,不想去折腾,就没去尝试。

正当我觉得凉凉,想重新买linux服务器的时候,才发现阿里云的控制台上可以重新更改系统镜像,于是很愉快地换成了ubuntu18.04.

二、Ubuntu下docker容器的安装

前提条件:Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,通过 uname -r 命令查看你当前的内核版本。

接下来就是在linux终端敲命令了:

1.获取docker安装包

wget -qO- https://get.docker.com/ | sh

完成后会有一段提示

If you would like to use Docker as a non-root user, you should now consider

    adding your user to the "docker" group with something like:

    sudo usermod -aG docker runoob

   Remember that you will have to log out and back in for this to take effect!  

一般嫌麻烦的话,以后执行docker命令都在root下进行就可以了 

2.运行docker容器

sudo service docker start

3.测试hello-world程序

docker run hello-world

第一次应该会失败,因为容器里还没有这个项目,所以docker会去下载,第二次运行就可以了。

三、模型的部署

1.拉取带tensorflow serving的docker镜像

docker pull tensorflow/serving 

2.先来测试一下官方例子

cd /root/software/
git clone https://github.com/tensorflow/serving

将GitHub上的TensorFlow-serving拷贝下来,里面已经有一些模型,我们通过部署一个简单的模型上docker来观察结果

docker run -p 8501:8501 \
  --mount type=bind,\
source=/root/software/serving/tensorflow_serving/servables/tensorflow/testdata/saved_model_half_plus_two_cpu,\
target=/models/half_plus_two \
  -e MODEL_NAME=half_plus_two -t tensorflow/serving &

 运行成功后,我们写一个Python的代码测试

import requests
import json
pdata={"instances":[1,2,3]}
param=json.dumps(pdata)
res=requests.post('http://localhost:8501/v1/models/half_plus_two:predict',data=param)
print(res.text)

 可以看到res返回的结果,对应的是我们输入的1,2,3,之后我们就利用这种方式传递图片或其他数据过去

{
    "predictions": [2.5, 3.0, 3.5
    ]
}

结果分析:

启动docker的时候,开启了8501端口,后面url通过该端口进行访问

参数source表示你模型存放的文件夹,如果你去找这个文件夹,你会发现里面模型存放的格式有些特别,后面我们要部署模型时也需要先转为这种类型

model_name是docker上模型的名称,在url上也可以看到

target是存放在docker上的路径

下面就开始部署我们自己的模型了

4.部署自己模型

刚才第三步说过,要将模型导出为特殊的类型(有一个variables文件夹,同目录下一个pb模型,这个pb模型和之前的还不大一样)。

首先需要我们训练完模型后一个正常的checkpoint,转换的方法可以参考下面的做法

import tensorflow as tf
import numpy as np

x = tf.placeholder(tf.float32, name='input_x')
feed = np.random.rand(100)
y = x + 1

w = tf.Variable(0.)
b = tf.Variable(0.)

y_ = tf.add(tf.multiply(w, x), b)

loss = tf.reduce_mean(tf.square(y-y_))

optimizer = tf.train.GradientDescentOptimizer(0.2)
train = optimizer.minimize(loss)

init = tf.global_variables_initializer()

saver = tf.train.Saver()

with tf.Session() as sess:
    sess.run(init)
    for i in range(200):
        sess.run(train, feed_dict={x: feed})
        if i % 5 == 0:
            print(i, sess.run([w,b]))

    saver.save(sess, './linear/linear.ckpt')

with tf.Session() as sess2:
    sess2.run(init)
    saver.restore(sess2, './linear/linear.ckpt')

    # 将训练好的模型保存在modelName下,版本为1,当然你的版本可以随便写
    builder = tf.saved_model.builder.SavedModelBuilder("./modelName/1")

    inputs = {
        # 注意,这里是你预测模型的时候需要传的参数,调用模型的时候,传参必须和这里一致
        # 这里的input_x就是模型里面定义的输入placeholder
        "input_x": tf.saved_model.utils.build_tensor_info(x)
    }
    outputs = {
        "output_y": tf.saved_model.utils.build_tensor_info(y),
    }
    prediction_signature = tf.saved_model.signature_def_utils.build_signature_def(
        inputs=inputs,
        outputs=outputs,
        method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME
    )

    builder.add_meta_graph_and_variables(
        sess2,
        [tf.saved_model.tag_constants.SERVING],
        {tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: prediction_signature}
    )
    builder.save()

之后仿照样例模型,用docker运行这个模型就可以了,端口号、路径和模型名称什么的自定义即可,不冲突就行。 

docker run -p 8502:8501 \
  --mount type=bind,\source=/root/software/serving/tensorflow_serving/servables/tensorflow/testdata/face/face2,\target=/models/face2 \
  -e MODEL_NAME=face2 -t tensorflow/serving &

 一段测试代码,跟上面的有一点类似,具体什么参数看自己的模型

import requests
import numpy as np
import json
# json格式序列调整
class NumpyEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.ndarray):
            return obj.tolist()
        return json.JSONEncoder.default(self, obj)
feature=np.array(range(128))
param = {
	"instances":[
		#每一个大括号是一次请求,里面是每次请求的参数
              {
		"in":feature
	      }
	]
}
param = json.dumps(param, cls=NumpyEncoder)

res = requests.post("http://localhost:8502/v1/models/face2:predict", data=param)
# 根据自己设定的返回数据读取
# softmax = json.loads(res2.text)["predictions"][0]

至此,大功告成。 

PS:如果有多个模型需要部署,只需要修改本地端口号即可,不需要修改docker的端口号。(就是docker run命令的时候,只改第一个8501,不需要改第二个8501)

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将tensorflow模型部署到服务器上 的相关文章

随机推荐

  • post sql 数据库启动失败原因-记录

    打开服务 查看进程 若还有存活进程 杀掉相关post gres 相关的 重启服务 ok
  • windows软件或程序服务开机自启动的四种方式

    目录 方式一 1 脚本类型1 放入原脚本的快捷方式 脚本类型的 2 脚本类型2 自己写脚本 指向原服务路径 服务或软件类型的 方式二 添加任务计划方式 1 打开计算机管理 2 创建任务 添加任务名称和描述 根据需要随便填写 3 新建触发任务
  • 简单几何图形的识别与标记(opencv)

    一 实现目标 手绘简单几何图形 拍照后处理可识别并标记图形相应关键点 直线 识别并标记始末点 三角形 识别并标记三个角点 矩形 识别并标记四个角点 二 实现流程 通过Python与OpenCV进行编程 采用了获取图形角点数量的方式来识别图形
  • 3-1 客户评级

    某电商要对平台上客户进行评级 按客户的月平均消费情况进行评级 规则如下 输入年度的消费额 根据上表的月平均消费情况输出相应的 数 输入格式 输入年度消费额 输出格式 相应的 数 输入样例 在这里给出一组输入 例如 25000 输出样例 在这
  • nginx热备配置

    nginx热备是指主服务器发生宕机 或者其他原因导致服务不可用时启用备用服务器继续提供服务 下面来看看nginx是怎么配置的 upstream backend server 127 0 0 1 9001 主服务器 server 127 0
  • Ubuntu18.04 LTS下安装Clang

    Ubuntu18 04 LTS下安装Clang 一 在新系统后Ubuntu18 04 LTS下安装Clang会出现依赖缺失的问题 但一步步安装之后依旧是缺失依赖无法安装 正在读取软件包列表 完成 正在分析软件包的依赖关系树 正在读取状态信息
  • 【ML】介绍 PandasAI:生成式 AI Python 库

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • pm2查看、重启服务和日志

    简单科普 SSH 是一种网络协议 用于计算机之间的加密登录 PM2 是一个守护进程管理器 它将帮助您管理和保持应用程序在线 1 ssh远程登录 ssh hostAddress 通过输入密码 成功会登录到对应主机 如果失败会被拒绝 2 pm2
  • CSS基础学习--25 border(边框)进阶

    一 边框常见属性 border radius box shadow border image 属性 说明 CSS border image 设置所有边框图像的速记属性 3 border radius 一个用于设置所有四个边框 半径属性的速记
  • 15【背景 渐变色】

    26 背景 26 1 背景颜色 background color 属性定义了元素的背景颜色 background color 颜色值 一般情况下元素背景颜色默认值是 transparent 透明 我们也可以手动指定背景颜色为透明色 back
  • 如何做出领导满意的测试报告?Parasoft自动化软件测试数据管理了解一下

    大家在做自动化测试时是如何管理测试数据的呢 测试情况是如何实时把控的呢 对于领导来说 需要的是一份报告 而对于开发测试人员 这份数据报告的内容和形式就非常重要 这里为大家介绍一款专门针对代码级开发测试的数据管理平台 Parasoft DTP
  • HCIP笔记

    HCIP笔记 IERS OSPF协议基础 基于HCIA笔记 链路状态路由协议 OSPF的一些补充 RIP的不足 RIP是基于距离矢量算法的路由协议 RIP协议的组播地址为224 0 0 9 存在收敛速度慢 度量值不科学 扩展性差问题 互联网
  • 物联网毕设分享 火灾报警系统设计与实现

    文章目录 1 简介 2 绪论 2 1 课题背景与目的 3 烟雾传感器介绍 3 1 类型 3 2 MQ系列传感器介绍 3 3 模块介绍 4 系统设计 4 1 自诊断故障报警功能 4 2 烟雾浓度显示 4 3 烟雾报警功能 4 4 防止报警器误
  • 性能测试的方法及步骤

    一 测试方向 总体方向 性能效率测试是通过站在用户体验的角度 使用专业的负载生成设备 在性能模型的基础上验证系统是否能够达到用户提出的性能指标 是否符合用户文档中对系统设计时的性能关注点 在系统正常交互量及峰值交互量的情况下发现系统中存在的
  • Python基础:按位异或 ^ ,按位或

    前言 文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 版权归原作者所有 如有问题请及时联系我们以作处理 PS 如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http t cn A6Zvjdun 使用按位异或
  • JDK8 JVM参数与实际环境中的优化配置实践

    如何配置我们的JVM呢 首先我们需要知道JVM的参数有哪些 然后根据这些参数的意义去分析自己的程序的JVM需要的配置 可以事先做一些尝试 再逐步调优 这个调优也是一个过程 没有足够的经验而做到一步到位是一件很困难的事情 事情是一点点做的 不
  • 关于内存的编程题,对异常: 0xC0000005 的分析以及解决办法

    一 内存的思考题 请问运行Test函数会有什么样的结果 第一题 void GetMemory char p p char malloc 100 void Test void char str NULL GetMemory str strcp
  • Node.js到底是个啥?干什么用的?优缺点是什么?

    Nodejs简介 Node js是一个Javascript运行环境 runtime 是一个可以快速构建网络服务及应用的平台 是用Javascript语言构建的服务平台 可用于后端建立服务器 Node js与Javascript的区别 nod
  • error: cannot call member function ‘void me::sendMessage()‘ without object

    error cannot call member function void me sendMessage without object 原因分析 解决方案 原因分析 在connect中 传递函数地址不用带括号 参考函数指针的赋值 incl
  • 将tensorflow模型部署到服务器上

    基本思路 利用tensorflow官方提供的tensorflow serving进行部署 同时 为了免去环境配置等麻烦操作 可借助docker容器 一 服务器环境选择 首先肯定要去租一个服务器 例如阿里云 一开始选了window serve