此wiki主要介绍分布式环境使用的一些条件,一直所要注意的内容;
确保在此之前阅读过TensorFlow for distributed
1.集群描述
当前tensorflow 的版本(0.8.0),并没有提供统一的资源管理器,所以若要启动处理节点需要手动完成,并且要每个节点一份完整的集群描述,目的是让该节点能够找到其他的节点
例如:启动Server的命令如下
python ./tensorflow/tools/dist_test/server/grpc_tensorflow_server.py --cluster_spec='ps|10.100.208.23:22222,worker|10.100.208.23:22223;10.100.208.23:22224' --job_name=ps --task_index=0
--cluster_spec:描述集群的所有Server的ip:port,并形成一个dictionary,上边的命令最后形成
"ps":[0.100.208.23:22222]
"worker":[10.100.208.23:22223;10.100.208.23:22224]
--job_name --task_index : 通过这两个参数能够确定,这个当前进程使用dictionary里的哪个ip:port.
NOTE:实际上"ps","worker"并不含有什么实际意义,在启动server时可以自行指定名称,以便后续业务代码识别即可。
2.进行计算:
进行分布式计算可以将某些计算分派给某个Server的某个资源(cpu,gpu)来执行。
例如
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import tensorflow as tf def main() : with tf.device( "/job:ps/task:0/cpu:0" ): a = tf.Variable( 1 ) b = tf.Variable( 1 ) with tf.device( "/job:worker/task:0/gpu:1" ): c = a + b with tf.Session( "grpc://localhost:22223" ,config = tf.ConfigProto(allow_soft_placement = True ,log_device_placement = True )) as sess: result = sess.run(c) print (result) if __name__ = = '__main__' : main() |
其中 两个变量a,b的声明工作在ps进程的cpu0上完成; a+b的操作在worker进程的gpu1上完成
NOTE:若要指定运行的device,必须使用源码编译后的启动方式
bazel-bin/tensorflow/core/distributed_runtime/rpc/grpc_tensorflow_server
NOTE:如果在不同的进程里生命的变量进行运算可能会报错
tensorflow.python.framework.errors.FailedPreconditionError: Attempting to use uninitialized value
需要先初始化变量
sess.run(tf.initialize_all_variables())
具体可参考 https://www.tensorflow.org/versions/r0.8/how_tos/variable_scope/index.html#sharing-variables
NOTE:创建tf.Session时,需要制定到worker地址否则会报错
tensorflow.python.framework.errors.InternalError: Blas SGEMM launch failed
并且导致进程退出