Serialize และ deserialize protobufs ผ่าน CLI?
ฉันพยายามยกเลิกการกำหนดค่าเริ่มต้นของไฟล์ที่บันทึกเป็นโปรโตบัฟผ่าน CLI (ดูเหมือนจะเป็นสิ่งที่ง่ายที่สุดที่จะทำ) ฉันไม่ต้องการใช้ protoc ในการคอมไพล์นำเข้าเป็นภาษาโปรแกรมแล้วอ่านผลลัพธ์
กรณีการใช้งานของฉัน: เครื่องมือ TensorFlow lite ได้ส่งออกข้อมูลบางส่วนในรูปแบบ protobuf ฉันพบmessageคำจำกัดความของโปรโตบัฟใน TensorFlow repo ด้วย ฉันแค่ต้องการอ่านผลลัพธ์อย่างรวดเร็ว โดยเฉพาะอย่างยิ่งฉันได้รับtflite::evaluation::EvaluationStageMetricsข้อความกลับจากinference_diff เครื่องมือนี้
คำตอบ
ฉันคิดว่าเครื่องมือแสดงข้อความ 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.
ในขณะที่คำตอบของ 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
}
}
}