Tensorflow2.0+部署(tensorflow/serving)过程备忘记录Windows+Linux

Tensorflow2.0+部署(tensorflow/serving)过程备忘记录

部署思路:采用Tensorflow自带的serving进模型部署,采用容器docker

1.首先安装docker

下载地址(下载windows版本):https://desktop.docker.com/

  1. docker安装
    安装就按正常流程一步一步安装即可
  2. window环境检查
    win10,win11版本及以上
    虚拟化是否开启(用处不知道,反正大家都开启了,网上有教程,可以搜搜)在这里插入图片描述
  3. 安装wsl
    下图是截别人的图
    在这里插入图片描述
  4. 安装docker成功
    (1)桌面会出现Docker Desktop图标,点击进入后界面如下
    在这里插入图片描述
    (2)给docker添加阿里云镜像源,为了后续下载东西更方便
    注册、登录阿里云(支付宝、淘宝扫码都可)
    在这里插入图片描述
    (3)进入后,可以看到自己独立的镜像加速器,是一个网址,最下方一行是给docker配置镜像源的方法,或者直接在Docker Desktop里面,添加那一行命令即可
    在这里插入图片描述
    (4)打开Docker Desktop ,点击设置,Docker Engine,添加上图中的代码到窗口中,点击应用和重启按钮即可
    在这里插入图片描述
    (5)win+R,打开命令行,输入docker info,查看是否应用成功
    在这里插入图片描述

2.安装tensorflow/serving服务

1.docker 拉取tensorflow/serving服务
安装tensorflow 2.6.0的GPU服务

docker pull tensorflow/serving:2.6.0-gpu

安装tensorflow 2.6.0的CPU服务

docker pull tensorflow/serving:2.6.0

2.查看是否拉取成功,其中,GPU版本比较大

docker images

在这里插入图片描述

3.准备模型测试

1.先拿官方例子测试一下,先下载一下tensorflow/serving2.6.0,然后在该目录结构下,找到 saved_model_half_plus_two_gpu例子,整体拷贝到想要放置的位置
在这里插入图片描述
2.开始发布一下该服务
(1)GPU版本,–gpus all 标注了下使用机器的所有GPU,我这边不加提示找不到GPU
注意:
下面的绝对路径表示模型存放的实际路径,最后一个参数项需要指定运行的容器和版本,里面的其他参数照猫画虎吧,很好理解,具体参数项也比较复杂

docker run --gpus all -t --rm -p 8501:8501 -v "C:/Users/lixia/.docker/tf_serving/saved_model_half_plus_two_gpu:/models/saved_model_half_plus_two_gpu" -e MODEL_NAME=saved_model_half_plus_two_gpu tensorflow/serving:2.6.0-gpu

出现了如下图,则表示发布成功
在这里插入图片描述
此时,在Docker Desktop中可以看到该服务信息
在这里插入图片描述
此时,浏览器访问localhost:8501,看是否能连通

http://localhost:8501/v1/models/saved_model_half_plus_two_gpu

出现该信息,则表示可以正常连通和访问了
在这里插入图片描述
3.测试调用一下该服务,是否能正常返回结果

#调用官方例子 线性回归小例子 y=0.5*x+2.0
import requests
import jsonurl='http://localhost:8501/v1/models/saved_model_half_plus_two_gpu:predict'
pdata = {"instances":[1.0, 2.0, 3.0]}
param = json.dumps(pdata)
res = requests.post(url, data= param)
print(res.text)

在这里插入图片描述
出现该结果表示部署成功
在这里插入图片描述
4.服务停止
(1)去Docker Desktop界面端中,手动终止,上面有图
(2)命令行的形式停止

查看运行中的服务
docker ps
终止服务 ****表示ID
docker stop ******

在这里插入图片描述

4.准备自己的模型部署测试

准备一个部署练习代码:是否佩戴口罩检测(YOLOv5)
1.首先需要有一个训练好的模型文件,如下图,是我训练好的一个模型
在这里插入图片描述
2.将.h5模型转换为.pb模型
直接使用TF自带的函数转(tf.keras.models.save_model),我的模型初始化+参数加载都在yolo.YOLO()中完成了

import tensorflow as tf
import yolodef export_serving_model(path,version=1):"""导出标准的模型格式:param path::return:"""#路径+模型名字+版本export_path = './yolov5_mask_detection/1'#调用模型,指定训练好的.h5文件model = yolo.YOLO()#导出模型tf.keras.models.save_model(model.yolo_model,export_path,overwrite=True,include_optimizer=True,save_format=None,signatures=None,options=None)

