TensorFlow Serving 是一个适用于机器学习模型的灵活、高性能应用系统,专为生产环境而设计。借助 TensorFlow Serving,可以轻松部署新算法和实验,同时保留相同的服务器架构和 API。TensorFlow Serving 提供与 TensorFlow 模型的开箱即用型集成,但也可以轻松扩展以应用其他类型的模型和数据。
环境准备
Linux 安装 docker 可参考:Ubuntu 安装 Docker 20.10.11-优快云博客
docker 安装
官方手册:TensorFlow Serving with Docker | TFX (google.cn)
Docker 仓库地址:tensorflow/serving - Docker Image | Docker Hub
# 拉取镜像
docker pull tensorflow/serving:2.7.0
# 创建项目文件夹并进入
mkdir tf_serving && cd $_
# 下载演示模型
git clone https://github.com/tensorflow/serving
# 定义演示模型路径
TESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata"
# 启动 TensorFlow service 容器并打开 REST API 端口
docker run -t --rm -p 8501:8501 \
-v "$TESTDATA/saved_model_half_plus_two_cpu:/models/half_plus_two" \
-e MODEL_NAME=half_plus_two \
tensorflow/serving:2.7.0
# half_plus_two , which generates `0.5 * x + 2` for the values of `x` we provide for prediction.
# 使用 predict API 查询模型
curl -d '{"instances": [1.0, 2.0, 5.0]}' \
-X POST http://localhost:8501/v1/models/half_plus_two:predict
# Returns => { "predictions": [2.5, 3.0, 4.5] }
- 端口
- 端口 8500:gRPC
- 端口 8501:REST API
- 环境变量
MODEL_NAME
:模型名,默认值model
MODEL_BASE_PATH
:模型基础路径,默认值/models
当 docker 启动 ModelServer 时,容器内将按如下方式启动:
tensorflow_model_server --port=8500 --rest_api_port=8501 \
--model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME}
部署模型
docker 部署
docker run -p 8500:8500 -p 8501:8501 \
--mount type=bind,source=/path/to/my_model/,target=/models/my_model \
--mount type=bind,source=/path/to/my/models.config,target=/models/models.config \
-t tensorflow/serving --model_config_file=/models/models.config
TensorFlow Serving 支持热更新模型,会自动加载版本号最大的模型。
模型文件夹结构如下:
/models/my_model
├── 1 # 版本号
│ ├── assets/
│ ├── variables/
│ └── saved_model.pb
├── ...
└── N
├── assets/
├── variables/
└── saved_model.pb
导出模型
-
Keras Sequential 模式建立的模型使用
saved.model
导出后可以直接部署。 -
通过继承
tf.keras.Model
类建立的模型,使用 Serving 部署时,对saved.model
文件有更多要求:- 需要导出的方法,要使用
@tf.function
装饰,并指定input_signature
参数,以显式说明输入的形状。 - 导出时,
tf.saved_model.save
需要通过signature
参数提供待导出函数的签名。自定义的模型可能有多个方法需要导出,需要告诉 Serving 每个方法在被客户端调用时的函数名。
- 需要导出的方法,要使用
继承 tf.keras.Model
类建立的模型导出示例: