CLI를 통해 protobufs를 직렬화 및 역 직렬화합니까?

Nov 23 2020

CLI를 통해 protobuf로 저장된 파일을 역 직렬화하려고합니다 (가장 쉬운 일인 것 같습니다). protoc을 사용하여 컴파일하고 프로그래밍 언어로 가져온 다음 결과를 읽는 것을 선호하지 않습니다.

내 사용 사례 : TensorFlow lite 도구는 일부 데이터를 protobuf 형식으로 출력했습니다. messageTensorFlow repo에서도 protobuf 정의를 찾았 습니다. 출력을 빨리 읽고 싶습니다. 특히 도구tflite::evaluation::EvaluationStageMetrics 에서 메시지를 받고 있습니다.inference_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의 답변이 도움이되었지만 저는 여전히 복잡한 repo (예 : TensorFlow)에서 protoc이 작동하도록하는 경로를 고민했습니다.

결국 이것은 나를 위해 일했습니다.

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

여기 inference_diff.txt에서 protobuf를 포함하는 파일의 바이너리 내용 ( 내 경우에는이 가이드 를 따라 생성됨)을 파이프 하고 프로젝트의 절대 경로 인 정규화 된 protobuf 메시지 ( package tflite.evaluation;과 메시지 이름 을 결합하여 얻은 EvaluationStageMetrics)를 지정합니다. proto_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
    }
  }
}