7.10. CMSIS-NN¶
รายการตัวดำเนินการที่ TFLM ประมวลผลส่วนใหญ่ประกอบด้วยตัวดำเนินการหลักไม่กี่ตัว ได้แก่ convolution ที่เลื่อนตารางเล็กๆ ของน้ำหนักที่เรียนรู้มาข้ามเทนเซอร์อินพุตและเขียนผลรวมที่ถ่วงน้ำหนักในแต่ละตำแหน่ง depthwise convolution ที่ทำเช่นเดียวกันในแต่ละช่อง fully-connected ที่คูณเมทริกซ์ระหว่างเวกเตอร์อินพุตกับเมทริกซ์ของน้ำหนัก pooling ที่ย่อเทนเซอร์โดยหาค่าสูงสุดหรือค่าเฉลี่ยในพื้นที่ขนาดเล็ก และ activation functions เช่น ReLU และ sigmoid ที่ทำงานแบบ pointwise กับทุกค่า การอนุมานภาพใช้รอบประมวลผลส่วนใหญ่ไปกับตัวดำเนินการเหล่านี้เพียงไม่กี่ตัว
หากนำไปใช้งานในแบบตรงไปตรงมา ตัวดำเนินการเหล่านี้จะช้ามากบนไมโครคอนโทรลเลอร์ CMSIS-NN คือไลบรารีของ Arm สำหรับตัวดำเนินการที่รวดเร็ว -- ปรับแต่งด้วย assembly ด้วยมือ ทำการควอนไทซ์แบบจำนวนเต็มเป็นค่า int8 และ uint8 ตามที่ tensor I/O อธิบายไว้ และเขียนสำหรับคำสั่ง SIMD ของ CPU SIMD -- Single Instruction, Multiple Data -- ให้ CPU ดำเนินการคำนวณหนึ่งครั้งกับหลายค่าในรอบเดียวกัน การคูณ-บวกแบบสเกลาร์ธรรมดาให้ผลลัพธ์หนึ่งค่าต่อรอบ แต่การคูณ-บวกแบบ SIMD บรรจุหลายค่าเข้ารีจิสเตอร์ขนาดกว้างและให้ผลลัพธ์ทั้งหมดพร้อมกัน
Cortex-M7 บน H7 และ RT1062 มี DSP extension ของ Arm ซึ่งเก็บค่า int8 ได้สี่ค่าในรีจิสเตอร์ 32 บิตและดำเนินการคูณ-บวกกับทั้งสี่ค่าในรอบเดียว Cortex-M55 บน AE3 มี Helium -- ในชื่อทางการคือ MVE หรือ M-profile Vector Extension -- ซึ่งเก็บ int8 ได้สิบหกช่องในรีจิสเตอร์ 128 บิต ให้ปริมาณงานที่ผ่านได้สี่เท่าต่อรอบ Helium คือชุดคำสั่ง CPU ที่กว้างขึ้น ไม่ใช่ตัวเร่งความเร็ว ส่วน Ethos-U55 NPU บนชิปเดียวกันคือตัวเร่งความเร็ว
บิลด์ TFLM ที่จัดส่งเชื่อมโยงกับ CMSIS-NN และ TFLM จะส่งต่อตัวดำเนินการหลักแต่ละตัวไปยังตัวแปร SIMD ที่เหมาะสมกับกล้องในขณะรันไทม์ บน AE3 การส่งต่อซับซ้อนขึ้นเล็กน้อย: คอมไพเลอร์ Vela ได้วิเคราะห์โมเดลแบบออฟไลน์ล่วงหน้าแล้วและทำเครื่องหมายส่วนที่เชื่อมต่อกันของตัวดำเนินการที่รองรับ NPU -- subgraphs -- เพื่อส่งต่อไปยัง Ethos-U ในเวลาการอนุมาน subgraph เหล่านั้นจะทำงานบนตัวเร่งความเร็วพร้อมกันในบล็อกเดียว และส่วนที่เหลือจะ fallback ไปใช้ Helium CMSIS-NN บน M55
ตัวดำเนินการ float จะข้าม CMSIS-NN ไปทั้งหมดและทำงานผ่าน reference kernels แบบพกพาของ TFLM ช่องว่างด้านความแม่นยำระหว่างโมเดล int8 กับโมเดล float มักเล็กน้อย แต่ช่องว่างด้านปริมาณงานที่ผ่านได้นั้นมาก โมเดลที่จัดส่งบนกล้องจึงถูกควอนไทซ์เป็น int8 ด้วยเหตุนี้