简介
- tensorflow serving库相关笔记
TensorFlow Serving是什么
- TensorFlow Serving 是一个适用于机器学习模型的灵活、高性能应用系统,专为生产环境而设计。借助 TensorFlow Serving,您可以轻松部署新算法和实验,同时保留相同的服务器架构和 API。TensorFlow Serving 提供与 TensorFlow 模型的开箱即用型集成,但也可以轻松扩展以应用其他类型的模型和数据。
C++ tensorflow serving库 详解
TensorFlow Serving 是一个用于部署机器学习模型的开源库,它提供了一个高性能、灵活的方式来将训练好的 TensorFlow 模型部署到生产环境中,以便进行实时预测。虽然 TensorFlow Serving 主要是用 C++ 实现的,但它也提供了 Python API 以方便用户使用。
下面是对 TensorFlow Serving C++ 库的详细介绍:
- 核心功能:
- 加载和管理模型:TensorFlow Serving 能够加载和管理训练好的 TensorFlow 模型,包括 SavedModel 格式。
- 提供预测服务:一旦模型被加载,TensorFlow Serving 可以为客户端提供实时的预测服务,支持单个或批量请求。
- 高性能和可扩展性:TensorFlow Serving 在设计上注重性能和可扩展性,能够处理高并发的请求并保持低延迟。
- 架构:
- TensorFlow Serving 的架构主要由三个组件组成:Servable、Loader 和 Servable Manager。
- Servable 是指 TensorFlow 模型的一种抽象,它代表了一个可部署的模型或模型的版本。
- Loader 负责加载 Servable,并在需要时将其初始化或卸载。
- Servable Manager 负责管理 Servable 的生命周期,包括加载、卸载和路由请求等。
- 部署流程:
- 准备模型:首先需要使用 TensorFlow 训练模型,并将其保存为 SavedModel 格式。
- 配置 TensorFlow Serving:创建一个模型配置文件,指定模型的路径、输入和输出等信息。
- 启动 TensorFlow Serving:运行 TensorFlow Serving 服务器,并指定模型配置文件。
- 发送请求:客户端向 TensorFlow Serving 发送预测请求,服务器返回预测结果。
-
使用示例: 下面是一个简单的 TensorFlow Serving C++ 应用示例,假设我们已经有一个名为
my_model
的 SavedModel:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
#include <iostream> #include <grpcpp/grpcpp.h> #include "tensorflow_serving/apis/prediction_service.grpc.pb.h" using grpc::Channel; using grpc::ClientContext; using grpc::Status; using tensorflow::serving::PredictRequest; using tensorflow::serving::PredictResponse; using tensorflow::serving::PredictionService; class TensorFlowServingClient { public: TensorFlowServingClient(std::shared_ptr<Channel> channel) : stub_(PredictionService::NewStub(channel)) {} // 发送预测请求 void Predict() { PredictRequest request; PredictResponse response; ClientContext context; // 设置输入数据 // request.mutable_model_spec()->set_name("my_model"); // 添加输入数据 // request.mutable_inputs()->...; // 发送预测请求 Status status = stub_->Predict(&context, request, &response); // 处理预测结果 if (status.ok()) { // 处理 response 中的输出结果 } else { std::cerr << "RPC failed: " << status.error_message() << std::endl; } } private: std::unique_ptr<PredictionService::Stub> stub_; }; int main() { // 创建 TensorFlow Serving 客户端 TensorFlowServingClient client(grpc::CreateChannel("localhost:8500", grpc::InsecureChannelCredentials())); // 发送预测请求 client.Predict(); return 0; }
该示例演示了如何创建一个 TensorFlow Serving 客户端,并发送预测请求。需要注意的是,你需要根据实际情况修改模型的名称、输入数据等信息。
总的来说,TensorFlow Serving 提供了一个功能强大的 C++ 库,用于部署 TensorFlow 模型并提供实时预测服务。通过了解其核心功能、架构和部署流程,你可以更好地使用 TensorFlow Serving 来满足你的部署需求。
SavedModel格式是什么
SavedModel 是 TensorFlow 中用于保存和加载模型的标准格式。它是一种可移植、可恢复的模型表示形式,可以轻松地在不同的平台上进行部署和共享。SavedModel 以文件夹的形式存储,其中包含了模型的结构、权重参数、计算图以及其他相关的元数据。
SavedModel 主要由两个部分组成:
-
模型图(GraphDef):模型的计算图以 Protocol Buffers 格式保存在名为
saved_model.pb
的文件中。计算图定义了模型的结构,包括输入、输出、各种操作(如张量运算、变量等)以及操作之间的连接关系。 -
变量和资源:模型的权重参数、变量和其他资源以二进制格式保存在名为
variables/
的文件夹中。这些文件包含了模型的具体参数值,用于在加载模型时恢复模型的状态。
除了这两个基本部分之外,SavedModel 还可以包含其他的元数据信息,例如模型的签名信息(用于描述模型的输入和输出)、运行配置、版本信息等。
SavedModel 的优点在于它具有跨平台和版本控制的能力,可以在不同的 TensorFlow 版本和不同的硬件平台上进行部署和加载。这使得 SavedModel 成为了 TensorFlow 模型部署和共享的标准格式,被广泛应用于生产环境中。
C++ tensorflow serving加载onnx模型
TensorFlow Serving 最初设计用于加载和提供 TensorFlow 模型的预测服务,但它也支持加载其他格式的模型,包括 ONNX(Open Neural Network Exchange)格式的模型。ONNX 是一种开放的标准,用于表示深度学习模型,它允许用户在不同的深度学习框架之间交换模型,并在不同的硬件平台上运行这些模型。
要在 TensorFlow Serving 中加载 ONNX 模型,你需要先将 ONNX 模型转换为 TensorFlow 的 SavedModel 格式,然后再使用 TensorFlow Serving 加载 SavedModel。以下是一个大致的步骤:
- 将 ONNX 模型转换为 TensorFlow SavedModel:
- 使用 ONNX-TensorFlow 或 onnx-tf 工具将 ONNX 模型转换为 TensorFlow 的 SavedModel 格式。这些工具可以帮助你将 ONNX 模型导入到 TensorFlow 中,并将其保存为 SavedModel 格式。
- 使用 TensorFlow Serving 加载 SavedModel:
- 使用 TensorFlow Serving 的配置文件(通常是 TensorFlow Serving 的 Docker 镜像中的配置文件),将转换后的 SavedModel 添加到配置中。
- 启动 TensorFlow Serving 服务器,并指定模型配置文件。
下面是一个大致的示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 将 ONNX 模型转换为 TensorFlow SavedModel
onnx-tf convert -i model.onnx -o saved_model/
# 2. 配置 TensorFlow Serving
# 创建一个模型配置文件,例如 model_config.json,指定模型的路径和类型
{
"model_version_policy": { "specific": { "versions": { "1": {} } } },
"model_platform": "tensorflow",
"name": "onnx_model",
"base_path": "/path/to/saved_model"
}
# 3. 启动 TensorFlow Serving
docker run -p 8500:8500 -p 8501:8501 --mount type=bind,source=/path/to/model_config.json,target=/models/onnx_model/config.json -t tensorflow/serving
这里的关键步骤是将 ONNX 模型转换为 TensorFlow 的 SavedModel 格式,并通过 TensorFlow Serving 的配置文件将 SavedModel 添加到 TensorFlow Serving 中。这样就可以在 TensorFlow Serving 中加载和提供 ONNX 模型的预测服务了。
docker方式部署(官方示例)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# Download the TensorFlow Serving Docker image and repo
docker pull tensorflow/serving
git clone https://github.com/tensorflow/serving
# Location of demo models
TESTDATA="$(pwd)/serving/tensorflow_serving/servables/tensorflow/testdata"
# Start TensorFlow Serving container and open the REST API port
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 &
# Query the model using the 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] }
拉取serving docker image
- 运行命令
- docker pull tensorflow/serving
- tensorflow serving docker历史镜像
- 地址: https://hub.docker.com/r/tensorflow/serving/tags/
从serving docker image 启动一个容器
- serving images有以下属性
- 8500 端口服务于gRPC
- 8501 端口服务于 REST API
- 可选的环境变量 MODEL_NAME(默认为 model)
- 可选的环境变量 MODEL_BASE_PATH(默认为 /models)
- 当 serving image运行一个容器时,其内部实际运行的命令是
1 2
tensorflow_model_server --port=8500 --rest_api_port=8501 \ --model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME}