内容同步自个人网站: TensorFlow的op placementce
关于op在device上的placement策略,目前还没有比较好的方法,TensorFlow目前也只是用了比较简单的策略,细节如下:
1,用户明确指定了设备号,就尊重用户的意愿,例如:当代码中有with tf.device(“/job:local/task:0/gpu:0”):或者with tf.device(“/job:local/task:0/cpu:0”):
时,就把对应op放到用户明确指定的设备上去。
2,除了source和sink的其它节点,优先分配设备等级较高的,其中GPU等级高于CPU,因此一般都会被分配到GPU:0。但是有以下三种例外:
2.1,generator节点,也就是0个输入且只有1个输出的节点,这样的节点会被放置到和输出节点相同的设备上。
2.2,元操作节点,例如reshape,该元操作节点放置在被操作的节点上。
2.3,明显需要在CPU上执行的op。
以上就是TensorFlow的placement算法,从以上可以看出,如果想用机器上的多个GPU卡,需要用户明确指出,不然会默认用编号为0的GPU卡。
在第二步中,在处理2.1和2.2两种情况时,用并查集算法找到整个计算图中的连通分量,节点之间的关联关系就是根据2.1和2.2得到的。找到连通分量之后,有两种处理方式,(1)已知连通分量中某个节点放到哪个设备,就将该连通分量中的所有节点都放置到该设备;(2)连通分量中所有节点都没有被指定设备,则选择设备级别最高的设备放置。