一、整体架构
TensorFlow Serving 采用模块化设计,核心组件包括:
- Servables:可服务对象(如模型、查找表)
- Managers:管理 Servable 生命周期(加载/卸载)
- Loaders:负责 Servable 的初始化状态管理
- Sources:提供新版本 Servable 的 Loader
- Aspired Versions:Servable 的期望状态集合
- Core:连接所有组件的核心枢纽
- APIs:gRPC/RESTful 接口处理客户端请求
二、请求处理流程
1. 请求接收
- 入口:
model_servers/main.cc
- 服务器创建:
Server::BuildAndStart() // 创建 gRPC/HTTP 服务器
- HTTP 服务器:
- 基于 libevent 实现 (
evhttp_server
) - 注册
RestApiRequestDispatcher
分发器 - 启动监听:
StartAcceptingRequests()
- 基于 libevent 实现 (
2. 请求分发
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. 核心加载流程
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()
五、线程管理与通知机制
-
Notification 系统:
WaitForNotification()
阻塞线程Notify()
解除阻塞- 支持"先通知后等待"场景
-
多线程协调:
AspiredVersionsManagerTargetImpl::SetAspiredVersions() └── EnqueueAspiredVersionsRequest() // 入队请求PeriodicFunction 定期处理: ├── HandlePendingAspiredVersionsRequests() └── InvokePolicyAndExecuteAction()
六、关键设计亮点
-
插件化架构:
- 通过注册机制支持多种模型格式
- 适配器系统解耦加载逻辑
-
生命周期管理:
- LoaderHarness 封装状态转换
- 版本管理支持热更新
-
资源隔离:
- 每个 Servable 独立加载/卸载
- 资源估算防止 OOM
-
异步通知:
- Observer 模式监听状态变化
- 避免轮询开销
完整流程总结:客户端请求 → API 层接收 → 路由至对应服务 → 获取模型实例 → 执行预处理 → 调用 TensorFlow Session → 处理后处理 → 返回结果
Reference
https://zhuanlan.zhihu.com/p/700830357