简介
- 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
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 | # 1. 将 ONNX 模型转换为 TensorFlow SavedModel |
这里的关键步骤是将 ONNX 模型转换为 TensorFlow 的 SavedModel 格式,并通过 TensorFlow Serving 的配置文件将 SavedModel 添加到 TensorFlow Serving 中。这样就可以在 TensorFlow Serving 中加载和提供 ONNX 模型的预测服务了。
docker方式部署(官方示例)
1 | # Download the TensorFlow Serving Docker image and repo |
拉取serving docker image
运行命令
- docker pull tensorflow/serving
tensorflow serving docker历史镜像
从serving docker image 启动一个容器
- serving images有以下属性
- 8500 端口服务于gRPC
- 8501 端口服务于 REST API
- 可选的环境变量 MODEL_NAME(默认为 model)
- 可选的环境变量 MODEL_BASE_PATH(默认为 /models)
- 当 serving image运行一个容器时,其内部实际运行的命令是
1
2tensorflow_model_server --port=8500 --rest_api_port=8501 \
--model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME}