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

目录

安装Docker for Windows

安装 tensorflow-serving-api

tensorflow serving on docker

测试tf server

方法3:grpc 


安装Docker for Windows

  1. 前提: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)。】
    点击查看详情页
  2. 打开Hyper-V服务:手动配置还是挺麻烦,可以通过Docker for Windows安装程序来启用Hyper-V,然后计算机会自动重启
  3. 等待docker小鲸鱼图标停止“喷水”——docker is starting或者docker is switching,成功后会是这样:
  4. 启动docker:建议使用powershell启动;
    • win+R,输入powershell
    • 运行一下命令验证安装:docker –version、docker-compose –version、docker-machine –version、docker version
       
    • 关闭自动更新与开机自启:小图标右键:settings
    • Win10 基于Docker使用tensorflow serving部署模型_第1张图片
    • 查看更详细的初步教程
    • 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
    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

你可能感兴趣的:(onnx,docker,容器,运维)