tensorflow分布式网络通信实现了一个邮箱(rendezvous)抽象。
rendezvous这个单词有很多意思,我觉得反义成邮箱最合适。
做一个类比。
相同点:
- 邮箱里发送的是信件。rendezvous发送的是tensor。
- 没封信都有写信人和收信人。rendezvous的每个tensor都producer和consumer。
- 现实世界有很多信件在传递,每封信都队里对应单独的写信人和收信人。rendezvous的每个producer核consumer都对应一个channel,很多个channel就组成rendezvous的table。
- 写信人随时写信,直接发送。rendezvous的producer从不阻塞。
- 收信人可以自己没事去楼下的邮箱检查,也可以叫邮递员直接把信送到家里。rendezvous的consumer既可以阻塞调用(recv方法),也可以设置一个回调。
不同点:
- 不管什么情况只要Tensor一到,rendezvous的consumer就可以立即获取到。相当于收信人如果去楼下检查的话,需要一直等在邮箱旁边。多了一步工作。
- rendezvous的每个channel都有名字,不共享。邮递员是共享的,多个写信人和收信人共享某个邮递员。
- rendezvous的consumer接收到的tensor顺序和producer发送tensor顺序是一致的。但平时我们可能收信的顺序会被打乱。
以上是tensorflow源码中对rendezvous接口的注释。其实简单思考一下我列举的邮箱和rendezvous的不同点,你会发现邮箱机制更高效,更节约人力,因为邮递员是共享的,但正是因为共享邮递员,它没办法保证信件到达的顺序,假设我们每对写信人和收信人都有一个唯一的邮递员,那顺序当然是能保证的。
需要注意,我说的邮箱是指线下的,线上的email其实和rendezvous看起来非常相似,但它不好用来理解rendezvous,所以我没用它来类比。
理解tensorflow的rendezvous抽象需要清楚两点:
- rendezvous是一个抽象,是对网络RPC通信的发送和接收这两个操作所做的高层抽象,具体怎么实现可以有很多种方式。比如,很简单地思考一下,生产者如何让send方法不阻塞,要么底层通信框架支持;要么你有一个队列,send方法只是把tensor放入一个发送队列,另外有单独的线程和consumer端的接收线程进行通信,同样consumer端的recv方法也不是直接去拿数据,而且等待接收线程把tensor放入一个接收队列,然后从接收队列中去取。所以,从更一般的意义上来说,这其实就是消息队列。
- rendezvous可以有很多种实现,比如以上提到的消息队列模型,但tensorflow采用的是grpc异步编程来实现。
grpc异步编程
google虽然一直在推grpc,但声势浩大,却并不用心。网站上所有的大部分例子都是同步编程,只有一个简单的例子 helloasync,在grpc源码目录下还有一个更完整的示例程序 greeter_async_server.cc。具体的用法此处先标为 TODO。但这个例子有个问题,它没有展示
- 一个service中有多个method的时候该怎么写
基本上全网都找不到几个例子,可能google本来就不想让我们用异步编程,因为异步程序比同步程序的难度要大很多。
这里是我能找到的几个例子:
- gRPC multiple services in cpp async server
- gRPC multiple services in cpp async server
- How to implement general Async Server/Client RPC
要把这几个例子变成真正高性能的异步程序还需要很多尝试,但这里有一点值得注意:
- 区分多个method或者说service主要靠一个东西,tag
对于每对请求都需要一个tag,而通过protoc命令生成的代码除了其中的request和response类型定义,其他代码都没用,用户需要自己编写每对方法的接口,并且用tag来区分方法。
以上就是grpc异步编程的精髓。
tensorflow grpc源码
回到tensorflow源码。这个时候就可以发现为什么tensorflow源码里会对不停地重复定义protoc里的RPC方法,而这些方法通常又只调用了另外一个方法,导致真正的方法实现藏的很深,因为它是异步的,那堆重复的方法定义实际就是平时我们编写同步代码时,protoc或thrift帮我们生成的那些代码。
而在tensorflow源码里还有两个比较重要的代码需要看一下,就是grpc_master_service.cc和grpc_worker_service.cc里的HandleRPCsLoop方法。
...娃醒了,先写到这...
网友评论