Serialize และ deserialize protobufs ผ่าน CLI?

Nov 23 2020

ฉันพยายามยกเลิกการกำหนดค่าเริ่มต้นของไฟล์ที่บันทึกเป็นโปรโตบัฟผ่าน CLI (ดูเหมือนจะเป็นสิ่งที่ง่ายที่สุดที่จะทำ) ฉันไม่ต้องการใช้ protoc ในการคอมไพล์นำเข้าเป็นภาษาโปรแกรมแล้วอ่านผลลัพธ์

กรณีการใช้งานของฉัน: เครื่องมือ TensorFlow lite ได้ส่งออกข้อมูลบางส่วนในรูปแบบ protobuf ฉันพบmessageคำจำกัดความของโปรโตบัฟใน TensorFlow repo ด้วย ฉันแค่ต้องการอ่านผลลัพธ์อย่างรวดเร็ว โดยเฉพาะอย่างยิ่งฉันได้รับ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 เป็นเครื่องมือ แต่ฉันก็ยังคงต่อสู้กับเส้นทางที่จะทำให้ protoc ทำงานใน repo ที่ซับซ้อน (เช่น TensorFlow)

ในท้ายที่สุดสิ่งนี้ได้ผลสำหรับฉัน:

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;และชื่อข้อความEvaluationStageMetrics) เส้นทางสัมบูรณ์ของโครงการ สำหรับ proto_path (ซึ่งเป็นโปรเจ็กต์ root / TensorFlow repo) และเส้นทางสัมบูรณ์สำหรับไฟล์ที่มีข้อความอยู่จริง 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
    }
  }
}