【问题标题】:Send a Keras model with gRPC使用 gRPC 发送 Keras 模型
【发布时间】:2020-07-18 02:51:35
【问题描述】:

我正在尝试使用 gRPC 实现联邦学习系统。 Tensorflow Federated 目前支持多机远程学习,但在我看来有些奇怪,它在服务器端准备客户端数据集。我希望客户端的数据集只驻留在客户端的设备中,而不是在服务器的内存中准备。

如果我使用 Tensorflow 已经在使用的 tensor_shape.proto, tensor.proto, types.proto, resource_handle.prototensor_util.make_tensor_proto(),则可以很好地传输诸如权重向量之类的张量

hist = model.fit(...)
vector = model.trainable_variables
sending_tensors = []
for v in vector:
    tensor = tensor_util.make_tensor_proto(v.numpy(), shape=v.numpy().shape)
    sending_tensors.append(tensor)
#Some sending logic
...

但我找不到任何类型的“model.proto”。 我想以与上面类似的方式实现如下。

#server
model = tf.keras.models.Sequential([ ... ])
model.compile(...)
model_proto = some_package.make_model_proto()

req = my_proto_pb2.Request(model=model_proto)
client_stub.some_grpc_service(req)

#client
class SomeServicer(...):
  def some_grpc_service(self, request, context):
    model_proto = request.model
    model = some_package.model_from_proto(model_proto)

    model.compile(...)
    model.fit(...)
    ...

将 protobuf 定义为

message Request {
    ModelProto model = 1;
}

这不是关于Serving,只是关于通过 gRPC 将 keras 模型从服务器传输到客户端。有什么办法吗?

如果不可能,我是否应该将其简单地作为从.h5model.save() 创建的文件读取的字节流发送?

【问题讨论】:

    标签: python tensorflow keras protocol-buffers grpc


    【解决方案1】:

    关于 TFF 的快速说明——目前,许多示例确实在服务器端实现了数据集,这仅仅是因为 FL 研究优先的设计,例如改进了联合优化算法。 TFF 目前可以通过简单地使用不同的方法在客户端上实现数据集来支持此处所需的应用程序。

    由于 TF 是本地计算引擎,而 TFF 支持执行任意 TensorFlow,只要您可以基于本地客户端环境在 TensorFlow 中加载数据集,TFF 就可以支持。一个例子可能是在外部 Python 层中选择一组 ID,编写一个 TF 函数来获取这些 ID 并从本地客户端环境中具体化一个数据集,然后将此函数映射到这些 ID 上。这样的模式可能看起来像:

    @tff.tf_computation(tf.int32)
    def materialize_dataset_on_client(x):
      ds = ... # inspect local environment, and load dataset as usual in TF
      return ds
    
    @tff.federated_computation(
        tff.FederatedType(
            tff.TensorType(tf.int32, shape=[]), tff.CLIENTS),
        ... ) # model type in here as well presumably
    def train(ids_and_model):
      ids, model = ids_and_model # simply unpacking here
      datasets = tff.federated_map(materialize_datasets_on_clients, ids)
      train_result = run_training(datasets, model) # Assume run_training_defined elsewhere
      return train_result
    

    这种模式不会导致数据集在服务器上具体化,只是训练的结果。

    【讨论】:

      猜你喜欢
      • 2020-10-28
      • 2020-07-31
      • 2017-09-03
      • 2018-10-07
      • 1970-01-01
      • 2020-12-25
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      相关资源
      最近更新 更多