Win10 基于Docker使用tensorflow serving部署模型
目录
安装Docker for Windows
- 前提:Docker for Windows需要带有Hyper-V的64位Windows 10 Pro,如果您的系统不符合运行Docker for Windows的要求,则可以安装 Docker Toolbox,它使用Oracle Virtual Box而不是Hyper-V。【注:我的是win10专业版1709,Docker现在可以使用Hyper-V技术在Windows上运行Linux容器(LCOW)。】
点击查看详情页- 打开Hyper-V服务:手动配置还是挺麻烦,可以通过Docker for Windows安装程序来启用Hyper-V,然后计算机会自动重启
- 等待docker小鲸鱼图标停止“喷水”——docker is starting或者docker is switching,成功后会是这样:
- 启动docker:建议使用powershell启动;
- win+R,输入powershell
- 运行一下命令验证安装:docker –version、docker-compose –version、docker-machine –version、docker version
- 关闭自动更新与开机自启:小图标右键:settings
- 查看更详细的初步教程
- Sign in and get started | Docker Documentation
安装 tensorflow-serving-api
pip install -U grpcio
pip install -U grpcio-tools
pip install -U protobuf
tensorflow-serving要和TensorFlow版本配合使用,否则后期调用会有一些问题
pip install tensorflow-serving-api==2.9
原文链接:https://blog.csdn.net/weixin_48185819/article/details/110164923
tensorflow serving on docker
docker pull tensorflow/serving:2.10.0
Tensor-serving安装
将模型转化好之后,开始Tensor-serving的安装,这里推荐docker的方式安装,方便快捷。直接通过一下命令拉去即可:
如果要使用tensor-serving样例就需要去github上去拉取,地址如下:
https://github.com/tensorflow/serving
然后,Tensor-serving支持两种方式进行部署:
gRPC
REST FULL
以上分别对应的端口为8500和8501,接下来就使用docker命令进行模型部署,先展示REST FULL的方式启动:
docker run -p 8501:8501 --mount type=bind,source=D:\jupyter_space\tensorserving\nerCheck,target=/models/nerCheck -e MODEL_NAME=nerCheck -t tensorflow/serving &
1
以上说明,-p为绑定的端口,–mount为挂载对应到具体win10路径下对应的模型路径,source为对应pb文件的路径,target为映射到docker容器里面的路径,-e 为模型的名称对应的文件夹名称,&为后台启动模式。
启动成功之后如下图所示:
然后用postman进行接口测试如下:
可以看到已经返回结果了,下面再采用gRPC的模式进行部署,命令只需要改为8500即可。
docker run -p 8500:8500 --mount type=bind,source=D:\jupyter_space\tensorserving\nerCheck,target=/models/nerCheck -e MODEL_NAME=nerCheck -t tensorflow/serving &
1
启动成功界面如下:
测试请求,需要安装和导入依赖如下:
import grpc
from tensorflow_serving.apis import prediction_service_pb2_grpc, predict_pb2
然后定义请求方法:
def tfserving_grpc(charinputs, seginputs):
server = '192.168.0.166:8500'
channel = grpc.insecure_channel(server)
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel)
request = predict_pb2.PredictRequest()
request.model_spec.name = 'nerCheck'
# request.model_spec.version.value = 1000001
request.model_spec.signature_name = 'serving_default'
# 构造输入
request.inputs["charinputs"].CopyFrom(tf.contrib.util.make_tensor_proto(charinputs))
request.inputs["seginputs"].CopyFrom(tf.contrib.util.make_tensor_proto(seginputs))
request.inputs["dropout"].CopyFrom(tf.contrib.util.make_tensor_proto(1.0))
response = stub.Predict(request, 300)
# 获取结果
results = {}
for key in response.outputs:
tensor_proto = response.outputs[key]
results[key] = tf.contrib.util.make_ndarray(tensor_proto)
# 输出结果
logits = results["logits"]
transitions = results["transitions"]
return logits, transitions
以上参照代码进行对应自己本地IP,输入和输出的修改即可,测试结果如下:
可以看到已经返回了,logits和trans只不过后续你自己根据返回的结果进一步写自己的预测代码即可。
以上即为win10+docker+tensorserving的模型两种方式的部署,本人做过测试,传统实例化加载模型的方式进行预测和利用tensorserving部署进行预测时间分别为:2.31s和0.05s,所以极大的提高了预测速度。
————————————————
版权声明:本文为CSDN博主「TheBugTao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013206079/article/details/110766412
tf加载pb模型:
这个能加载:
output_graph_path="./1"
new_model = tf.keras.models.load_model(output_graph_path)
new_model.predict(x_test)
这个加载报错:
output_graph_path="./1/saved_model.pb"
new_model = tf.keras.models.load_model(output_graph_path)
new_model.predict(x_test)
D:\Users\Administrator\miniconda3\envs\pynew\python.exe F:/project/shida/skipnet_cls/models/onnx_tf_demo.py
Traceback (most recent call last):
File "F:/project/shida/skipnet_cls/models/onnx_tf_demo.py", line 22, in <module>
new_model = tf.keras.models.load_model(output_graph_path)
File "D:\Users\Administrator\miniconda3\envs\pynew\lib\site-packages\keras\utils\traceback_utils.py", line 67, in error_handler
raise e.with_traceback(filtered_tb) from None
File "D:\Users\Administrator\miniconda3\envs\pynew\lib\site-packages\h5py\_hl\files.py", line 533, in __init__
fid = make_fid(name, mode, userblock_size, fapl, fcpl, swmr=swmr)
File "D:\Users\Administrator\miniconda3\envs\pynew\lib\site-packages\h5py\_hl\files.py", line 226, in make_fid
fid = h5f.open(name, flags, fapl=fapl)
File "h5py\_objects.pyx", line 54, in h5py._objects.with_phil.wrapper
File "h5py\_objects.pyx", line 55, in h5py._objects.with_phil.wrapper
File "h5py\h5f.pyx", line 106, in h5py.h5f.open
OSError: Unable to open file (file signature not found)
对tf-serving部署好奇,工作中又没有用到,故本人尝试在自己的笔记本电脑上安装docker进行实验。过程中不断踩坑,总结如下,心得是尝试新的东西要多看几篇博客嗯。
电脑版本说明
本人电脑原是Win10家庭中文版(我的电脑右键属性可以查看系统版本),按照网上一些参考文章安装了Typer V,修改注册表等操作,强行安装了docker,发现装好之后还是有问题,多次尝试未解决,升级为Win10专业版之后问题迎刃而解,关于两个版本的区别可自行百度。个人建议将Win10家庭版本直接升级为Win10专业版,升级方法非常简单,在“设置-更新和安全-激活”中更改产品密钥即可,点此参考。
以下操作是在Win10专业版中进行,之所以起这个标题是为了让更多Win10家庭版的人有个参考,不至于像我一样踩好多坑。
docker安装
不能识别docker-machine命令
我当时安装发现运行 docker-machine --version提示没有这个docker-machine命令。按照官网安装docker-machine,但是仍旧没有解决,故决定自己下载放在Docker所在路径下。
在官网 docker-machine下载相应版本的exe文件,然后将其放在目录下,我的目录是C:\Program Files\Docker\Docker\resources\bin,供参考,然后就可以用docker-machine命令了。
这个目录是如何找到的呢,右键我的电脑-属性-高级系统设置-高级-环境变量,选中path点击编辑,可以看到当前的环境变量,看到Docker所在的目录。
当系统运行一个命令没有完整的路径时,在当前目录下若找不到命令,系统会去环境变量路径搜索,像是Anaconda中离线下载的第三方库也可以放在相应的路径下。
安装tf-serving和运行样例
安装tf-serving
如果没有Git,先安装,在Power Shell中直接运行如下代码下载安装(安装路径可修改):
# 下载镜像和库
mkdir F:/tmp/tfserving
docker pull tensorflow/serving
git clone https://github.com/tensorflow/serving
若网速过慢可能会下载失败或是等很久,可在docker设置中添加国内镜像,如下图中的"registry-mirrors",这里我添加的是注册阿里云得到的专属镜像(注册之后马上就收到电话问候了),有需要可用我的:“https://mylo00gg.mirror.aliyuncs.com”
运行样例
安装tf-serving之后可在目录“F:\tmp\tfserving\serving\tensorflow_serving\servables\tensorflow\testdata”看到很多模型案例,运行其中的一个进行测试,在shell中运行
cd F:/tmp/tfserving
# 设置路径名
Set-Variable -Name "TESTDATA" -Value "$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata"
docker run -t --rm -p 8503:8501 -v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two" -e MODEL_NAME=half_plus_two tensorflow/serving
如下图则表示运行成功:
测试tf server
方法1 新建一个test_tf.py文件放置如下代码:
import json
import requests
url = 'http://localhost:8503/v1/models/half_plus_two:predict'
data = {"instances": [1.0, 2.0, 5.0]}
r =requests.post(url,json.dumps(data))
print(r)
print(r.text)
print(r.content)
方法2.
http://192.168.3.4:8501/v1/models/abnormal_img/metadata
方法3:grpc
import cv2
import numpy as np
from grpc.beta import implementations
import tensorflow as tf
def grpc():
from tensorflow_serving.apis import predict_pb2, prediction_service_pb2_grpc
channel = implementations.insecure_channel('localhost', 8501)
stub = prediction_service_pb2_grpc.PredictionServiceStub(channel._channel)
# 模型签名
request = predict_pb2.PredictRequest()
request.model_spec.name = 'abnormal_img'
# request.model_spec.version = 'latest'
request.model_spec.signature_name = ''
# 构造入参
img= cv2.imread("caoyuan.jpeg")
img=cv2.resize(img,(128,128))
img=img.astype(np.float32)
x_data=np.expand_dims(img.transpose(2,0,1),0)
drop_out = 1
sequence_length = [3*288*288]
request.inputs['input'].CopyFrom(tf.make_tensor_proto(x_data, dtype=tf.float32))
request.inputs['sequence_length'].CopyFrom(tf.make_tensor_proto(sequence_length, dtype=tf.int32))
# request.inputs['drop_out'].CopyFrom(tf.make_tensor_proto(drop_out, dtype=tf.float32))
# 返回CRF结果,输出发射概率矩阵和状态转移概率矩阵
result = stub.Predict(request, 10.0) # 10 secs timeout
print(result)
if __name__ == '__main__':
# grpc()
import json
import requests
url = 'http://192.168.3.4:8501/v1/models/abnormal_img:predict'
img = cv2.imread("caoyuan.jpeg")
img = cv2.resize(img, (128, 128))
img = img.astype(np.float32)
x_data = np.expand_dims(img.transpose(2, 0, 1), 0)
data = {"instances": x_data.tolist()}
r = requests.post(url, json.dumps(data))
print(r)
print(r.text)
print(r.content)
另开一个shell运行该文件则可以得到输出:
要测试自己的模型只需要将案例中的模型文件和输入进行替换即可,至此,在自己电脑上体验用docker部署tf-serving模型完成。
更多有关docker的安装和练习可参考如下博客:
Win10中docker的安装与使用
————————————————
版权声明:本文为CSDN博主「Loysun」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Loysun/article/details/108850375
文章来源: blog.csdn.net,作者:AI视觉网奇,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/jacke121/article/details/126843259
- 点赞
- 收藏
- 关注作者
评论(0)