是否可以向不同的客户端发送不同的权重子集?
Is it possible to send different subset of weights to different clients?
我正在尝试在服务器上使用 tensorflow-federated select 不同的权重子集并将它们发送到客户端。然后,客户将训练并发回训练好的权重。服务器聚合结果并开始新一轮通信。
主要问题是我无法访问权重的 numpy 版本,因此我不知道如何为每一层访问它们的子集。我尝试使用 tf.gather_nd 和 tf.tensor_scatter_nd_update 来执行 selection 和更新,但它们只适用于张量,而不适用于张量列表(因为 server_state 在 tensorflow-federated ).
有没有人有解决这个问题的提示?甚至可以向每个客户端发送 不同的 权重吗?
如果我的理解正确,编写 TFF 类型 shorthand 中描述的高级计算的方法是:
@tff.federated_computation(...)
def run_one_round(server_state, client_datasets):
weights_subset = tff.federated_map(subset_fn, server_state)
clients_weights_subset = tff.federated_broadcast(weights_subset)
client_models = tff.federated_map(client_training_fn,
(clients_weights_subset, client_datasets))
aggregated_update = tff.federated_aggregate(client_models, ...)
new_server_state = tff.federated_map(apply_aggregated_update_fn, server_state)
return new_server_state
如果这是真的,那么大部分工作似乎都需要在 subset_fn
中进行,它采用服务器状态和 returns 全局模式权重的子集。通常,模型是 tf.Tensor
, which as you observed cannot be used as an argument to tf.gather_nd
or tf.tensor_scatter_nd_update
. However, they can be be applied pointwise to the structure of tensors uses tf.nest.map_structure
的结构(list
或 dict
,可能是嵌套的)。例如,从三个张量的嵌套结构中选择 [0, 0] 处的值:
import tensorflow as tf
import pprint
struct_of_tensors = {
'trainable': [tf.constant([[2.0, 4.0, 6.0]]), tf.constant([[5.0]])],
'non_trainable': [tf.constant([[1.0]])],
}
pprint.pprint(tf.nest.map_structure(
lambda tensor: tf.gather_nd(params=tensor, indices=[[0, 0]]),
struct_of_tensors))
>>> {'non_trainable': [<tf.Tensor: shape=(1,), dtype=float32, numpy=array([1.], dtype=float32)>],
'trainable': [<tf.Tensor: shape=(1,), dtype=float32, numpy=array([2.], dtype=float32)>,
<tf.Tensor: shape=(1,), dtype=float32, numpy=array([5.], dtype=float32)>]}
我正在尝试在服务器上使用 tensorflow-federated select 不同的权重子集并将它们发送到客户端。然后,客户将训练并发回训练好的权重。服务器聚合结果并开始新一轮通信。
主要问题是我无法访问权重的 numpy 版本,因此我不知道如何为每一层访问它们的子集。我尝试使用 tf.gather_nd 和 tf.tensor_scatter_nd_update 来执行 selection 和更新,但它们只适用于张量,而不适用于张量列表(因为 server_state 在 tensorflow-federated ).
有没有人有解决这个问题的提示?甚至可以向每个客户端发送 不同的 权重吗?
如果我的理解正确,编写 TFF 类型 shorthand 中描述的高级计算的方法是:
@tff.federated_computation(...)
def run_one_round(server_state, client_datasets):
weights_subset = tff.federated_map(subset_fn, server_state)
clients_weights_subset = tff.federated_broadcast(weights_subset)
client_models = tff.federated_map(client_training_fn,
(clients_weights_subset, client_datasets))
aggregated_update = tff.federated_aggregate(client_models, ...)
new_server_state = tff.federated_map(apply_aggregated_update_fn, server_state)
return new_server_state
如果这是真的,那么大部分工作似乎都需要在 subset_fn
中进行,它采用服务器状态和 returns 全局模式权重的子集。通常,模型是 tf.Tensor
, which as you observed cannot be used as an argument to tf.gather_nd
or tf.tensor_scatter_nd_update
. However, they can be be applied pointwise to the structure of tensors uses tf.nest.map_structure
的结构(list
或 dict
,可能是嵌套的)。例如,从三个张量的嵌套结构中选择 [0, 0] 处的值:
import tensorflow as tf
import pprint
struct_of_tensors = {
'trainable': [tf.constant([[2.0, 4.0, 6.0]]), tf.constant([[5.0]])],
'non_trainable': [tf.constant([[1.0]])],
}
pprint.pprint(tf.nest.map_structure(
lambda tensor: tf.gather_nd(params=tensor, indices=[[0, 0]]),
struct_of_tensors))
>>> {'non_trainable': [<tf.Tensor: shape=(1,), dtype=float32, numpy=array([1.], dtype=float32)>],
'trainable': [<tf.Tensor: shape=(1,), dtype=float32, numpy=array([2.], dtype=float32)>,
<tf.Tensor: shape=(1,), dtype=float32, numpy=array([5.], dtype=float32)>]}