7.8. Tensor I/O¶
engine รับเทนเซอร์หนึ่งตัวทางฝั่งอินพุตและผลิตหนึ่งหรือมากกว่าทางฝั่งเอาต์พุต เทนเซอร์เหล่านั้นเป็นออบเจ็กต์ ndarray ที่มีรูปร่าง dtype และคำศัพท์ descriptor ที่บท numpy ได้แนะนำ รูปร่างและ dtype ของมันมาจากไฟล์โมเดลและถูกรายงานผ่าน input_shape / output_shape และ input_dtype / output_dtype
7.8.1. Quantization¶
โครงข่ายส่วนใหญ่ที่ cam รันทำงานบนเทนเซอร์จำนวนเต็มแบบ quantized -- int8 หรือ uint8 -- เพื่อให้พอดีกับ RAM และงบประมาณการคำนวณของ cam เทนเซอร์แบบ quantized บรรจุค่าจำนวนเต็มที่แทนค่าตัวเลขจริงผ่าน scale และ zero point ต่อเทนเซอร์:
scale และ zero point มาจาก calibration ตอน training ของโมเดลและถูกเก็บไว้ในไฟล์โมเดล มันถูกเปิดเผยในรูปแบบ input_scale, input_zero_point, output_scale, และ output_zero_point -- แต่ละรายการเป็น list ที่มีหนึ่งรายการต่อเทนเซอร์อินพุตหรือเอาต์พุต
ml.utils.quantize() และ ml.utils.dequantize() ใช้สูตรกับ output index ที่ระบุ:
import ml.utils
real_tensor = ml.utils.dequantize(model, q_tensor, index=0)
q_tensor = ml.utils.quantize(model, real_tensor, index=0)
ทั้งสองฟังก์ชันส่งคืนค่าโดยไม่เปลี่ยนแปลงเมื่อ output dtype ที่ index ที่กำหนดเป็น float อยู่แล้ว ดังนั้นการเรียกจึงปลอดภัยโดยไม่คำนึงถึงสถานะการ quantization ของโมเดล
7.8.2. สิ่งที่สคริปต์เห็นทางฝั่งเอาต์พุต¶
สิ่งที่ predict() ส่งคืนขึ้นอยู่กับว่ามีการลงทะเบียน post-processor ไว้หรือไม่
โดยไม่มี post-processor เอาต์พุตจำนวนเต็มดิบของ engine จะถูก auto-dequantized เป็น float และส่งคืนเป็น list ของออบเจ็กต์ float ndarray สคริปต์รับค่าจริงที่พร้อมสำหรับการอ่าน นี่เป็นเส้นทางที่ถูกต้องสำหรับโครงข่ายการจำแนกประเภท ซึ่งเทนเซอร์เอาต์พุตตัวเดียวเป็นรายการคะแนนความเชื่อมั่นต่อคลาสที่แอปพลิเคชัน iterate อยู่แล้ว -- ไม่ต้องมีขั้นตอนการถอดรหัส มันยังเป็นเส้นทางง่ายสำหรับการรันโมเดลที่ไม่รู้จักอย่างรวดเร็วหรือสำหรับการตรวจสอบแบบ ad-hoc จาก REPL
เมื่อมีการลงทะเบียน post-processor (ผ่าน postprocess= บน constructor หรือ callback= บนการเรียก predict) เทนเซอร์ quantized ดิบจะถูกส่งไปยัง callable ของ post-processor โดยตรง post-processor รับเทนเซอร์ quantized ดิบและรับผิดชอบการ dequantization ที่ต้องการ
การแบ่งนี้เป็นการเลือกด้านประสิทธิภาพ Auto-dequantization จัดสรรเทนเซอร์ float ใหม่สำหรับแต่ละเอาต์พุตและ walk ทุกองค์ประกอบ post-processor ที่ต้องการค่าเพียงไม่กี่ค่าจากแต่ละเทนเซอร์ -- threshold คะแนนความเชื่อมั่น แล้วถอดรหัสกรอบล้อมรอบสำหรับ survivor -- จะข้ามค่าใช้จ่ายของการ dequantize ส่วนที่เหลือ decoder กรอบล้อมรอบที่จัดส่งภายใต้ ml.postprocessing ล้วนใช้เส้นทางนี้ และ ml.utils.threshold() ถูกสร้างสำหรับกรณีนี้โดยเฉพาะ: มันรับเทนเซอร์คะแนนแบบ quantized และส่งคืน index ที่ค่า dequantized ผ่านค่าขีดแบ่งแบบ real-valued โดยไม่ต้อง dequantize เทนเซอร์ทั้งหมด