花了半天的时间调通了在Win11 系统下,如何利用docker + tensorflow serving 实现模型部署。记录一下。
1. 安装docker
桌面版网址:Docker Desktop - Docker
安装过程中可能会出现一些问题,我这里参考了 Docker 简介和安装 - Docker 快速入门
2. 利用Docker 安装 tensorflow serving
docker pull tensorflow/serving
3. 这里是准备模型有两种方法
先说第一种方法
(1)直接官网拉取 tensorflow serving 给的例子 ,代码如下
mkdir -p \tmp\tfserving
cd /tmp/tfserving
git clone https://github.com/tensorflow/serving
第一行 这里建立一个 tem的文件 下面的子文件夹是 tfserving , 注意这里我用的windows 系统 ,所以是斜杠 \ 。
第二行 找到建立的文件路径
第三行 下载官方的 tensorflow/serving 注意这里面如果没有 git 工具 可以自己下载一个 并且设置好环境变量 网上资料很多 我这里就不写了
(2)
docker run -p 8501:8501 --mount type=bind,source=C:/tmp/tfserving/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 '&'
这步输入后得到了
这时候再打开一个cmd 命令窗口,输入 下面的代码
(3)
curl -XPOST http://localhost:8501/v1/models/half_plus_two:predict -d "{\"instances\":[1.0, 2.0, 5.0]}"
结果为 :
这是官方的方法。
第二种 自己建立了一个模型 。
(1)自己训练一个简单的模型
import pathlib
import tensorflow as tf
from tensorflow import keras
import numpy as np
import matplotlib.pyplot as plt
xn = np.array([-1, 0, 1, 2, 3, 4, 5, 6])
yn = np.array([-3, -1, 1, 3, 5, 7, 9, 11])
# single neuron
models = tf.keras.models.Sequential([tf.keras.layers.Dense(units=1, input_shape=[1])])
models.compile(optimizer='sgd', loss='mean_squared_error')
models.fit(xn, yn, epochs=500)
export_dir = 'DL_Model_Save'
tf.saved_model.save(models, export_dir) # 存放了一个原始训练的 DL 模型
这时候DL_Model_Save 文件下面是这样的
但是这里面没有版本信息, 所以需要改一下 在 DL_Model_Save 文件下面 建立一个文件下 叫做
我 assets variables saved_model.pb 放到0001文件夹下面
这里面之所以这样做是因为一定要一个类似版本信息,否则会报错 :
Did you forget to name your leaf directory as a number (eg. '/1/')?
(2) 剩下的基本和方法1 一样但是需要改一些路径
docker run -p 8501:8501 --mount type=bind,source=C:/tmp/tfserving/serving/tensorflow_serving/servables/tensorflow/testdata/DL_Model_Save,target=/models/DL_Model_Save -e MODEL_NAME=DL_Model_Save -t tensorflow/serving '&'
红色地方是与上面第一种方法不同的地方,可以看到就是改了一些路径。
(3)再打开一个cmd 文件 输入
curl -XPOST http://localhost:8501/v1/models/DL_Model_Save:predict -d "{\"instances\":[[1],[2]]}"
注意这里面json 数据的格式稍微有点不同 因为是训练模型时候不太一样。
最终得到结果 :