こんなサンプルTake a REST with HTTP/2, Protobufs, and Swaggerも見つけた。
そしたら、Distributed TensorFlowでは、GRPCが使われているということに。
TensorFlowおよびDistributed TensorFlowについては、
何といっても中の人が解説しているDistributed TensorFlowの話が詳しいですね。
TensorFlowおよびDistributed TensorFlowについては、
何といっても中の人が解説しているDistributed TensorFlowの話が詳しいですね。
ソースコードを眺めていたのですが、全体像が分からなくて困りましたが、(qiita-image-store.s3.amazonaws.com/0/38290/36d49fff-e82a-0320-8a9a-8cf67fd377f6.png)の図を見て、あー。
そんな感じなのかと。
(この図のURLからQiitaはAmazon AWSで動いている?)
そんな感じなのかと。
(この図のURLからQiitaはAmazon AWSで動いている?)
左の図にあるように、
クライアントがマスターに対して、セッションを投げるのですね。
マスターはワーカーを起動する。
そのワーカーの中で複数のGPUを利用するというもの。
右の図では、ワーカーが複数有り、
各ワーカーが複数のGPUを利用する分散システム。
クライアントがマスターに対して、セッションを投げるのですね。
マスターはワーカーを起動する。
そのワーカーの中で複数のGPUを利用するというもの。
右の図では、ワーカーが複数有り、
各ワーカーが複数のGPUを利用する分散システム。
で、Distributed TensorFlowのソースコードのprotobufの部分を覗いてみたら、
この中のtensorflow_server.protoがTensorFlowクラスタとクラスタ内のサーバーで使うプロトコルのようですね。
この中のtensorflow_server.protoがTensorFlowクラスタとクラスタ内のサーバーで使うプロトコルのようですね。
引用
// EXAMPLES
// --------
//
// 1. A single-process cluster, containing "/job:local/task:0".
//
// Cluster:
// job { name: 'local' tasks { key: 0 value: 'localhost:2222' } }
//
// Server:
// cluster { $CLUSTER } job_name: 'local' task_index: 0
//
// 2. A two-process cluster, containing "/job:local/task:{0,1}".
//
// Cluster:
// job { name: 'local' tasks { key: 0 value: 'localhost:2222' }
// tasks { key: 1 value: 'localhost:2223' } }
//
// Servers:
// cluster { $CLUSTER } job_name: 'local' task_index: 0
// cluster { $CLUSTER } job_name: 'local' task_index: 1
//
// 3. A two-job cluster, containing "/job:worker/task:{0,1,2}" and
// "/job:ps/task:{0,1}".
//
// Cluster:
// job { name: 'worker' tasks { key: 0 value: 'worker1:2222' }
// tasks { key: 1 value: 'worker2:2222' }
// tasks { key: 2 value: 'worker3:2222' } }
// job { name: 'ps' tasks { key: 0 value: 'ps0:2222' }
// tasks { key: 1 value: 'ps1:2222' } }
//
// Servers:
// cluster { $CLUSTER } job_name: 'worker' task_index: 0
// cluster { $CLUSTER } job_name: 'worker' task_index: 1
// cluster { $CLUSTER } job_name: 'worker' task_index: 2
// cluster { $CLUSTER } job_name: 'ps' task_index: 0
// cluster { $CLUSTER } job_name: 'ps' task_index: 1
これを見ると、local, worker, psの3つがある模様。
ここに説明があった
ここに説明があった
引用 Job A job comprises a list of "tasks", which typically serve a common purpose. For example, a job named `ps` (for "parameter server") typically hosts nodes that store and update variables; while a job named `worker` typically hosts stateless nodes that perform compute-intensive tasks. The tasks in a job typically run on different machines.
Distributed TensorFlowを試してみるも参考になりました。
今日は、もう少し深く探っていきます。
Session managementにセッションのコンフィグレーション・オプションには、ConfigProtoを使っていると。
引用 sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))のように、ConfigProtoの引数log_device_placement=Trueとすると、ログが有効になる。
Worker Serviceでは、ローカルデバイスでTensorFlowを実行するときのサービスの定義。
Master Serviceはdistributed TensorFlowを実行するときのサービスの定義。
Master Serviceはdistributed TensorFlowを実行するときのサービスの定義。
Using GPUsによると、GPUが付いていると優先的にGPUを使う。
明示的にCPUを使いたいときは、
明示的にCPUを使いたいときは、
引用
# Creates a graph.
with tf.device('/cpu:0'):
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
のように、deviceで指定する。core/distributed_runtime/rpc/grpc_tensorflow_server.cc
=> NewServer (core/distributed_runtime/rpc/grpc_server_lib.cc)
=> TensorFlowrServer (core/distributed_runtime/rpc/grpc_server_lib.cc)
=> ->Start
=> NewGrpcMasterService関数 (rpc/grpc_master_service.cc)
=> GrpcMasterServiceクラス (rpc/grpc_master_service.cc)
=> 別スレッドで、->HandleRPCsLoop関数 (rpc/grpc_master_service.cc)
=> (core/protobuf/master.proto)
ENQUEUE_REQUEST(CreateSession); => CreateSessionHandler
ENQUEUE_REQUEST(ExtendSession); => ExtendSession
for (int i = 0; i < 100; ++i) {
ENQUEUE_REQUEST(RunStep); => RunStepSession
}
ENQUEUE_REQUEST(CloseSession); => CloseSession
ENQUEUE_REQUEST(ListDevices); => ListDevicesSession
ENQUEUE_REQUEST(Reset); => ResetSession
=> NewGrpcWorkerService関数 (rpc/grpc_worker_service.cc)
=> GrpcWorkerServiceクラス (rpc/grpc_worker_service.cc)
=> 別スレッドで、->HandleRPCsLoop関数 (rpc/grpc_master_service.cc)
=> (core/protobuf/worker.proto)
ENQUEUE_REQUEST(GetStatus); => GetStatusHandler
ENQUEUE_REQUEST(CleanupAll); => CleanupAllHandler
ENQUEUE_REQUEST(RegisterGraph); => RegisterHandler
ENQUEUE_REQUEST(DeregisterGraph); => DeregisterGraphHandler
ENQUEUE_REQUEST(RecvTensor); => RecvTensorHandler
ENQUEUE_REQUEST(RunGraph); => RunGraphHandler
=> GraphMgr::ExecuteAsync (core/distributed_runtime/graph_mgr.cc)
=> RunASync (core/common_runtime/executor.c)
ENQUEUE_REQUEST(CleanupGraph); => CleanupGraghHandler
ENQUEUE_REQUEST(Logging); => LoggingHandler
ENQUEUE_REQUEST(Tracing); => TracingHandler