一、整体架构

TensorFlow Serving 采用模块化设计,核心组件包括:

  1. Servables:可服务对象(如模型、查找表)
  2. Managers:管理 Servable 生命周期(加载/卸载)
  3. Loaders:负责 Servable 的初始化状态管理
  4. Sources:提供新版本 Servable 的 Loader
  5. Aspired Versions:Servable 的期望状态集合
  6. Core:连接所有组件的核心枢纽
  7. APIs:gRPC/RESTful 接口处理客户端请求
二、请求处理流程
1. 请求接收
  • 入口model_servers/main.cc
  • 服务器创建
    Server::BuildAndStart() // 创建 gRPC/HTTP 服务器
    
  • HTTP 服务器
    • 基于 libevent 实现 (evhttp_server)
    • 注册 RestApiRequestDispatcher 分发器
    • 启动监听:StartAcceptingRequests()
2. 请求分发
Classify
Predict
HTTP请求
RestApiRequestDispatcher
HttpRestApiHandler::ProcessRequest
解析请求类型
classification_service.cc
prediction_service.cc
3. 分类请求处理
TensorflowClassificationServiceImpl::Classify()
├── 获取 SavedModelBundle       // 根据 ModelSpec
├── 调用 classifier.cc::RunClassify()├── 创建 SavedModelTensorFlowClassifier├── PreProcessClassification()   // 前处理├── PerformOneShotTensorComputation() // 推理└── session->Run()            // 执行 TensorFlow 计算图└── PostProcessClassificationResult() // 后处理
三、模型表示

SavedModelBundle 结构:

struct SavedModelBundle {MetaGraphDef meta_graph_def;  // 包含计算图+签名Session* session;             // 执行环境句柄// 其他元数据...
};
  • 签名:定义输入/输出张量映射关系
  • 目录结构
    /model├── saved_model.pb      // MetaGraphDef├── variables/          // 权重数据└── assets/             // 辅助文件
    
四、模型加载机制
1. 初始化阶段
ServerCore::Create()
└── Initialize()├── CreateAspiredVersionsManager()├── new AspiredVersionsManager()└── 启动管理线程 PeriodicFunction
2. 核心加载流程
Source Manager Loader Session 通知新版本可用 创建 LoaderHarness LoadWithMetadata() 返回加载状态 注册可用 Servable Source Manager Loader Session
3. 关键代码路径
// 模型加载入口
BasicManager::ManageServableInternal()
├── harness = harness_creator()  // 创建 LoaderHarness
├── managed_map_.emplace()       // 注册 Servable
└── HandleLoadOrUnloadRequest()  // 触发加载// 实际加载执行
LoaderHarness::Load()
└── loader_->LoadWithMetadata()└── SimpleLoader::LoadWithMetadata()├── 调用 creator_variant_ 函数└── 执行实际模型加载
4. 适配器系统
// 适配器注册机制
REGISTER_STORAGE_PATH_SOURCE_ADAPTER(SavedModelBundleSourceAdapterCreator, SavedModelBundleSourceAdapterConfig)// 适配器创建
StoragePathSourceAdapterRegistry::CreateFromAny()
└── 实例化 SavedModelBundleSourceAdapter
5. 模型加载实现
SavedModelBundleSourceAdapter::Convert()
├── 创建 bundle_factory
├── 获取 servable_creator
└── 初始化 SimpleLoader// 实际加载逻辑
SavedModelBundleFactory::InternalCreateSavedModelBundle()
├── 检测模型类型 (TFLite/TensorFlow)
├── 分支加载:├── TFLite: LoadTfLiteModel()└── TensorFlow: LoadSessionBundleOrSavedModelBundle()
五、线程管理与通知机制
  1. Notification 系统

    • WaitForNotification() 阻塞线程
    • Notify() 解除阻塞
    • 支持"先通知后等待"场景
  2. 多线程协调

    AspiredVersionsManagerTargetImpl::SetAspiredVersions()
    └── EnqueueAspiredVersionsRequest() // 入队请求PeriodicFunction 定期处理:
    ├── HandlePendingAspiredVersionsRequests()
    └── InvokePolicyAndExecuteAction()
    
