TensorFlow Serving学习笔记2: 模型服务

本文深入剖析 TensorFlow Serving 的核心架构与实现机制,结合源码分析揭示其如何实现高可用、动态更新的生产级模型服务。

一、TensorFlow Serving 核心架构

1.1 分层架构设计

TensorFlow Serving 采用模块化分层设计,各组件职责分明:

组件 职责 源码位置
Servables 可服务对象(如模型),基础服务单元 core/servable.h
Loaders 管理模型加载/卸载生命周期 core/loader.h
Managers 管理 Servable 集合,路由请求到正确版本 core/manager.h
Sources 提供 Loader,通知 Manager 新版本可用 core/source.h
ServerCore 中枢系统,协调各组件工作 model_servers/server_core.h
1.2 请求处理全流程

Client REST/gRPC PredictionService ServerCore Session HTTP/gRPC请求 路由请求 获取模型 执行session.run() 返回预测结果 封装响应 返回预测数据 Client REST/gRPC PredictionService ServerCore Session

二、核心机制深度解析

2.1 动态模型加载机制

核心流程
加载 检测新模型 创建Loader 构建LoaderHarness 状态机管理 kReady 提供服务

LoaderHarness 状态机

cpp 复制代码
enum class State {
    kNew,        // 新建状态
    kLoading,     // 加载中
    kReady,       // 就绪状态
    kQuiescing,   // 静默中
    kUnloading,   // 卸载中
    kError        // 错误状态
};

关键设计

  1. 线程安全状态转换
cpp 复制代码
Status LoaderHarness::Load() {
  mutex_lock l(mu_); // 状态锁
  TransitionState(State::kLoading);
  // ...执行加载
}
  1. 自动资源回收
cpp 复制代码
LoaderHarness::~LoaderHarness() {
  if (state_ == State::kReady) Unload();
}
2.2 ServerCore 启动流程

BuildAndStart() 函数核心逻辑:

cpp 复制代码
Status Server::BuildAndStart(const Options& opts) {
  // 1. 配置验证
  if (opts.grpc_port == 0) return errors::InvalidArgument("端口未设置");

  // 2. 构建ServerCore配置
  ServerCore::Options options;

  // 3. 模型配置加载
  if (opts.model_config_file.empty()) {
    options.model_server_config = BuildSingleModelConfig(...);
  } else {
    TF_RETURN_IF_ERROR(ParseProtoTextFile(...));
  }

  // 4. 资源配置
  session_bundle_config.mutable_session_config()
      ->mutable_gpu_options()
      ->set_per_process_gpu_memory_fraction(0.8); // GPU内存限制

  // 5. 创建ServerCore核心
  TF_RETURN_IF_ERROR(ServerCore::Create(std::move(options), &server_core_));

  // 6. 启动gRPC服务
  ::grpc::ServerBuilder builder;
  builder.AddListeningPort(..., BuildServerCredentials(...));
  grpc_server_ = builder.BuildAndStart();

  // 7. 启动HTTP服务
  if (opts.http_port != 0) {
    http_server_ = CreateAndStartHttpServer(...);
  }

  return Status::OK();
}

三、关键设计亮点

3.1 动态更新机制

配置文件变更 PeriodicFunction轮询 触发ReloadConfig 增量加载新模型 流量无缝切换

实现代码

cpp 复制代码
fs_config_polling_thread_.reset(new PeriodicFunction(
    [this, config_file] {
        this->PollFilesystemAndReloadConfig(config_file);
    },
    poll_interval * 1000000  // 微秒单位
));
3.2 资源隔离设计

GPU内存隔离

cpp 复制代码
// 限制单模型GPU内存使用
session_bundle_config.mutable_session_config()
    ->mutable_gpu_options()
    ->set_per_process_gpu_memory_fraction(0.6);

并行计算优化

cpp 复制代码
// 智能并行配置
if (intra_op > 0 || inter_op > 0) {
    // 分别设置算子内/间并行度
    session_config->set_intra_op_parallelism_threads(intra_op);
    session_config->set_inter_op_parallelism_threads(inter_op);
} else {
    // 统一并行设置
    session_config->set_intra_op_parallelism_threads(session_parallel);
    session_config->set_inter_op_parallelism_threads(session_parallel);
}

四、生产级特性实现

4.1 服务高可用设计
机制 实现方式 效果
模型预热 enable_model_warmup 参数 避免冷启动延迟
失败重试 max_num_load_retries 配置 提升模型加载成功率
版本回滚 AvailabilityPreservingPolicy 策略 自动回退问题版本
4.2 安全通信保障

SSL/TLS 加密配置

cpp 复制代码
::grpc::SslServerCredentialsOptions ssl_ops(
    GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY);
ssl_ops.pem_root_certs = custom_ca;  // 自定义CA

五、核心参数大全

参数名 类型 默认值 作用
grpc_port int gRPC服务端口(必须设置)
model_base_path string 单模型基路径
per_process_gpu_memory_fraction float 1.0 GPU内存分配比例
tensorflow_intra_op_parallelism int 0 算子内并行线程数
fs_model_config_poll_wait_seconds int 0 配置轮询间隔(秒)
enable_model_warmup bool false 启用模型预热减少延迟

Reference

TensorFlow 入门实操 源代码 tensorflow serving源码分析_mob6454cc6bf0b7的技术博客_51CTO博客

TensorFlow Serving源码解读_tensorflow serving 代码解析-CSDN博客

tensorflow-serving源码阅读1_tensorflow源码阅读-CSDN博客

tensorflow serving 源码 tensorflow源码阅读_柳随风的技术博客_51CTO博客

https://zhuanlan.zhihu.com/p/700830357

相关推荐
老虎062723 分钟前
JavaWeb(苍穹外卖)--学习笔记13(微信小程序开发,缓存菜品,Spring Cache)
笔记·学习·微信小程序
@蓝莓果粒茶2 小时前
LeetCode第350题_两个数组的交集II
c++·python·学习·算法·leetcode·职场和发展·c#
无名工程师2 小时前
AI 学习过程中各阶段的学习重点、时间规划以及不同方向的选择与建议等内容
人工智能·学习
试着2 小时前
零基础学习性能测试第五章:JVM性能分析与调优-垃圾回收器的分类与回收
jvm·学习·零基础·性能测试·垃圾回收器
livemetee2 小时前
Flink2.0学习笔记:Stream API 常用转换算子
大数据·学习·flink
WXX_s2 小时前
【OpenCV篇】OpenCV——03day.图像预处理(2)
人工智能·python·opencv·学习·计算机视觉
艾莉丝努力练剑3 小时前
【LeetCode&数据结构】二叉树的应用(二)——二叉树的前序遍历问题、二叉树的中序遍历问题、二叉树的后序遍历问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
花月mmc3 小时前
CanMV-K230 AI学习笔记系列
人工智能·笔记·学习
fengye2071614 小时前
板凳-------Mysql cookbook学习 (十二--------6)
学习·mysql·adb
喜欢吃燃面4 小时前
C++:list(1)list的使用
开发语言·c++·学习