TensorFlow - 如何序列化并将状态发送到远程

时间:2018-01-15 10:15:21

标签: tensorflow

我正在编写分布式集合实现。

请求者 - 请求张量。

响应者 - 查看张量并将其发送给请求者。

如果响应方发生错误,我想将错误代码发送给请求者,请求者将其传播到更高级别。

我在GRPC上看到状态转换为::grpc::status。这对于状态序列化是否足够(即我可以简单地将::grpc::status字节存储在我的邮件正文中并发送它,还是需要另一个调用来压缩数据?感谢。

1 个答案:

答案 0 :(得分:0)

所以,很明显我无法直接复制::grpc::status,因为它有error_messageerror_details类型的字段::grpc::string基本上是std::string的typedef。因此,据我所知,数据并不平坦,我也无法指望它。

我找不到序列化如何完成的代码示例,所以我做了以下事情:

  1. 创建一个包含3个字段的Proto对象:error_codeerror_messageerror_details
  2. 在序列化时,我会从::grpc::status手动设置这些字段,然后拨打proto.SerializeToArray()
  3. 反序列化时,ParseProtoUnlimited(&proto)然后从原型字段创建::grpc::status
  4. 看起来足够干净。也许只是一点代码重复。

    <强>原

    message ErrorStatusProto {
      int32 error_code = 1;
      string error_message = 2;
      string error_details = 3;
    }
    

    <强>序列化

    ::grpc::Status gs = ToGrpcStatus(rm.status_);
    ErrorStatusProto gsProto;
    gsProto.set_error_code(gs.error_code());
    gsProto.set_error_message(gs.error_message());
    gsProto.set_error_details(gs.error_details());
    gsProto.SerializeToArray(&message[kErrorStatusStartIndex],
                             gsProto.ByteSize());
    if (gsProto.ByteSize() > kErrorStatusMaxSize) {
      LOG(ERROR) << "Error status (" << gsProto.ByteSize() << " bytes) "
                 << "is too big to fit in RDMA message ("
                 << kErrorStatusMaxSize << " bytes). Truncated.";
    }
    

    <强>反序列化

    ErrorStatusProto gsProto;
    CHECK(ParseProtoUnlimited(
        &gsProto, &message[kErrorStatusStartIndex], kErrorStatusMaxSize))
        << "Failed to parse error status proto from message. Aborting.";
    ::grpc::Status gs((::grpc::StatusCode)gsProto.error_code(), 
                      gsProto.error_message(), gsProto.error_details());
    rm.status_ = FromGrpcStatus(gs);