六、关键设计亮点
  1. 插件化架构

    • 通过注册机制支持多种模型格式
    • 适配器系统解耦加载逻辑
  2. 生命周期管理

    • LoaderHarness 封装状态转换
    • 版本管理支持热更新
  3. 资源隔离

    • 每个 Servable 独立加载/卸载
    • 资源估算防止 OOM
  4. 异步通知

    • Observer 模式监听状态变化
    • 避免轮询开销

完整流程总结:客户端请求 → API 层接收 → 路由至对应服务 → 获取模型实例 → 执行预处理 → 调用 TensorFlow Session → 处理后处理 → 返回结果

Reference

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/912052.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/912052.shtml
英文地址,请注明出处:http://en.pswp.cn/news/912052.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视图、索引介绍

目录 1、视图 1.1、什么是视图 1.2、创建视图 1.3、使用视图 1.4、修改视图 1.5、删除视图 1.6、视图的优点 2、MySQL存储结构 2.1、MySQL中的页 3、索引 3.1、索引的数据结构 3.2、B树 和 B树 3.3、B树在MySQL索引中的应用 3.4、索引分类 1、视图 1.1、什么是视…

QT6(46)5.2 QStringListModel 和 QListView :列表的模型与视图的界面搭建与源代码实现

(154)理论讲解 : 例题程序的界面搭建 : (155)以下开始完善代码 ,先准备要给 model 的源数据,一些字符串 : 给出该头文件,以全面展示其内容: #i…

C++设计模式(GOF-23)——03 C++观察者模式(Observer / Event、发布-订阅模式、事件模式)

文章目录 一、观察者模式概述二、传统代码 vs 观察者模式对比1. 传统实现(紧耦合)2. 观察者模式实现(松耦合) 三、Mermaid 类图说明四、核心设计要点1. 接口分层设计2. 通知机制实现3. 扩展性验证 五、应用场景与注意事项适用场景…

海外 AI 部署:中国出海企业如何选择稳定、安全的云 GPU 基础设施?

2025年,中国 AI 企业在模型训练、产品落地和创新应用上不断刷新人们的认知。DeepSeek-R1、Qwen3 等国产大模型密集亮相,国内大模型产业热潮持续升温。与此同时,一个现实的问题也在被越来越多企业关注:模型虽然训练得起&#xff0c…

AI绘画工具实测:Stable Diffusion本地部署指

对于想要深度体验AI绘画的创作者来说,本地部署Stable Diffusion能带来更自由的创作空间。本文将详细介绍Windows系统下的部署流程,帮助你在个人电脑上搭建专业的AI绘画环境。 硬件准备与基础环境配置 部署前需确认电脑配置:建议NVIDIA显卡&…

macOS - 快速上手使用 YOLO

