0%

tensorflow_serving

简介

  • 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++ 库的详细介绍:

  1. 核心功能

    • 加载和管理模型:TensorFlow Serving 能够加载和管理训练好的 TensorFlow 模型,包括 SavedModel 格式。
    • 提供预测服务:一旦模型被加载,TensorFlow Serving 可以为客户端提供实时的预测服务,支持单个或批量请求。
    • 高性能和可扩展性:TensorFlow Serving 在设计上注重性能和可扩展性,能够处理高并发的请求并保持低延迟。
  2. 架构

    • TensorFlow Serving 的架构主要由三个组件组成:Servable、Loader 和 Servable Manager。
    • Servable 是指 TensorFlow 模型的一种抽象,它代表了一个可部署的模型或模型的版本。
    • Loader 负责加载 Servable,并在需要时将其初始化或卸载。
    • Servable Manager 负责管理 Servable 的生命周期,包括加载、卸载和路由请求等。
  3. 部署流程

    • 准备模型:首先需要使用 TensorFlow 训练模型,并将其保存为 SavedModel 格式。
    • 配置 TensorFlow Serving:创建一个模型配置文件,指定模型的路径、输入和输出等信息。
    • 启动 TensorFlow Serving:运行 TensorFlow Serving 服务器,并指定模型配置文件。
    • 发送请求:客户端向 TensorFlow Serving 发送预测请求,服务器返回预测结果。
  4. 使用示例
    下面是一个简单的 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 主要由两个部分组成:

  1. 模型图(GraphDef):模型的计算图以 Protocol Buffers 格式保存在名为 saved_model.pb 的文件中。计算图定义了模型的结构,包括输入、输出、各种操作(如张量运算、变量等)以及操作之间的连接关系。

  2. 变量和资源:模型的权重参数、变量和其他资源以二进制格式保存在名为 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。以下是一个大致的步骤:

  1. 将 ONNX 模型转换为 TensorFlow SavedModel

    • 使用 ONNX-TensorFlow 或 onnx-tf 工具将 ONNX 模型转换为 TensorFlow 的 SavedModel 格式。这些工具可以帮助你将 ONNX 模型导入到 TensorFlow 中,并将其保存为 SavedModel 格式。
  2. 使用 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

从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}
感谢老板支持!敬礼(^^ゞ