Serialize và deserialize protobufs thông qua CLI?

Nov 23 2020

Tôi đang cố gắng giải mã hóa một tệp được lưu dưới dạng protobuf thông qua CLI (có vẻ như là điều dễ thực hiện nhất). Tôi không muốn sử dụng protoc để biên dịch, nhập nó vào một ngôn ngữ lập trình và sau đó đọc kết quả.

Trường hợp sử dụng của tôi: Một công cụ TensorFlow lite đã xuất một số dữ liệu ở định dạng protobuf. Tôi cũng đã tìm thấy messageđịnh nghĩa protobuf trong repo TensorFlow. Tôi chỉ muốn đọc đầu ra một cách nhanh chóng. Cụ thể, tôi đang nhận được tflite::evaluation::EvaluationStageMetricsthông báo từ inference_diff công cụ .

Trả lời

TimoStamm Nov 26 2020 at 23:44

Tôi giả sử rằng công cụ xuất ra một thông báo protobuf ở định dạng nhị phân.

protoc có thể giải mã thông điệp và xuất ra dưới dạng văn bản. Xem tùy chọn này:

  --decode=MESSAGE_TYPE       Read a binary message of the given type from
                              standard input and write it in text format
                              to standard output.  The message type must
                              be defined in PROTO_FILES or their imports.
BenButterworth Nov 28 2020 at 20:16

Mặc dù câu trả lời của Timo Stamms là công cụ, nhưng tôi vẫn phải vật lộn với các con đường để có được protoc hoạt động trong một repo phức tạp (ví dụ: TensorFlow).

Cuối cùng, điều này đã làm việc cho tôi:

cat inference_diff.txt | \
    protoc --proto_path="/Users/ben/butter/repos/tensorflow/" \
    --decode tflite.evaluation.EvaluationStageMetrics \ 
    $(pwd)/evaluation_config.proto

Ở đây tôi viết nội dung nhị phân của tệp chứa protobuf ( inference_diff.txttrong trường hợp của tôi, được tạo bằng cách làm theo hướng dẫn này ) và chỉ định thông báo protobuf đủ điều kiện (tôi nhận được bằng cách kết hợp tên package tflite.evaluation;và thông báo, EvaluationStageMetrics), đường dẫn tuyệt đối của dự án cho proto_path (là gốc của dự án / repo TensorFlow) và cũng là đường dẫn tuyệt đối cho tệp thực sự chứa thông báo. proto_pathchỉ được sử dụng để phân giải quá trình nhập, trong đó PROTO_FILE (trong trường hợp này là evaluation_config.proto), được sử dụng để giải mã tệp.

Đầu ra mẫu

num_runs: 50
process_metrics {
  inference_profiler_metrics {
    reference_latency {
      last_us: 455818
      max_us: 577312
      min_us: 453121
      sum_us: 72573828
      avg_us: 483825.52
      std_deviation_us: 37940
    }
    test_latency {
      last_us: 59503
      max_us: 66746
      min_us: 57828
      sum_us: 8992747
      avg_us: 59951.646666666667
      std_deviation_us: 1284
    }
    output_errors {
      max_value: 122.371696
      min_value: 83.0335922
      avg_value: 100.17548828125
      std_deviation: 8.16124535
    }
  }
}

Nếu bạn chỉ muốn lấy số gấp và không thể bận tâm đến việc sửa chữa đường đi, bạn có thể làm

cat inference_diff.txt | protoc --decode_raw

Ví dụ đầu ra

1: 50
2 {
  5 {
    1 {
      1: 455818
      2: 577312
      3: 453121
      4: 72573828
      5: 0x411d87c6147ae148
      6: 37940
    }
    2 {
      1: 59503
      2: 66746
      3: 57828
      4: 8992747
      5: 0x40ed45f4b17e4b18
      6: 1284
    }
    3 {
      1: 0x42f4be4f
      2: 0x42a61133
      3: 0x40590b3b33333333
      4: 0x41029476
    }
  }
}