tensorflow源码分析 rendezvous抽象和grpc

2018-10-12  本文已影响184人  peteyuan

tensorflow分布式网络通信实现了一个邮箱(rendezvous)抽象。
rendezvous这个单词有很多意思,我觉得反义成邮箱最合适。

做一个类比。

相同点:

不同点:

以上是tensorflow源码中对rendezvous接口的注释。其实简单思考一下我列举的邮箱和rendezvous的不同点,你会发现邮箱机制更高效,更节约人力,因为邮递员是共享的,但正是因为共享邮递员,它没办法保证信件到达的顺序,假设我们每对写信人和收信人都有一个唯一的邮递员,那顺序当然是能保证的。

需要注意,我说的邮箱是指线下的,线上的email其实和rendezvous看起来非常相似,但它不好用来理解rendezvous,所以我没用它来类比。

理解tensorflow的rendezvous抽象需要清楚两点:

grpc异步编程

google虽然一直在推grpc,但声势浩大,却并不用心。网站上所有的大部分例子都是同步编程,只有一个简单的例子 helloasync,在grpc源码目录下还有一个更完整的示例程序 greeter_async_server.cc。具体的用法此处先标为 TODO。但这个例子有个问题,它没有展示

基本上全网都找不到几个例子,可能google本来就不想让我们用异步编程,因为异步程序比同步程序的难度要大很多。

这里是我能找到的几个例子:

要把这几个例子变成真正高性能的异步程序还需要很多尝试,但这里有一点值得注意:

对于每对请求都需要一个tag,而通过protoc命令生成的代码除了其中的request和response类型定义,其他代码都没用,用户需要自己编写每对方法的接口,并且用tag来区分方法。

以上就是grpc异步编程的精髓。

tensorflow grpc源码

回到tensorflow源码。这个时候就可以发现为什么tensorflow源码里会对不停地重复定义protoc里的RPC方法,而这些方法通常又只调用了另外一个方法,导致真正的方法实现藏的很深,因为它是异步的,那堆重复的方法定义实际就是平时我们编写同步代码时,protoc或thrift帮我们生成的那些代码。

而在tensorflow源码里还有两个比较重要的代码需要看一下,就是grpc_master_service.cc和grpc_worker_service.cc里的HandleRPCsLoop方法。

...娃醒了,先写到这...

上一篇下一篇

猜你喜欢

热点阅读