TensorFlow Servering源码解析(2017-8-17)

步骤一:建议先通读TensorFlow Servering官网,对整体概念有大体的认识

步骤二:去TF github下载源码。注意,同时下载tensoflow源码,servering会依赖其中的一部分

步骤三:开始源码解析

目录介绍:

api

对外服务接口部分

batching

不知道在干啥

config

Server的配置参数

core

模型管理核心部分。包括模型发现,加载,本机资源管理

model_servers

模型服务整体框架

resouces

单机资源管理(内存)

servable

具体模型加载服务接口

sources

模型数据源发现模块

utils

线程池 事件队列 工厂注册类 智能指针 等等什么东西

主要类结构介绍:

main启动后,ServerCore单例加载,然后PredictionServiceImpl 启动api目录下对外服务的四个程序接口,查询ServerCore中的结构提供服务。

ServerCore
Options options_;
    ServableStateMonitorCreator(EventBus)
    ServerRequestLoggerUpdater
std::map<string, int> platform_to_router_port_;
std::shared_ptr<EventBus<ServableState>> servable_event_bus_;
std::shared_ptr<ServableStateMonitor> servable_state_monitor_;
UniquePtrWithDeps<AspiredVersionsManager> manager_;
struct StoragePathSourceAndRouter {
    FileSystemStoragePathSource* source;
    DynamicSourceRouter<StoragePath>* router;
    };
optional<StoragePathSourceAndRouter> storage_path_source_and_router_GUARDED_BY(config_mu_);

(实现manager接口)主要作用,读配置,初始化全局/单例的(file source),最主要结构在AspiredVersionsManager中。platform_to_router_port (根据配置,支持哪几种模型格式 save bundle mode/bundle)

AspiredVersionsManager
std::unique_ptr<AspiredVersionPolicy> aspired_version_policy_;
using AspiredVersionsMap =std::map<string,  std::vector<ServableData<std::unique_ptr<Loader>>>>;
AspiredVersionsMap pending_aspired_versions_requests_   GUARDED_BY(pending_aspired_versions_requests_mu_);
std::unique_ptr<PeriodicFunction> manage_state_thread_;
std::unique_ptr<BasicManager> basic_manager_;

(实现manager接口)负责servable加载管理
1. Resource是否足够(完整的接口,没发现配置实现)
2. aspired_version_policy 默认 AvailabilityPreservingPolicy
3. manage_state_thread,定期从队列pending_aspired_versions_requests_中获取Aspired-versions requests,根据aspired_version_policy策略执行加载动作
4. target_impl_ 模型目录变化后,新的version需要加载的回调函数。(放入pending_aspired_versions_requests_请求)

BasicManager
using ManagedMap = std::unordered_multimap<string, std::shared_ptr<LoaderHarness>>;
LoaderHarness::Options harness_options_;
EventBus<ServableState>* servable_event_bus_;
ManagedMap managed_map_ GUARDED_BY(mu_);
ServingMap serving_map_;
Env* const env_;(跨平台)
std::unique_ptr<ResourceTracker> resource_tracker_ GUARDED_BY(mu_);
std::unique_ptr<Executor> load_executor_,unload_executor_

(实现manager接口)
1. 保存每个loader的状态 2. 资源管理 resoure tracker 3. 跨平台 4. Executor 线程池or 单线程

ServingMap
using HandlesMap = std::unordered_multimap<ServableRequest,std::shared_ptr<const LoaderHarness>, HashRequest, EqRequest>;
FastReadDynamicPtr<HandlesMap> handles_map_;

Status GetUntypedServableHandle(const ServableRequest& request, std::unique_ptr<UntypedServableHandle>* untyped_handle);

handles_map_存储servable到session的映射(handle),GetUntypedServableHandle返回这个handle,执行查询

FileSystemStoragePathSource
FileSystemStoragePathSourceConfig config_ GUARDED_BY(mu_);
AspiredVersionsCallback aspired_versions_callback_ GUARDED_BY(mu_);
std::unique_ptr<PeriodicFunction> fs_polling_thread_ GUARDED_BY(mu_);

全局,工厂(根据配置对每个source目录一个实例),发现新目录(最新的or有更新的)后根据开始配置,调用不同的回掉函数,放入AspiredVersionsManager的pending_aspired_versions_requests_,

总结

代码框架及其恶心,不知道为啥需要这么多类,搞这么多层次(扫描目录,如何加载就让我看了一天多才懂。还有一坨工厂什么模版,模版层次多的都让我糊涂了,需要翻来覆去的看才能看懂)。虽然是大google的东西,精细的环节,为啥需要这么设计还没学习到。

Tensorflow中,图的节点被称为Operation(操作)。Operation是Tensorflow的基本执行单元,每个Operation都代表一个计算任务。在Tensorflow中,我们可以定义一个计算图,而计算图中的每个节点都是一个Operation。 Operation通常包含以下内容: 1. Operation的类型(例如,加法、乘法、卷积等)。 2. Operation的输入张量(也称为“输入节点”)。 3. Operation的输出张量(也称为“输出节点”)。 4. Operation的属性(例如,卷积的卷积核大小和数量)。 在Tensorflow中,我们可以使用tf.Operation类来创建Operation。下面是一个简单的例子,演示如何在Tensorflow中创建一个Operation: ``` import tensorflow as tf # 创建一个常量Operation,输出为一个标量值 a = tf.constant(2.0) # 创建另一个常量Operation,输出为一个标量值 b = tf.constant(3.0) # 创建一个加法Operation,输入为a和b,输出为a+b c = tf.add(a, b) # 创建一个Session,并运行c with tf.Session() as sess: print(sess.run(c)) ``` 在上面的例子中,我们创建了两个常量Operation(a和b),并使用tf.add()函数创建了一个加法Operation(c)。最后,我们创建了一个Session,并使用sess.run()函数执行了c。 需要注意的是,Operation只有在Session中运行才会被执行。因此,在创建Operation时,我们只是定义了计算任务,而不是执行它们。 此外,Tensorflow还提供了一些方便的函数来创建各种Operation。例如,tf.matmul()函数可以用来创建矩阵乘法Operation。更多关于Operation的详细信息可以参考Tensorflow的官方文档。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值