文章目录 一、关于 yolo二、安装三、命令行使用官方示例yolo cfgyolo predict 四、Python 调用results 数据 一、关于 yolo YOLO(YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的约瑟夫-雷德蒙(Jose…

<script setup> 语法糖

下面&#xff0c;我们来系统的梳理关于 Vue 3 <script setup> 语法糖 的基本知识点&#xff1a; 一、<script setup> 核心概念 1.1 什么是 <script setup>&#xff1f; <script setup> 是 Vue 3 中 Composition API 的编译时语法糖&#xff0c;它通过…

MYSQL-InnoDB逻辑存储结构 详解

InnoDB逻辑存储结构 段—区—页—行 表空间&#xff1a; 默认情况下InnoDB有一个共享表空间ibdata1&#xff0c;所有数据放入这个表空间&#xff0c;如果开启了innodb_file_per_table&#xff08;默认ON&#xff09;&#xff0c;每张表都可以放到一个单独的表空间&#xff0…

[特殊字符] Python 批量合并 Word 表格中重复单元格教程(收货记录案例实战)

在日常办公中&#xff0c;Word 表格中常出现重复的“供应商名称”或“物料编码”&#xff0c;会导致表格冗余且视觉混乱。这时候&#xff0c;用 Python 自动合并重复单元格可以大幅提升表格专业度和可读性。本篇给大家演示如何用 python-docx 实现该功能。 ✅ 功能概览 自动读取…

从零构建Node.js服务托管前端项目

下面是一个完整的指南&#xff0c;教你如何从零开始构建一个Node.js服务来托管前端项目&#xff0c;并代理API请求到其他服务器。 1. 项目初始化 # 创建项目目录 mkdir node-proxy-server cd node-proxy-server# 初始化npm项目 npm init -y# 安装必要依赖 npm install expres…

Lynx vs React Native vs Flutter 全面对比:三大跨端框架实测分析

一文看懂三大热门跨端技术的历史渊源、架构机制、开发体验、包体积对比与性能评估。 我陪你用实测数据带你理性选型&#xff0c;不踩坑&#xff0c;不盲信。 1. 框架简介&#xff1a;它们是谁&#xff1f;来自哪里&#xff1f;干嘛用&#xff1f; 框架名称所属公司发布时间初衷…

CKESC的ROCK 180A-H 无人机电调:100V 高压冗余设计与安全保护解析

一、核心技术参数与性能指标 电压范围&#xff1a;支持 12~26S 锂电&#xff08;适配 110V 高压系统&#xff09;电流特性&#xff1a; 持续工作电流&#xff1a;90A&#xff08;特定散热条件&#xff09;瞬时耐流&#xff08;1 秒&#xff09;&#xff1a;220A&#xff0c;3 …

优化 ArcPy 脚本性能

使用并行处理 如果硬件条件允许&#xff0c;可以使用 Python 的并行处理模块&#xff08;如 multiprocessing&#xff09;来同时处理多个小任务。这样可以充分利用多核处理器的优势&#xff0c;提高脚本的执行效率。 import multiprocessing def process_raster(raster):arcpy…

Windows下CMake通过鸿蒙SDK交叉编译三方库

前言 华为鸿蒙官方的文章CMake构建工程配置HarmonyOS编译工具链 中介绍了在Linux平台下如何使用CMake来配置鸿蒙的交叉编译环境&#xff0c;编译输出在Harmony中使用的第三方so库以及测试demo。 本文主要是在Windows下实现同样的操作。由于平台差异的原因&#xff0c;有些细节…

从C学C++(6)——构造函数和析构函数

从C学C(6)——构造函数和析构函数 若无特殊说明&#xff0c;本博客所执行的C标准均为C11. 构造函数与析构函数 构造函数定义 构造函数是特殊的成员函数&#xff0c;当创建类类型的新对象&#xff0c;系统自动会调用构造函数构造函数是为了保证对象的每个数据成员都被正确初…

清理 Windows C 盘该注意什么

C 盘空间不足会严重影响系统性能。 清理 C 盘文件时&#xff0c;首要原则是安全。错误地删除系统文件会导致 Windows 无法启动。下面我将按照 从最安全、最推荐到需要谨慎操作的顺序&#xff0c;为你详细列出可以清理的文件和文件夹&#xff0c;并提供操作方法。 第一梯队&…

Python Selenium 滚动到特定元素

文章目录 Python Selenium 滚动到特定元素⚙️ **1. 使用 scrollIntoView() 方法&#xff08;最推荐&#xff09;**&#x1f5b1;️ **2. 结合 ActionChains 移动鼠标&#xff08;模拟用户行为&#xff09;**&#x1f9e9; **3. 使用坐标计算滚动&#xff08;精确控制像素&…

你写的 Express 接口 404,可能是被“动态路由”吃掉了

本文首发在我的个人博客&#xff1a;你写的 Express 接口 404&#xff0c;可能是被“动态路由”吃掉了 前情提要 最近参与公司的一个项目前端 React&#xff0c;后端用的 Express。目前我就做一些功能的新增或者修改。 对于 Express &#xff0c;本人没有公司项目实战经验&…

【Java面试】你是怎么控制缓存的更新?

&#x1f504; 一、数据实时同步失效&#xff08;强一致性&#xff09; 原理&#xff1a;数据库变更后立即失效或更新缓存&#xff0c;保证数据强一致。 实现方式&#xff1a; Cache Aside&#xff08;旁路缓存&#xff09;&#xff1a; 读流程&#xff1a;读缓存 → 未命中则…

react-嵌套路由 二级路由

什么是嵌套路由&#xff1f; 在一级路由中又内嵌了其他路由&#xff0c;这种关系就叫做嵌套路由&#xff0c;嵌套至一级路由内的路由又称作二级路由 嵌套路由配置 实现步骤 配置二级路由 children嵌套 import Login from "../page/Login/index"; import Home from …