TensorFlow Serving学习笔记3: 组件调用关系

发布于:2025-06-29 ⋅ 阅读:(21) ⋅ 点赞:(0)
一、整体架构

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


网站公告

今日签到

点亮在社区的每一天
去签到