问题描述
我想将federated_train_data指向远程客户端数据,如下面的代码所示,这可能吗?怎么样?
如果不需要,我需要什么进一步的实现才能尝试。请指向相关代码。
factory = tff.framework.create_executor_factory(make_remote_executor)
context = tff.framework.ExecutionContext(factory)
tff.framework.set_default_context(context)
state = iterative_process.initialize()
state,metrics = iterative_process.next(state,federated_train_data)
def make_remote_executor(inferred_cardinalities):
"""Make remote executor."""
def create_worker_stack(ex):
ex = tff.framework.ThreadDelegatingExecutor(ex)
return tff.framework.ReferenceResolvingExecutor(ex)
client_ex = []
num_clients = inferred_cardinalities.get(tff.CLIENTS,None)
if num_clients:
print('Inferred that there are {} clients'.format(num_clients))
else:
print('No CLIENTS placement provided')
for _ in range(num_clients or 0):
channel = grpc.insecure_channel('{}:{}'.format(FLAGS.host,FLAGS.port))
remote_ex = tff.framework.RemoteExecutor(channel,rpc_mode='STREAMING')
worker_stack = create_worker_stack(remote_ex)
client_ex.append(worker_stack)
federating_strategy_factory = tff.framework.FederatedResolvingStrategy.factory(
{
tff.SERVER: create_worker_stack(tff.framework.EagerTFExecutor()),tff.CLIENTS: client_ex,})
unplaced_ex = create_worker_stack(tff.framework.EagerTFExecutor())
federating_ex = tff.framework.FederatingExecutor(federating_strategy_factory,unplaced_ex)
return tff.framework.ReferenceResolvingExecutor(federating_ex)
解决方法
在链接的示例中,您可以看到客户端数据来自make_federated data
function生成的每个客户端的tf.data.Dataset
。
客户端数据可以以可序列化的tf.data.Dataset
的形式提供,或者根据您定义迭代过程的方式,可以tff.federated_map
将一些输入数据(例如客户端ID)添加到数据集中使用TensorFlow。
请注意,RemoteExecutors并非旨在针对“在客户端上”的数据运行,即在远程执行器本身上运行。也许可以通过TensorFlow代码以这种方式使用它们,以将数据从远程执行程序的文件系统读取到数据集中,但是通常这不是受支持的用例。推荐的处理客户端数据的方法是使用TensorFlow计算,该计算可基于客户端ID或客户端TensorFlow计算的其他输入来生成表示客户端数据的tf.data.Dataset
。