此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
並且導致進程退出