CLIを使用してprotobufsをシリアル化および逆シリアル化しますか?

Nov 23 2020

CLIを使用してprotobufとして保存されたファイルを逆シリアル化しようとしています(最も簡単な方法のようです)。protocを使用してコンパイルし、プログラミング言語にインポートしてから結果を読み取ることは避けたいと思います。

私のユースケース:TensorFlow liteツールは、protobuf形式でいくつかのデータを出力しました。messageTensorFlowリポジトリでもprotobufの定義を見つけました。出力をすばやく読みたいだけです。具体的にはtflite::evaluation::EvaluationStageMetricsinference_diff ツールからメッセージが返ってきます。

回答

TimoStamm Nov 26 2020 at 23:44

このツールはprotobufメッセージをバイナリ形式で出力すると思います。

protocは、メッセージをデコードしてテキスト形式で出力できます。このオプションを参照してください:

  --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

Timo Stammsの回答は役に立ちましたが、複雑なリポジトリ(TensorFlowなど)でprotocを機能させるためのパスに苦労していました。

結局、これは私のために働いた:

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

ここでは、protobuf(inference_diff.txt私の場合はこのガイドに従って生成された)を含むファイルのバイナリコンテンツをパイプ処理し、プロジェクトの絶対パスである完全修飾protobufメッセージ(とpackage tflite.evaluation;メッセージ名を組み合わせて取得)を指定しますEvaluationStageMetricsproto_path(プロジェクトルート/ TensorFlowリポジトリ)、および実際にメッセージを含むファイルの絶対パス。proto_pathはインポートの解決に使用されますが、PROTO_FILE(この場合はevaluation_config.proto)はファイルのデコードに使用されます。

出力例

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
    }
  }
}

急いで番号を取得したいだけで、パスを修正するのに煩わされない場合は、次のことができます。

cat inference_diff.txt | protoc --decode_raw

出力例

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
    }
  }
}