问题描述
我们正在将Server和Client设置在不同的物理计算机上的联合方案。
以上内容是从Kubernetes tutorial借来的。 我们相信这会创建一个“本地执行器” [Ref 1],有助于创建gRPC服务器[Ref 2]。
参考文献1:
参考2:
接下来,在客户端1上,我们调用了连接到gRPC服务器的tff.framework.RemoteExecutor。
基于上述内容,我们的理解是远程执行器在连接到gRPC服务器的客户端上运行。
假设以上内容正确,我们该如何发送
tff.tf_computation
从服务器到客户端,然后在客户端打印输出,以确保整个设置工作正常。
解决方法
您的理解绝对正确。
如果直接构造一个ExecutorFactory
(如上面的代码中的情况),则将其传递给tff.framework.set_default_context
将安装您的远程堆栈,作为在TFF运行时中执行计算的默认机制。另外,如果需要,您还应该能够将适当的通道传递给tff.backends.native.set_remote_execution_context
来处理远程执行程序的构造和上下文安装,但是您的操作方式当然可以正常工作,并且可以进行更大的自定义。
设置好之后,端到端运行示例应该非常简单。我们将建立一个计算,该计算采用一组联合整数,在客户端上打印,并将这些整数加起来。让:
@tff.tf_computation(tf.int32)
def print_and_return(x):
# We must use tf.print here,as this logic will be
# serialized and run on the clients as TensorFlow.
tf.print('hello world')
return x
@tff.federated_computation(tff.FederatedType(tf.int32,tff.CLIENTS))
def print_and_sum(federated_arg):
same_ints = tff.federated_map(print_and_return,federated_arg)
return tff.federated_sum(same_ints)
假设我们有N
个客户;我们只需实例化联合整数集,然后调用我们的计算即可。
federated_ints = [1] * N
total = print_and_sum(federated_ints)
assert total == N
这应该使上面定义的tf.prints
在远程计算机上运行;只要tf.print
被定向到您可以监视的输出流,您就应该能够看到它。
PS:您可能会注意到上面的联邦总和是不必要的;必然是。只需将身份函数与序列化打印件映射即可达到相同的效果。