运行完后,会生产出下面文件结构的模型.pb文件,直接拷贝上上级整体目录结构即可yolov5_mask_detection
在这里插入图片描述
3.将pb模型发布服务
(1)我直接拷贝到D盘根目录
在这里插入图片描述
(2)发布GPU服务

docker run --gpus all -t --rm -p 8501:8501 -v "D:/yolov5_mask_detection:/models/yolov5_mask_detection" -e MODEL_NAME=yolov5_mask_detection tensorflow/serving:2.6.0-gpu

(3)发布CPU服务
直接发布即可,发现GPU模型直接可以在CPU使用

docker run -t --rm -p 8501:8501 -v "D:/yolov5_mask_detection:/models/yolov5_mask_detection" -e MODEL_NAME=yolov5_mask_detection tensorflow/serving:2.6.0

出现如下,表示发布成功
在这里插入图片描述
4.调用模型
(1)新建一个裸的python环境,最好和tf用的版本一致,保不齐会出现问题啥的,如果缺少requests 、numpy、PIL库,pip install安装即可;
(2)调用代码前,如果不知道输入输出是啥,需要看下
进行conda环境,激活tf虚拟环境,输入命令查看

#打开anaconda命令行输入
conda activate tensorflow-gpu
#产看模型的输入输出和网络结构,绝对路径表示模型存放路径
saved_model_cli show --dir D:\yolov5_mask_detection\1 --all

输出参数包含三个,yolo_eval_1表示概率值;yolo_eval_2表示标签值;yolo_eval表示目标检测框
在这里插入图片描述
(3)调用代码,核心代码和上述官方例子一致,只不过加了些影像读取+预处理代码
代码如下:

