当前位置:   article > 正文

将tensorflow模型部署到服务器上_tensflow部署服务端

tensflow部署服务端

基本思路:利用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.先来测试一下官方例子

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

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

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

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

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

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

  1. {
  2.     "predictions": [2.5, 3.0, 3.5
  3.     ]
  4. }

结果分析:

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

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

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

target是存放在docker上的路径

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

4.部署自己模型

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

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

  1. import tensorflow as tf
  2. import numpy as np
  3. x = tf.placeholder(tf.float32, name='input_x')
  4. feed = np.random.rand(100)
  5. y = x + 1
  6. w = tf.Variable(0.)
  7. b = tf.Variable(0.)
  8. y_ = tf.add(tf.multiply(w, x), b)
  9. loss = tf.reduce_mean(tf.square(y-y_))
  10. optimizer = tf.train.GradientDescentOptimizer(0.2)
  11. train = optimizer.minimize(loss)
  12. init = tf.global_variables_initializer()
  13. saver = tf.train.Saver()
  14. with tf.Session() as sess:
  15. sess.run(init)
  16. for i in range(200):
  17. sess.run(train, feed_dict={x: feed})
  18. if i % 5 == 0:
  19. print(i, sess.run([w,b]))
  20. saver.save(sess, './linear/linear.ckpt')
  21. with tf.Session() as sess2:
  22. sess2.run(init)
  23. saver.restore(sess2, './linear/linear.ckpt')
  24. # 将训练好的模型保存在modelName下,版本为1,当然你的版本可以随便写
  25. builder = tf.saved_model.builder.SavedModelBuilder("./modelName/1")
  26. inputs = {
  27. # 注意,这里是你预测模型的时候需要传的参数,调用模型的时候,传参必须和这里一致
  28. # 这里的input_x就是模型里面定义的输入placeholder
  29. "input_x": tf.saved_model.utils.build_tensor_info(x)
  30. }
  31. outputs = {
  32. "output_y": tf.saved_model.utils.build_tensor_info(y),
  33. }
  34. prediction_signature = tf.saved_model.signature_def_utils.build_signature_def(
  35. inputs=inputs,
  36. outputs=outputs,
  37. method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME
  38. )
  39. builder.add_meta_graph_and_variables(
  40. sess2,
  41. [tf.saved_model.tag_constants.SERVING],
  42. {tf.saved_model.signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY: prediction_signature}
  43. )
  44. builder.save()

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

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

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

  1. import requests
  2. import numpy as np
  3. import json
  4. # json格式序列调整
  5. class NumpyEncoder(json.JSONEncoder):
  6. def default(self, obj):
  7. if isinstance(obj, np.ndarray):
  8. return obj.tolist()
  9. return json.JSONEncoder.default(self, obj)
  10. feature=np.array(range(128))
  11. param = {
  12. "instances":[
  13. #每一个大括号是一次请求,里面是每次请求的参数
  14. {
  15. "in":feature
  16. }
  17. ]
  18. }
  19. param = json.dumps(param, cls=NumpyEncoder)
  20. res = requests.post("http://localhost:8502/v1/models/face2:predict", data=param)
  21. # 根据自己设定的返回数据读取
  22. # softmax = json.loads(res2.text)["predictions"][0]

至此,大功告成。 

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

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/202081
推荐阅读
相关标签
  

闽ICP备14008679号