import json
import time
import requests
import numpy as np
from PIL import Image
import ujson#---------------------------------------------------#
#   对输入图像进行resize,模型训练过程也采用了同样的方法
#---------------------------------------------------#
def resize_image(image, size, letterbox_image):iw, ih  = image.sizew, h    = sizeif letterbox_image:scale   = min(w/iw, h/ih)nw      = int(iw*scale)nh      = int(ih*scale)image   = image.resize((nw,nh), Image.BICUBIC)new_image = Image.new('RGB', size, (128,128,128))new_image.paste(image, ((w-nw)//2, (h-nh)//2))else:new_image = image.resize((w, h), Image.BICUBIC)return new_image
#---------------------------------------------------#
#   对输入图像进行归一化,模型训练过程也采用了同样的方法
#---------------------------------------------------#
def preprocess_input(image):image /= 255.0return image
#服务网址
url = 'http://localhost:8501/v1/models/yolov5_mask_detection:predict'
#计时器
tt1 = time.time()
#输入的影像路径
image = Image.open("1.jpg")
#影像需要重采样成640*640
image_data  = resize_image(image, (640, 640), True)
#维度扩展,和模型训练保持一致
image_data  = np.expand_dims(preprocess_input(np.array(image_data, dtype='float32')), 0)
#原始影像大小,主要是为了将描框放缩到初始影像大小时用到的参数
input_image_shape = np.expand_dims(np.array([image.size[1], image.size[0]], dtype='float32'), 0)
#构造输入的参数类型,有两个参数,第一个表示影像数据1*640*640*3,第二个表示初始影像宽高
# data = json.dumps({
#     "signature_name": "serving_default",
#     "inputs":
#         {"input_1": image_data.tolist(), "input_2": input_image_shape.tolist()}
# })
#换一种json解析方法,速度更快
data = ujson.dumps({"signature_name": "serving_default","inputs":{"input_1": image_data.tolist(), "input_2": input_image_shape.tolist()}})
#构造headers
headers = {"content-type":"application/json"}
#发送请求
r = requests.post(url, data=data, headers=headers)
#计时器终止
tt2 = time.time()
print(tt2-tt1)
#打印返回的结果,这里表示所有框的位置
print(r.text)

注意:
实际测试中发现,大影像转json时,效率偏低,可以直接使用ujson进行替换,其他更优的办法暂时也不过多探讨
**1.安装ujson

pip install ujson

在这里插入图片描述
**2.测试记录

import ujson
****tt2 = time.time()# 构造输入的参数类型,有两个参数,第一个表示影像数据1*640*640*3,第二个表示初始影像宽高# -------------------------------------------------------------------------------------data = json.dumps({"signature_name": "serving_default","inputs":{"input_1": image_data.tolist(), "input_2": input_image_shape.tolist()}})tt21 = time.time()print("json方式:",tt21 - tt2)# ------------------------------------------------------------------------------------data = ujson.dumps({"signature_name": "serving_default","inputs":{"input_1": image_data.tolist(), "input_2": input_image_shape.tolist()}})tt22 = time.time()print("ujson方式:",tt22 - tt21)

效率大概提升一倍多,可以一定程度提升推理速度,大数据情况可以考虑,小数据无所谓
在这里插入图片描述
直接右键运行,得到结果,表示该程序检测出了9个目标,概率值+标签+目标框像素位置如下,通过解析json,可以得到目标检测结果
在这里插入图片描述
(4)我们看下,将检测结果标记到图上后,效果如下:
在这里插入图片描述
换个图片试一下
在这里插入图片描述

5.将docker环境整体打包到其他电脑测试(2024/03/06补充)

在本机电脑测试通过后,在其他电脑测试一下是否行的通
1.在测试机安装docker
(1)正常安装docker
在这里插入图片描述
需要注意的是:
我安装完成后,没有很顺利的打开软件,提示“docker machine stop”,经过查询说是没有关闭Hyper-V(控制面板->程序->启动和关闭windos功能),但是我的测试机压根没有这个选项,运行以下脚本安装即可,但是可能要下载东西,也不知道离线安装可咋弄,脚本如下(新建任意.bat文件,以管理员权限安装即可,安装后重启):

pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

测试机docker启动正常
在这里插入图片描述
(2)将源机器中的tensorflow/serving:2.6.0镜像打包出来,docker命令如下:

#将镜像源打包出来 save后面的两个参数分别表示镜像源名称+版本和保存出的.tar包名称,或者指定输出目录
docker save tensorflow/serving:2.6.0 > tensorflow_serving.tar
docker save tensorflow/serving:2.6.0 > D:/tensorflow_serving.tar

打包后的结果
在这里插入图片描述
(3)在测试机的docker环境中加载该文件,命令如下:

#把指定位置的镜像源加载进来
docker load < D:\detection\tensorflow_serving.tar

在这里插入图片描述
2.将程序打包,或者在新机器安装python环境,我选择简单的方法,直接打包源程序到exe,看是否能正常调用
(1)将测试代码使用pyinstaller插件进行打包,打包命令很简单,打包后的结果在统计目录dist文件夹下

#安装 
pip install pyinstaller -i 清华源地址
#打包
pyinstaller main.py

在这里插入图片描述
3.在测试机启动服务
(1)将模型文件整体拷贝到测试机的某个位置,如还是D盘
(2)启动命令和上面一致,我拷贝下来

docker run -t --rm -p 8501:8501 -v "D:/detection/yolov5_mask_detection:/models/yolov5_mask_detection" -e MODEL_NAME=yolov5_mask_detection tensorflow/serving:2.6.0

在这里插入图片描述
(3)运行测试exe,看是否正常打印结果,代码还是口罩检测,只不过我输出的信息只显示了ujson方式将影像数据整理为json格式的耗时;
**注意:**实际使用过程中,可以给exe传入一个json参数文件,做输入参数和输出参数的交互文件,外部再包一层解析json和可视化的程序
在这里插入图片描述

6.linux部署测试(实际使用中,大部分应该都是linux环境)

发现很方便,部署步骤和windows一模一样,linux环境下,安装docker,加载镜像,发布服务,调用,直接用window那一套东西就行
(1)准备一个linux环境,我使用的是centos7.5,虚拟机,保证本地和虚拟机环境可以互通(可以ping通网址)

#查看ip地址
ip addr

在这里插入图片描述
本地和虚拟机可以互通
在这里插入图片描述
(2)安装docker环境,如果有网络的话,直接yum命令安装即可,离线安装也可,需要查对应教程,我使用前者

#更新源,看情况吧
yum update
# 不指定版本安装,默认安装最新版
yum install -y docker-ce
# 指定版本安装
yum -y install docker-ce-20.10.6-3.el7
#启动docker
systemctl start docker
#查看docker状态systemctl status docker

在这里插入图片描述
(3)加载镜像+把模型文件拷贝到linux,直接用window那一套东西,然后启动服务

#加载镜像
docker load < /home/lixiao/software/AImodel/tensorflow_serving.tar
#查看当前docker环境下的镜像
docker images
#启动服务:模型存放路径要改改
docker run -t --rm -p 8501:8501 -v "D:/detection/yolov5_mask_detection:/models/yolov5_mask_detection" -e MODEL_NAME=yolov5_mask_detection tensorflow/serving:2.6.0

在这里插入图片描述
当前正在运行的服务docker ps
在这里插入图片描述
查看是否能正常访问http://localhost:8501/v1/models/yolov5_mask_detection
在这里插入图片描述
(4)本地调用,需要注意的是localhost需要改成实际的虚拟机地址
在这里插入图片描述
用上面的代码测试,可以测试通过,至此,完成linux+docker下的tensorflow模型部署
在这里插入图片描述
问题1:linux下部署的模型,post请求时,耗时比window下部署的情况要慢的多,差不多三四倍吧
原因1:可能是虚拟机和本机的网络问题,有裸机实体机+高速网络可能就会好点了
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++分割线++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
至此,深度学习tensorflow的部署先告一段落,目前没有项目需求,只是练手阶段,如果遇到新问题还会继续补充在后续…

7.一些备忘记录

1.conda 环境整体打包移植

//----------------------------------------------------------------------------------------------------------
conda 环境打包到其他电脑要将 Conda 环境打包并迁移到其他电脑上使用,可以按照以下步骤进行操作:导出 Conda 环境: 在源电脑上使用以下命令导出 Conda 环境的配置信息到一个 YAML 文件中:conda env export > environment.yml
复制环境文件: 将生成的 environment.yml 文件复制到目标电脑上。创建 Conda 环境: 在目标电脑上使用以下命令根据导出的环境文件创建相同的 Conda 环境:conda env create -f environment.yml
激活环境: 激活新创建的 Conda 环境:conda activate <environment_name>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/273092.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jmeter之Ramp-up Period(in seconds)

1、Ramp-up Period概念 &#xff08;in seconds&#xff09;–并发用户启动周期&#xff0c;告知JMeter 要在多长时间内启动全部Vuser用户。 2、为什么需要有“ramp-up period”&#xff0c;立即启动所有的并发用户数不是更好&#xff1f; 对于绝大多数的网址或应用&#xf…

【Prometheus】DataModel

数据模型 DataModel 指标 Metric metric 包含 metric name 和 metric label 格式&#xff1a; <metric name>{<label name><label value>, ...}例如&#xff1a;服务器 HTTP 接口 /messages 的总请求数 api_http_requests_total{method"POST",…

Jmeter(三) - 从入门到精通 - 测试计划(Test Plan)的元件(详解教程)

1.简介 上一篇中已经教你如何通过JMeter来创建一个测试计划&#xff08;Test Plan&#xff09;&#xff0c;那么这一篇我们就将JMeter启动起来&#xff0c;创建一个测试计划&#xff08;Test plan&#xff09;&#xff0c;然后给大家介绍一下测试计划&#xff08;Test Plan&am…

二,几何相交---4,BO算法---(1)接近性和可分离性

提了三个观点 1&#xff0c;如果一条直线&#xff08;比如竖直&#xff09;可以分开两个线段&#xff0c;则这两个线段不相交 2&#xff0c;只需要观察与隔离线相交的几个线段 3&#xff0c;从左向右扫描线只需要观察每个线段的两个端点和一些可能的相交点。

力扣18:三数之和

15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 题意&#xff1a;给你一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;请你找出所有满足条件且不重复的三元组。 注意&a…

目标检测5:采用yolov8, RK3568上推理实时视频流

上一个效果图&#xff0c;海康球机对着电脑屏幕拍&#xff0c;清晰度不好。 RK3568接取RTSP视频流&#xff0c;通过解码&#xff0c;推理&#xff0c;编码&#xff0c;最终并把结果推出RTSP视频流。 RK3568 推理 数据集采用coco的80个种类集&#xff0c;通过从yovo8.pt&#x…

2024年AI辅助研发趋势:探索未来研发工作的AI应用

引言&#xff1a; 随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经深入到了各个行业&#xff0c;其中包括研发领域。在2024年&#xff0c;AI辅助研发将继续成为关注的焦点&#xff0c;因为它为研发工作带来了许多新的机遇和挑战。本文将探讨2024年…

【HTML】HTML基础7.3(自定义列表)

目录 标签 效果 代码 注意 标签 <dl> <dt>自定义标题</dt><dd>内容1</dd><dd>内容2</dd><dd>内容3</dd> 。。。。。。 </dl> 效果 代码 <dl><dt>蜘蛛侠系列</dt><dd>蜘蛛侠1</dd…

搭建nacos集群,并通过nginx实现负载均衡

nacos、eureka、consul、zookeeper等都是常用的微服务注册中心&#xff0c;这篇文章详细介绍一下在Ubuntu操作系统上搭建一个nacos的集群&#xff0c;以及通过nginx的反向代理功能实现nacos的负载均衡。 目录 一、安装nacos 1、安装nacos 2、修改nacos配置文件 3、创建naco…

css3中nth-child属性作用及用法剖析

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 标题&#xff1a;CSS3中nth-child属性作用及用法剖析 摘要&#xff1a;CSS3中的nth-child选择器允许我们根据元素位置来定位特定的元素…

android开发环境搭建

android开发环境搭建 Android 开发环境搭建1.JDK安装与配置1.1 Jdk官方下载1.2 JDK安装1.3 环境变量配置1.4 新建JAVA_HOME1.5 修改Path变量1.6 新建classpath1.7 验证环境是否配置完成 2.开发工具二选一1.如何创建一个工程2.工程的目录结构的了解3.与开发的相关的常规视图4.我…

【QA-SYSTEMS】CANTATA-解决Jenkins中build Cantata报错

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 解决Jenkins中build Cantata测试项目报找不到license server的错误。 2、 问题场景 在Jenkins中build Cantata测试项目&#xff0c;报错“Failed to figure out the license server correctly”。 3、软硬件环…

MT笔试题

前言 某团硬件工程师的笔试题&#xff0c;个人感觉题目的价值还是很高的&#xff0c;分为选择题和编程题&#xff0c;选择题考的是嵌入式基础知识&#xff0c;编程题是两道算法题&#xff0c;一道为简单难度&#xff0c;一道为中等难度 目录 前言选择题编程题 选择题 C语言中变…

Linux 理解进程

目录 一、基本概念 二、描述进程-PCB 1、task_struct-PCB的一种 2、task_ struct内容分类 三、组织进程 四、查看进程 1、ps指令 2、top命令 3、/proc文件系统 4、在/proc文件中查看指定进程 5、进程的工作目录 五、通过系统调用获取进程标示符 1、getpid()/get…

WPF 窗口添加投影效果Effect

BlurRadius&#xff1a;阴影半径 Color&#xff1a;颜色 Direction&#xff1a;投影方向 ShadowDepth&#xff1a;投影的深度 <Window.Effect><DropShadowEffect BlurRadius"10" Color"#FF858484" Direction"300" ShadowDepth&quo…

VB语言回忆录——到了是该放弃VB语言的时候了么

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 VB语言回忆录——到了是该放弃VB语言的时候了么 前言初次接触编程开始学习VB开始发挥作用版本变迁有感而发 前言 4年前&#xff08;2020年&#xff09;&#xff0c;微软 NET…

【AI辅助研发】-趋势:大势已来,行业变革

【AI辅助研发】-趋势&#xff1a;大势已来&#xff0c;行业变革 引言 在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;技术已逐渐渗透到各行各业&#xff0c;其中软件研发行业更是受益匪浅。AI辅助研发已成为大势所趋&#xff0c;不仅提高了软件开发的效…

Python接口自动化测试:断言封装详解

前言 在进行API接口测试时&#xff0c;断言起着至关重要的作用。断言是用于验证预期结果与实际结果是否一致的过程。在Python中&#xff0c;我们可以利用一些库来实现断言功能。 1. 安装必要的库 在Python中&#xff0c;我们主要会使用两个库&#xff1a;requests和jsonpath…

2024-03-10 c++

&#x1f338; MFC下拉框控件 | Combo Box eg 计算器 1。新建MFC项目&#xff08;基于对话框、静态库&#xff09; 2。添加控件&#xff0c;删除初始的3个多余控件 加3个edit control 加1个combo box&#xff0c;属性sort改为false&#xff0c;data为 ;-;;;% 加1个static text…

自动化运维利器Ansible基础(环境部署)

Ansible 介绍及安装 1. 介绍 Ansible 是⼀个 IT ⾃动化⼯具。它能配置系统、部署软件、编 排更复杂的 IT 任务&#xff0c;如连续部署或零停机时间滚动更新。 Ansible ⽤ Python 编写&#xff0c;尽管市⾯上已经有很多可供选择的 配置管理解决⽅案&#xff08;例如 Salt、Pupp…