ไดรเวอร์ API เครือข่ายระบบประสาท

หน้านี้แสดงภาพรวมของวิธีใช้ Neural Networks API (NNAPI) คนขับ สำหรับรายละเอียดเพิ่มเติม โปรดดูเอกสารที่อยู่ในคำจำกัดความ HAL ไฟล์ใน hardware/interfaces/neuralnetworks ตัวอย่างการใช้งานไดรเวอร์อยู่ใน frameworks/ml/nn/driver/sample

ดูข้อมูลเพิ่มเติมเกี่ยวกับ Neural Networks API โปรดดู Neural Networks API

HAL โครงข่ายระบบประสาทเทียม

โครงข่ายระบบประสาทเทียม (NN) HAL แสดงนามธรรมของอุปกรณ์ต่างๆ เช่น หน่วยประมวลผลกราฟิก (GPU) และผู้ประมวลผลสัญญาณดิจิทัล (DSP) ที่อยู่ในผลิตภัณฑ์ (เช่น โทรศัพท์หรือแท็บเล็ต) ปัจจัยขับเคลื่อนของวงการเหล่านี้ อุปกรณ์ต้องเป็นไปตาม NN HAL อินเทอร์เฟซจะระบุอยู่ใน HAL ไฟล์คำจำกัดความใน hardware/interfaces/neuralnetworks

มีการแสดงภาพขั้นตอนทั่วไปของอินเทอร์เฟซระหว่างเฟรมเวิร์กและไดรเวอร์ ในรูปที่ 1

การไหลของโครงข่ายระบบประสาทเทียม

รูปที่ 1 การไหลของโครงข่ายระบบประสาทเทียม

การเริ่มต้น

ในช่วงเริ่มต้น เฟรมเวิร์กจะค้นหาความสามารถของคนขับเพื่อดูความสามารถของไดรเวอร์โดยใช้ IDevice::getCapabilities_1_3 โครงสร้าง @1.3::Capabilities มีข้อมูลทุกประเภทและ แสดงประสิทธิภาพที่ไม่ตัดออกโดยใช้เวกเตอร์

ในการกำหนดวิธีจัดสรรการคำนวณให้กับอุปกรณ์ที่ใช้ได้ จะใช้ความสามารถในการทำความเข้าใจว่า ผู้ขับขี่แต่ละคนสามารถดำเนินการอย่างมีประสิทธิภาพได้ หากต้องการให้ข้อมูลนี้ คนขับต้องระบุตัวเลขประสิทธิภาพมาตรฐานตามการดำเนินการ ของภาระงานอ้างอิง

เพื่อระบุค่าที่คนขับแสดงผลตาม IDevice::getCapabilities_1_3โปรดใช้แอปเปรียบเทียบ NNAPI เพื่อวัด ประสิทธิภาพของข้อมูล ประเภทต่างๆ ที่เกี่ยวข้อง MobileNet v1 และ v2, asr_float และแนะนำให้ใช้โมเดล tts_float สำหรับการวัดประสิทธิภาพแบบ 32 บิต ค่าทศนิยมและโมเดลที่ควอนไตซ์ของ MobileNet v1 และ v2 แนะนำสำหรับค่าที่แปลงเป็น 8 บิต สำหรับข้อมูลเพิ่มเติม โปรดดู ชุดทดสอบแมชชีนเลิร์นนิงของ Android

ใน Android 9 และต่ำกว่า โครงสร้าง Capabilities จะรวมประสิทธิภาพของไดรเวอร์ ข้อมูลเฉพาะสำหรับจุดลอยตัวและ Tensor ที่เล็กลง และไม่รวมถึง ประเภทข้อมูลสเกลาร์

ในกระบวนการเริ่มต้น เฟรมเวิร์กอาจค้นหาข้อมูลเพิ่มเติม โดยใช้ IDevice::getType IDevice::getVersionString IDevice:getSupportedExtensions และ IDevice::getNumberOfCacheFilesNeeded

ระหว่างการรีบูตผลิตภัณฑ์ เฟรมเวิร์กจะคาดหวังคำค้นหาทั้งหมดที่อธิบายไว้ในบทความนี้ เพื่อรายงานค่าเดียวกันสำหรับไดรเวอร์ที่ระบุเสมอ ไม่เช่นนั้น แอป การใช้ไดรเวอร์นั้นอาจทำให้ประสิทธิภาพการทำงานลดลงหรือทำงานไม่ถูกต้อง

การรวบรวม

โดยเฟรมเวิร์กจะกำหนดอุปกรณ์ที่จะใช้เมื่อได้รับคำขอจาก แอป ใน Android 10 แอปจะค้นพบ และระบุอุปกรณ์ ที่เฟรมเวิร์กเลือกใช้ สำหรับข้อมูลเพิ่มเติม โปรดดู การค้นหาและการให้สิทธิ์อุปกรณ์

ในเวลาคอมไพล์โมเดล เฟรมเวิร์กจะส่งโมเดลไปยังผู้สมัครแต่ละราย คนขับโดยการโทร IDevice::getSupportedOperations_1_3 ไดรเวอร์แต่ละตัวแสดงผลอาร์เรย์ของบูลีนที่ระบุ การดำเนินการของโมเดลได้รับการสนับสนุน คนขับสามารถระบุได้ สนับสนุนการดำเนินการหนึ่งๆ ด้วยเหตุผลหลายประการ เช่น

  • ไดรเวอร์ไม่รองรับประเภทข้อมูลนี้
  • ไดรเวอร์รองรับการดำเนินการที่มีพารามิเตอร์อินพุตที่ระบุเท่านั้น สำหรับ ตัวอย่างเช่น ไดรเวอร์อาจรองรับ 3x3 และ 5x5 แต่ไม่รองรับ Convolution 7x7
  • ไดรเวอร์มีข้อจำกัดด้านหน่วยความจำทำให้ไม่สามารถจัดการได้ในวงกว้าง กราฟหรืออินพุต

ระหว่างการคอมไพล์ อินพุต เอาต์พุต และตัวถูกดำเนินการภายในของโมเดล โดยที่ อธิบายไว้ใน OperandLifeTime อาจมีมิติข้อมูลหรืออันดับที่ไม่รู้จักได้ สำหรับข้อมูลเพิ่มเติม โปรดดู รูปร่างเอาต์พุต

เฟรมเวิร์กนี้จะสั่งให้ผู้ขับขี่ที่เลือกแต่ละรายเตรียมพร้อมสำหรับการดำเนินการเซตย่อย โมเดลด้วยการเรียก IDevice::prepareModel_1_3 จากนั้นไดรเวอร์แต่ละตัวจะรวบรวมชุดย่อยของตัวเอง เช่น คนขับอาจ สร้างโค้ดหรือสร้างสำเนาของน้ำหนักที่เรียงลำดับใหม่ เนื่องจากอาจมี ระยะเวลาอย่างมากระหว่างการคอมไพล์โมเดลและ การดำเนินการตามคำขอ ทรัพยากรต่างๆ เช่น หน่วยหน่วยความจำของอุปกรณ์ขนาดใหญ่ไม่ควร ระหว่างการคอมไพล์

เมื่อสำเร็จ คนขับได้ส่งคืน @1.3::IPreparedModel แฮนเดิล ถ้าไดรเวอร์แสดงผลรหัสความล้มเหลวเมื่อเตรียมชุดย่อยของ เฟรมเวิร์กนี้จะเรียกใช้ทั้งโมเดลบน CPU

ในการลดเวลาที่ใช้ในการคอมไพล์เมื่อแอปเริ่มทำงาน ผู้ขับขี่สามารถ อาร์ติแฟกต์การคอมไพล์แคช สำหรับข้อมูลเพิ่มเติม โปรดดู การรวบรวม การแคช

การลงมือปฏิบัติ

เมื่อแอปขอให้เฟรมเวิร์กดำเนินการตามคำขอ เฟรมเวิร์กจะเรียกใช้ เวลา IPreparedModel::executeSynchronously_1_3 เมธอด HAL โดยค่าเริ่มต้นเพื่อดำเนินการแบบซิงโครนัสบนโมเดลที่เตรียมไว้ คำขอยังสามารถดำเนินการแบบไม่พร้อมกันโดยใช้ execute_1_3 เมธอด executeFenced (ดูการดำเนินการ Fenced) หรือดำเนินการโดยใช้ การถ่ายภาพอัจฉริยะ

การเรียกใช้การดำเนินการแบบซิงโครนัสช่วยปรับปรุงประสิทธิภาพและลดการแยกชุดข้อความ โอเวอร์เฮดเมื่อเทียบกับการเรียกใช้แบบไม่พร้อมกัน เนื่องจากการควบคุมจะส่งกลับไปยัง ของกระบวนการของแอปก็ต่อเมื่อการดำเนินการเสร็จสมบูรณ์เท่านั้น ซึ่งหมายความว่า ไม่ต้องใช้กลไกแยกต่างหากเพื่อแจ้งกระบวนการของแอปว่า การดำเนินการเสร็จสิ้นแล้ว

เมื่อใช้เมธอด execute_1_3 แบบไม่พร้อมกัน ตัวควบคุมจะกลับไปที่ กระบวนการของแอปหลังจากที่เริ่มการดำเนินการแล้ว และคนขับต้องแจ้ง เมื่อการดำเนินการเสร็จสมบูรณ์ โดยใช้ @1.3::IExecutionCallback

พารามิเตอร์ Request ที่ส่งผ่านไปยังเมธอดดำเนินการจะแสดงรายการอินพุตและเอาต์พุต ตัวถูกดำเนินการที่ใช้สำหรับการดำเนินการ หน่วยความจำที่เก็บข้อมูลตัวถูกดำเนินการจะต้อง ใช้ลำดับหลักแถวที่มีมิติข้อมูลแรกทำซ้ำช้าที่สุดและไม่มี ระยะห่างจากขอบที่ท้ายแถว หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับประเภทของตัวถูกดำเนินการ ดู Operand

สำหรับไดรเวอร์ NN HAL 1.2 ขึ้นไป เมื่อมีการส่งคำขอ เสร็จสมบูรณ์ สถานะข้อผิดพลาด รูปร่างเอาต์พุต และ ข้อมูลเวลาจะแสดงกลับมา เฟรมเวิร์กนี้ได้ง่ายขึ้น ในระหว่างการดำเนินการ เอาต์พุตหรือตัวถูกดำเนินการภายในของโมเดลสามารถ มีมิติข้อมูลหรืออันดับที่ไม่รู้จักอย่างน้อยหนึ่งรายการ เมื่อมีเอาต์พุตอย่างน้อย 1 รายการ ตัวถูกดำเนินการมีมิติข้อมูลหรืออันดับที่ไม่รู้จัก ไดรเวอร์ต้องส่งคืน ข้อมูลเอาต์พุตที่มีขนาดแบบไดนามิก

สำหรับไดรเวอร์ที่มี NN HAL 1.1 หรือต่ำกว่า สถานะข้อผิดพลาดจะปรากฏเมื่อ เสร็จสมบูรณ์แล้ว มิติข้อมูลสำหรับตัวถูกดำเนินการของอินพุตและเอาต์พุตต้องครบถ้วนสมบูรณ์ ที่ระบุไว้เพื่อให้การดำเนินการเสร็จสมบูรณ์ ตัวถูกดำเนินการภายใน มีมิติข้อมูลที่ไม่รู้จักอย่างน้อยหนึ่งรายการ แต่ต้องระบุอันดับ

สำหรับคำขอของผู้ใช้ที่ครอบคลุมไดรเวอร์หลายตัว เฟรมเวิร์กนี้มีหน้าที่ การสงวนหน่วยความจำระดับกลางและสำหรับการเรียงลำดับการเรียกไปยังไดรเวอร์แต่ละตัว

สามารถเริ่มคำขอหลายรายการพร้อมกันได้ใน @1.3::IPreparedModel ไดรเวอร์สามารถดำเนินการกับคำขอพร้อมกันหรือเรียงลำดับการดำเนินการได้

เฟรมเวิร์กนี้สามารถขอให้ผู้ขับขี่เก็บโมเดลที่เตรียมไว้ได้มากกว่า 1 รายการ สำหรับ เช่น เตรียมโมเดล m1 เตรียม m2 ดำเนินการตามคำขอ r1 ใน m1 ดำเนินการ r2 ใน m2 เรียกใช้ r3 ใน m1 เรียกใช้ r4 ใน m2 รุ่น (ตามที่อธิบายไว้ใน ล้างข้อมูล) m1 และเผยแพร่ m2

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

ใน Android 10 ขึ้นไป ในกรณีที่มี การดำเนินการด้วยโมเดลที่จัดเตรียมไว้เดียวกัน ดำเนินการตามลำดับอย่างรวดเร็ว ลูกค้าอาจเลือกใช้การดำเนินการ วัตถุระเบิดเพื่อสื่อสารระหว่างการทำงานของแอปและไดรเวอร์ สำหรับข้อมูลเพิ่มเติม ดูข้อมูลได้ที่ Burst Executions และ Fast Message Queues

เพื่อปรับปรุงประสิทธิภาพสำหรับการดำเนินการหลายครั้งต่อเนื่องกันอย่างรวดเร็ว ผู้ขับขี่ สามารถเก็บบัฟเฟอร์ชั่วคราวหรือเพิ่มอัตรานาฬิกา กำลังสร้าง Watchdog ขอแนะนำให้เทรดปล่อยทรัพยากรหากไม่มีการสร้างคำขอใหม่หลังจาก ระยะเวลาที่กำหนด

รูปร่างเอาต์พุต

สำหรับคำขอที่ตัวถูกดำเนินการเอาต์พุตอย่างน้อย 1 รายการไม่มีมิติข้อมูลทั้งหมด ไดรเวอร์ต้องระบุรายการรูปร่างเอาต์พุตที่มีฟังก์ชัน ข้อมูลมิติข้อมูลสำหรับตัวถูกดำเนินการของเอาต์พุตแต่ละรายการหลังการดำเนินการ สำหรับข้อมูลเพิ่มเติม ข้อมูลเกี่ยวกับมิติข้อมูล โปรดดู OutputShape

หากการดำเนินการไม่สำเร็จเนื่องจากมีบัฟเฟอร์เอาต์พุตขนาดเล็ก ไดรเวอร์ต้อง ระบุว่าตัวถูกดำเนินการของเอาต์พุตใดมีขนาดบัฟเฟอร์ไม่เพียงพอในรายการ และควรรายงานข้อมูลด้านมิติให้มากที่สุดเท่าที่จะเป็นไปได้ ใช้ศูนย์สำหรับมิติข้อมูลที่ไม่รู้จัก

ช่วงเวลา

ใน Android 10 แอปจะขอการดำเนินการได้ เวลาที่แอป ได้ระบุอุปกรณ์เครื่องเดียวที่จะใช้ในระหว่างกระบวนการคอมไพล์ สำหรับ ดูรายละเอียดได้ที่ MeasureTiming และการค้นพบและการกำหนดอุปกรณ์ ในกรณีนี้ ไดรเวอร์ NN HAL 1.2 ต้องวัดระยะเวลาการดำเนินการหรือรายงาน UINT64_MAX (เพื่อ แสดงว่าไม่มีระยะเวลา) เมื่อดำเนินการตามคำขอ ผู้ขับขี่ ควรลดผลกระทบด้านประสิทธิภาพใดๆ ซึ่งเกิดจากการวัดการดำเนินการ

คนขับรายงานระยะเวลาต่อไปนี้เป็นไมโครวินาทีใน Timing โครงสร้าง:

  • เวลาดำเนินการในอุปกรณ์: ไม่รวมเวลาดำเนินการใน ซึ่งทำงานบนโปรเซสเซอร์โฮสต์
  • เวลาดำเนินการในไดรเวอร์: รวมเวลาดำเนินการในอุปกรณ์

ระยะเวลาเหล่านี้ต้องรวมเวลาเมื่อการดำเนินการถูกระงับ ตัวอย่างเช่น เมื่อการดำเนินการนั้นถูกขัดจังหวะชั่วคราวโดยงานอื่น หรือเมื่อ กำลังรอให้แหล่งข้อมูลพร้อมใช้งาน

เมื่อคนขับไม่ได้ถูกขอให้วัดระยะเวลาการดำเนินการ หรือเมื่อ แต่มีข้อผิดพลาดในการดำเนินการ ผู้ขับขี่ต้องรายงานระยะเวลาเป็น UINT64_MAX แม้ว่าพนักงานขับรถจะถูกขอให้วัดปริมาณการประหารชีวิตก็ตาม แต่สามารถรายงานเวลา UINT64_MAX ในอุปกรณ์ หรือเวลาใน หรือทั้ง 2 อย่าง เมื่อผู้ขับขี่รายงานระยะเวลาทั้งสองเป็นค่าอื่นที่ไม่ใช่ UINT64_MAX เวลาดำเนินการในไดรเวอร์ต้องเท่ากับหรือเกินเวลาบน อุปกรณ์

การดำเนินการแบบจำกัด

ใน Android 11 นั้น NNAPI อนุญาตการดำเนินการเพื่อรอ รายการแฮนเดิล sync_fence และแสดงผลออบเจ็กต์ sync_fence หรือไม่ก็ได้ จะได้รับสัญญาณเมื่อการดำเนินการเสร็จสมบูรณ์ ซึ่งช่วยลดค่าใช้จ่ายสำหรับ โมเดลลำดับและกรณีการใช้งานสตรีมมิง การดำเนินการแบบ Fenced ยังช่วยเพิ่ม ความสามารถในการทำงานร่วมกับคอมโพเนนต์อื่นๆ ที่มีประสิทธิภาพซึ่งสามารถส่งสัญญาณหรือรอให้ sync_fence ดูข้อมูลเพิ่มเติมเกี่ยวกับ sync_fence ได้ที่ เฟรมเวิร์กการซิงค์

ในการดำเนินการแบบจำกัด เฟรมเวิร์กนี้ IPreparedModel::executeFenced ในการเรียกใช้การดำเนินการแบบ Fenced แบบไม่พร้อมกันบนโมเดลที่เตรียมไว้ เวกเตอร์ของขีดจำกัดการซิงค์เพื่อรอ หากงานแบบไม่พร้อมกันเสร็จก่อน การเรียกกลับมา แฮนเดิลที่ว่างเปล่าสำหรับ sync_fence ได้ CANNOT TRANSLATE ต้องส่งคืนออบเจ็กต์ IFencedExecutionCallback ด้วยเพื่อให้เฟรมเวิร์ก เพื่อค้นหาข้อมูลสถานะข้อผิดพลาดและระยะเวลา

หลังจากการดำเนินการเสร็จสมบูรณ์ จะมี 2 สิ่งต่อไปนี้ ค่า timing การวัดระยะเวลาของการดำเนินการ สามารถค้นหาได้จาก IFencedExecutionCallback::getExecutionInfo

  • timingLaunched: ระยะเวลาตั้งแต่ตอนที่เรียก executeFenced ถึงเมื่อ executeFenced ส่งสัญญาณ syncFence ที่แสดงผล
  • timingFenced: ระยะเวลานับตั้งแต่ที่รั้วซิงค์ทั้งหมด ที่การรอเรียกใช้จะได้รับสัญญาณเมื่อมีสัญญาณ executeFenced syncFence ที่แสดงผล

ควบคุมโฟลว์

สำหรับอุปกรณ์ที่ใช้ Android 11 ขึ้นไป NNAPI ประกอบด้วยการดำเนินการขั้นตอนการควบคุม 2 รายการคือ IF และ WHILE ที่ใช้โมเดลอื่นๆ เป็นอาร์กิวเมนต์ และดำเนินการอย่างมีเงื่อนไข (IF) หรือซ้ำๆ (WHILE) สำหรับ ข้อมูลเพิ่มเติมเกี่ยวกับวิธีใช้สิ่งนี้ โปรดดู ควบคุมโฟลว์

คุณภาพของการบริการ

ใน Android 11 NNAPI ประกอบด้วยคุณภาพที่ดีขึ้นของ บริการ (QoS) โดยการอนุญาตให้แอประบุลำดับความสำคัญที่เกี่ยวข้องของบริการ ระยะเวลาสูงสุดที่คาดไว้ในการเตรียมโมเดล และ ระยะเวลาสูงสุดที่คาดไว้เพื่อให้การดำเนินการเสร็จสมบูรณ์ สำหรับ ข้อมูลเพิ่มเติม โปรดดู คุณภาพของการบริการ

ทำความสะอาดข้อมูล

เมื่อแอปใช้โมเดลที่เตรียมเสร็จแล้ว เฟรมเวิร์กจะเผยแพร่ มีการอ้างอิงถึง @1.3::IPreparedModel ออบเจ็กต์ เมื่อไม่มีการอ้างอิงออบเจ็กต์ IPreparedModel แล้ว โดยอัตโนมัติในบริการไดรเวอร์ที่สร้างรหัสดังกล่าว เฉพาะรุ่น ในขณะนี้คุณสามารถเรียกคืนทรัพยากรได้ในกรณีที่ผู้ขับขี่ใช้ ผู้ทำลาย หากบริการไดรเวอร์ต้องการให้ออบเจ็กต์ IPreparedModel เป็น ถูกทำลายโดยอัตโนมัติเมื่อไคลเอ็นต์ไม่จำเป็นต้องใช้อีกต่อไป แท็กนั้นจะต้องไม่เก็บ การอ้างอิงไปยังออบเจ็กต์ IPreparedModel หลังออบเจ็กต์ IPreparedeModel ได้รับการส่งคืนผ่านทาง IPreparedModelCallback::notify_1_3

การใช้ CPU

ไดรเวอร์ควรใช้ CPU เพื่อตั้งค่าการคำนวณ ผู้ขับขี่ไม่ควร ใช้ CPU ในการคำนวณกราฟ เนื่องจากจะรบกวน ความสามารถของเฟรมเวิร์กในการจัดสรรงานอย่างถูกต้อง คนขับควรรายงาน ที่จัดการกับเฟรมเวิร์กไม่ได้ และให้เฟรมเวิร์กจัดการ พักผ่อน

เฟรมเวิร์กนี้จะมีการใช้ CPU สำหรับการดำเนินการ NNAPI ทั้งหมด ยกเว้น การดำเนินการที่กำหนดโดยผู้ให้บริการ สำหรับข้อมูลเพิ่มเติม โปรดดู ส่วนขยายผู้ให้บริการ

การดำเนินการที่เปิดตัวใน Android 10 (API ระดับ 29) ติดตั้ง CPU อ้างอิงเพื่อยืนยันการทดสอบ CTS และ VTS เท่านั้น ถูกต้อง การติดตั้งใช้งานที่เพิ่มประสิทธิภาพซึ่งรวมอยู่ในแมชชีนเลิร์นนิงบนอุปกรณ์เคลื่อนที่ แนะนำให้ใช้เฟรมเวิร์กมากกว่าการใช้ CPU ของ NNAPI

ฟังก์ชันยูทิลิตี

ฐานของโค้ด NNAPI มีฟังก์ชันยูทิลิตีที่ไดรเวอร์สามารถใช้ได้ บริการต่างๆ

frameworks/ml/nn/common/include/Utils.h มีฟังก์ชันยูทิลิตีต่างๆ เช่น ฟังก์ชันที่ใช้สำหรับบันทึกและ สำหรับการแปลงระหว่าง NN HAL เวอร์ชันต่างๆ

  • วิดีโอบล็อก: VLOG คือมาโคร Wrapper รอบๆ LOG ของ Android ซึ่งจะ จะบันทึกข้อความหากมีการตั้งค่าแท็กที่เหมาะสมใน debug.nn.vlog initVLogMask() ต้องถูกเรียกก่อนที่จะเรียกไปยัง VLOG มาโคร VLOG_IS_ON สามารถ ใช้เพื่อตรวจสอบว่า VLOG เปิดใช้อยู่ในขณะนี้หรือไม่ ซึ่งเป็นการเปิดใช้การบันทึกที่ซับซ้อน รหัสเพื่อให้ข้ามได้ถ้าไม่จำเป็น ค่าของพร็อพเพอร์ตี้ต้องเป็น ดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้

    • สตริงว่างซึ่งบ่งชี้ว่าไม่ต้องบันทึก
    • โทเค็น 1 หรือ all ซึ่งบ่งชี้ว่าต้องบันทึกทั้งหมด
    • รายการแท็ก โดยคั่นด้วยเว้นวรรค คอมมา หรือโคลอน เพื่อระบุว่าต้องบันทึกข้อมูลใด แท็กคือ compilation cpuexe, driver, execution, manager และ model
  • compliantWithV1_*: แสดงผล true หากแปลงออบเจ็กต์ NN HAL ได้ ไปยัง HAL เวอร์ชันเดียวกัน โดยไม่สูญเสียข้อมูล สำหรับ เช่น การเรียก compliantWithV1_0 ใน V1_2::Model จะแสดงผล false หาก โมเดลนี้มีประเภทการดำเนินการที่ใช้ใน NN HAL 1.1 หรือ NN HAL 1.2

  • convertToV1_*: แปลงออบเจ็กต์ NN HAL จากเวอร์ชันหนึ่งเป็นอีกเวอร์ชันหนึ่ง ระบบจะบันทึกคำเตือนหาก Conversion ส่งผลให้ข้อมูลสูญหาย ( คือ หากเวอร์ชันใหม่ของประเภทไม่สามารถแทนค่าได้ครบถ้วน)

  • ความสามารถ: nonExtensionOperandPerformance และ update สามารถช่วยสร้าง Capabilities::operandPerformance ด้วย

  • กำลังค้นหาพร็อพเพอร์ตี้ของประเภท: isExtensionOperandType, isExtensionOperationType nonExtensionSizeOfData nonExtensionOperandSizeOfData nonExtensionOperandTypeIsScalar tensorHasUnspecifiedDimensions

frameworks/ml/nn/common/include/ValidateHal.h ไฟล์มีฟังก์ชันยูทิลิตีสำหรับการตรวจสอบว่าออบเจ็กต์ NN HAL ถูกต้อง ตามข้อกำหนดของเวอร์ชัน HAL

  • validate*: แสดงผล true หากออบเจ็กต์ NN HAL ถูกต้อง ตามข้อกำหนดของเวอร์ชัน HAL ประเภท OEM และประเภทส่วนขยาย ยังไม่ได้ตรวจสอบ ตัวอย่างเช่น validateModel จะแสดงผล false หากพารามิเตอร์ โมเดลมีการดำเนินการที่อ้างอิงดัชนีตัวถูกดำเนินการที่ไม่ ที่มีอยู่ หรือการดำเนินการที่ไม่รองรับในเวอร์ชัน HAL ดังกล่าว

frameworks/ml/nn/common/include/Tracing.h มีมาโครเพื่อให้เพิ่มได้ง่ายขึ้น ข้อมูล systracing เป็นโค้ดโครงข่ายระบบประสาทเทียม ตัวอย่างเช่น ดูการเรียกมาโคร NNTRACE_* ใน ไดรเวอร์ตัวอย่าง

frameworks/ml/nn/common/include/GraphDump.h ไฟล์มีฟังก์ชันยูทิลิตีเพื่อถ่ายโอนเนื้อหาของ Model ในรูปแบบกราฟิก ฟอร์มสำหรับแก้ไขข้อบกพร่อง

  • graphDump: เขียนการนำเสนอโมเดลใน Graphviz (.dot) จัดรูปแบบเป็นสตรีมที่ระบุ (หากมี) หรือไปยัง Logcat (หากระบุ) ไม่ได้ให้สตรีม)

การตรวจสอบความถูกต้อง

หากต้องการทดสอบการใช้งาน NNAPI ให้ใช้การทดสอบ VTS และ CTS ที่รวมอยู่ใน เฟรมเวิร์กของ Android VTS ทำงานกับคนขับของคุณโดยตรง (โดยไม่ใช้ ของเฟรมเวิร์ก) ขณะที่ CTS ดำเนินการผ่านเฟรมเวิร์กโดยอ้อม เหล่านี้ ทดสอบเมธอด API แต่ละเมธอด และตรวจสอบว่าการดำเนินการทั้งหมดที่รองรับโดย ไดรเวอร์ทำงานได้อย่างถูกต้อง และแสดงผลลัพธ์ที่เป็นไปตามข้อกำหนดความถูกต้องแม่นยำ

ข้อกำหนดความแม่นยำใน CTS และ VTS สำหรับ NNAPI มีดังนี้

  • จุดลอย: abs(คาดหวัง - จริง) <= atol + rtol * abs(คาดหวัง); โดยมี

    • สำหรับ fp32, atol = 1e-5f, rtol = 5.0f * 1.1920928955078125e-7
    • สำหรับ fp16 atol = rtol = 5.0f * 0.0009765625f
  • วัดปริมาณ: ปิดทีละรายการ (ยกเว้น mobilenet_quantized ทีละ 3)

  • บูลีน: การทำงานแบบตรงทั้งหมด

วิธีหนึ่งของการทดสอบ CTS NNAPI คือการสร้างกราฟเชิงสุ่มแบบตายตัว ที่ใช้ในการทดสอบและเปรียบเทียบผลการปฏิบัติการจากคนขับแต่ละคนกับ การใช้การอ้างอิง NNAPI สำหรับไดรเวอร์ที่มี NN HAL 1.2 ขึ้นไป หาก ผลลัพธ์ไม่เป็นไปตามเกณฑ์ความแม่นยํา CTS จะรายงานข้อผิดพลาดและบันทึกข้อมูล ไฟล์ข้อมูลจำเพาะสำหรับโมเดลที่ล้มเหลวภายใต้ /data/local/tmp สำหรับการแก้ไขข้อบกพร่อง สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับเกณฑ์ความแม่นยำ โปรดดูที่ TestRandomGraph.cpp และ TestHarness.h

การทดสอบ Fuzz

วัตถุประสงค์ของการทดสอบความไม่แน่นอนคือ เพื่อค้นหาข้อขัดข้อง การยืนยัน การละเมิดหน่วยความจำ หรือลักษณะการทำงานทั่วไปที่ไม่ระบุในโค้ดภายใต้การทดสอบเนื่องจากปัจจัยต่างๆ เช่น ข้อมูลที่ไม่คาดคิด สำหรับการทดสอบ NNAPI Fuzz นั้น Android ใช้การทดสอบที่ยึดตาม libFuzzer ซึ่งเป็น มีประสิทธิภาพในการกระจายข้อมูล เนื่องจากใช้ความครอบคลุมของกรณีการทดสอบก่อนหน้านี้เพื่อ สร้างอินพุตแบบสุ่มใหม่ ตัวอย่างเช่น libFuzzer สนับสนุนกรอบการทดสอบที่ทำงาน เกี่ยวกับโค้ดใหม่ๆ ได้ วิธีนี้ช่วยลดเวลาในการทดสอบในการค้นหา โค้ดที่เป็นปัญหา

หากต้องการดำเนินการทดสอบ Fuzz เพื่อตรวจสอบการใช้งานไดรเวอร์ ให้แก้ไข frameworks/ml/nn/runtime/test/android_fuzzing/DriverFuzzTest.cpp ในยูทิลิตีการทดสอบ libneuralnetworks_driver_fuzzer ที่พบใน AOSP เพื่อรวม รหัสไดรเวอร์ โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับการทดสอบ NNAPI Fuzz ที่ frameworks/ml/nn/runtime/test/android_fuzzing/README.md

ความปลอดภัย

เนื่องจากกระบวนการของแอปจะสื่อสารกับกระบวนการของผู้ขับโดยตรง ผู้ขับขี่ต้องตรวจสอบความถูกต้องของอาร์กิวเมนต์ของการเรียกที่ได้รับ การตรวจสอบความถูกต้องนี้ ได้รับการยืนยันโดย VTS รหัสการตรวจสอบอยู่ใน frameworks/ml/nn/common/include/ValidateHal.h

ไดรเวอร์ควรตรวจสอบด้วยว่าแอปจะไม่รบกวนแอปอื่นๆ เมื่อใช้อุปกรณ์เดียวกัน

ชุดทดสอบแมชชีนเลิร์นนิงของ Android

ชุดทดสอบแมชชีนเลิร์นนิงของ Android (MLTS) เป็นเกณฑ์มาตรฐาน NNAPI ที่รวมอยู่ใน CTS และ VTS สำหรับการตรวจสอบความถูกต้องของโมเดลจริงในอุปกรณ์ของผู้ให้บริการ เพื่อเปรียบเทียบผลของเวลาในการตอบสนองและความแม่นยำ และเปรียบเทียบปัจจัยที่ขับเคลื่อนวงการ ผลลัพธ์ที่มี ผลลัพธ์โดยใช้ TF Lite ที่ทำงานอยู่บน CPU สำหรับโมเดลและชุดข้อมูลเดียวกัน เพื่อให้แน่ใจว่าผู้ขับจะไม่มีความแม่นยำ แย่กว่าการใช้การอ้างอิง CPU

นักพัฒนาแพลตฟอร์ม Android ยังใช้ MLTS ในการประเมินเวลาในการตอบสนองและความแม่นยำด้วย ของผู้ขับขี่ได้

ดูการเปรียบเทียบ NNAPI ได้จาก 2 โปรเจ็กต์ใน AOSP ดังนี้

โมเดลและชุดข้อมูล

การเปรียบเทียบ NNAPI ใช้โมเดลและชุดข้อมูลต่อไปนี้

  • MobileNetV1 Float และ u8 ที่ควอนตัมในขนาดต่างๆ รันกับ ส่วนย่อยขนาดเล็ก (1,500 ภาพ) ของ Open Images Dataset v4
  • MobileNetV2 Float และ u8 ที่ควอนตัมในขนาดที่ต่างกัน รันกับ ส่วนย่อยขนาดเล็ก (1,500 ภาพ) ของ Open Images Dataset v4
  • โมเดลเสียงสำหรับการอ่านออกเสียงข้อความที่อิงตามหน่วยความจำระยะสั้น (LSTM) ที่ทำงานกับชุดย่อยของ CMU อาร์กติก
  • โมเดลอะคูสติกจาก LSTM สำหรับการรู้จำคำพูดอัตโนมัติวิ่งแข่ง กลุ่มย่อยเล็กๆ ของชุดข้อมูล LibriSpeech

สำหรับข้อมูลเพิ่มเติม โปรดดู platform/test/mlts/models

การทดสอบความเครียด

ชุดทดสอบแมชชีนเลิร์นนิงของ Android มีชุดการทดสอบข้อขัดข้อง ตรวจสอบความยืดหยุ่นของผู้ขับขี่เมื่อเจอสภาวะการใช้งานหนักหรือในมุมถนน กรณีของลูกค้า พฤติกรรมของคุณ

การทดสอบข้อขัดข้องทั้งหมดจะมีฟีเจอร์ต่อไปนี้

  • การตรวจหาการค้าง: หากไคลเอ็นต์ NNAPI ค้างระหว่างการทดสอบ การทดสอบล้มเหลวโดยมีเหตุผลที่ล้มเหลว HANG และชุดทดสอบ ย้ายไปยังการทดสอบถัดไป
  • การตรวจจับข้อขัดข้องของไคลเอ็นต์ NNAPI: การทดสอบที่รอดพ้นจากข้อขัดข้องและการทดสอบของไคลเอ็นต์ ล้มเหลวโดยมีเหตุผลความล้มเหลว CRASH
  • การตรวจจับการชน: การทดสอบสามารถตรวจจับการชนของคนขับ ที่ทำให้การเรียก NNAPI ล้มเหลว โปรดทราบว่าอาจเกิดข้อขัดข้องใน กระบวนการในไดรเวอร์ที่ไม่ทำให้ NNAPI ล้มเหลวและไม่ทำให้เกิดการทดสอบ ล้มเหลว ขอแนะนำให้เรียกใช้ tail เพื่อรองรับความล้มเหลวประเภทนี้ ในบันทึกระบบเพื่อหาข้อผิดพลาดหรือข้อขัดข้องที่เกี่ยวกับไดรเวอร์
  • การกำหนดเป้าหมายของ Accelerator ที่มีอยู่ทั้งหมด: การทดสอบจะทำงานกับ ของผู้ขับที่พร้อมใช้งาน

การทดสอบข้อขัดข้องทั้งหมดมีผลลัพธ์ที่เป็นไปได้ 4 อย่างดังต่อไปนี้

  • SUCCESS: ดำเนินการเสร็จสมบูรณ์โดยไม่มีข้อผิดพลาด
  • FAILURE: ดำเนินการไม่สำเร็จ โดยทั่วไปจะเกิดจากความล้มเหลว ในการทดสอบโมเดล ซึ่งบ่งชี้ว่าไดรเวอร์ไม่สามารถคอมไพล์หรือปฏิบัติการ โมเดล
  • HANG: ขั้นตอนการทดสอบไม่ตอบสนอง
  • CRASH: ขั้นตอนการทดสอบขัดข้อง

ดูข้อมูลเพิ่มเติมเกี่ยวกับการทดสอบภาวะวิกฤตและรายการทั้งหมดของการทดสอบข้อขัดข้องได้ที่ platform/test/mlts/benchmark/README.txt

ใช้ MLTS

วิธีใช้ MLTS

  1. เชื่อมต่ออุปกรณ์เป้าหมายกับเวิร์กสเตชันและตรวจสอบว่า เข้าถึงได้ผ่าน adb ส่งออกอุปกรณ์เป้าหมาย ANDROID_SERIAL ตัวแปรสภาพแวดล้อมหากมีการเชื่อมต่ออุปกรณ์มากกว่า 1 เครื่อง
  2. cd ลงในไดเรกทอรีแหล่งที่มาระดับบนสุดของ Android

    source build/envsetup.sh
    lunch aosp_arm-userdebug # Or aosp_arm64-userdebug if available.
    ./test/mlts/benchmark/build_and_run_benchmark.sh
    

    เมื่อสิ้นสุดการทำงานเปรียบเทียบ ผลลัพธ์จะแสดงเป็นหน้า HTML และส่งไปยัง xdg-open

สำหรับข้อมูลเพิ่มเติม โปรดดู platform/test/mlts/benchmark/README.txt

เวอร์ชัน HAL ของโครงข่ายระบบประสาทเทียม

ส่วนนี้จะอธิบายการเปลี่ยนแปลงที่เริ่มใช้ใน Android และ Neural เวอร์ชัน HAL ของเครือข่าย

Android 11

Android 11 เปิดตัว NN HAL 1.3 ซึ่งรวมถึง ดังต่อไปนี้

  • รองรับการวัดปริมาณ 8 บิตที่มีการรับรองใน NNAPI เพิ่ม TENSOR_QUANT8_ASYMM_SIGNED ประเภทตัวถูกดำเนินการ ไดรเวอร์ที่มี NN HAL 1.3 ที่สนับสนุน การดำเนินการที่มีการวัดปริมาณที่ไม่มีการรับรองต้องรองรับตัวแปรที่ลงนามด้วย ของการดำเนินการเหล่านั้น เมื่อใช้เวอร์ชันส่วนใหญ่ที่มีการรับรองและไม่มีการรับรอง การดำเนินการเชิงปริมาณ ตัวขับเคลื่อนจะต้องให้ผลลัพธ์เดียวกันสูงสุด เป็น 128 ข้อกำหนดนี้มีข้อยกเว้น 5 ข้อ ได้แก่ CAST HASHTABLE_LOOKUP, LSH_PROJECTION, PAD_V2 และ QUANTIZED_16BIT_LSTM การดำเนินการ QUANTIZED_16BIT_LSTM ไม่รองรับตัวถูกดำเนินการที่ลงชื่อและ การดำเนินการอื่นๆ อีก 4 รายการรองรับการวัดปริมาณที่ลงนามแล้ว แต่ไม่ต้องใช้ ให้เหมือนกันได้
  • การสนับสนุนสำหรับการดำเนินการแบบจำกัดซึ่งเฟรมเวิร์กเรียกใช้ IPreparedModel::executeFenced ในการเรียกใช้การดำเนินการแบบ Fenced แบบไม่พร้อมกันบนโมเดลที่เตรียมไว้ เวกเตอร์ของขีดจำกัดการซิงค์เพื่อรอ สำหรับข้อมูลเพิ่มเติม โปรดดู การดำเนินการแบบ Fenced
  • รองรับขั้นตอนการควบคุม เพิ่มการดำเนินการ IF และ WHILE ซึ่งใช้เวลา โมเดลอื่นเป็นอาร์กิวเมนต์และดำเนินการอย่างมีเงื่อนไข (IF) หรือ ซ้ำๆ (WHILE) สำหรับข้อมูลเพิ่มเติม โปรดดู ควบคุมโฟลว์
  • คุณภาพของการบริการ (QoS) ดีขึ้นเนื่องจากแอปสามารถระบุได้ว่า ลำดับความสำคัญของโมเดล ระยะเวลาสูงสุดที่คาดไว้สำหรับ เพื่อเตรียมพร้อม และเวลาสูงสุดที่คาดไว้สำหรับ จะเสร็จสมบูรณ์ สำหรับข้อมูลเพิ่มเติม โปรดดู คุณภาพของการบริการ
  • การรองรับโดเมนหน่วยความจำที่มีอินเทอร์เฟซที่จัดสรรสำหรับ บัฟเฟอร์ที่จัดการโดยคนขับ การดำเนินการนี้ช่วยให้ส่งผ่านความทรงจำที่มากับอุปกรณ์ได้ ข้ามการดำเนินการต่างๆ การยับยั้งการคัดลอกและการเปลี่ยนรูปแบบข้อมูลที่ไม่จำเป็น ระหว่างการปฏิบัติการติดต่อกัน กับคนขับรถคนเดียวกัน สำหรับข้อมูลเพิ่มเติม ดูโดเมนของหน่วยความจำ

Android 10

Android 10 เปิดตัว NN HAL 1.2 ซึ่งรวมถึง ดังต่อไปนี้

  • โครงสร้าง Capabilities มีข้อมูลทุกประเภทรวมถึงสเกลาร์ ประเภทข้อมูล และแสดงประสิทธิภาพที่ไม่ผ่อนคลายโดยใช้เวกเตอร์ มากกว่าฟิลด์ที่มีชื่อ
  • เมธอด getVersionString และ getType ทำให้เฟรมเวิร์กสามารถ เรียกดูข้อมูลประเภทอุปกรณ์ (DeviceType) และข้อมูลเวอร์ชัน โปรดดู การค้นหาและการให้สิทธิ์อุปกรณ์
  • โดยค่าเริ่มต้น ระบบจะเรียกเมธอด executeSynchronously เพื่อดำเนินการ แบบซิงโครนัส เมธอด execute_1_2 จะบอกเฟรมเวิร์กให้ ดำเนินการไม่พร้อมกัน ดูการดำเนินการ
  • พารามิเตอร์ MeasureTiming กับ executeSynchronously, execute_1_2, และการดำเนินการแบบต่อเนื่อง (Burst Execution) เป็นการระบุว่าไดรเวอร์นั้นจะวัดการดำเนินการหรือไม่ ผลลัพธ์จะได้รับการรายงานในโครงสร้าง Timing โปรดดู ช่วงเวลา
  • การรองรับการดำเนินการที่ตัวถูกดำเนินการเอาต์พุตอย่างน้อย 1 รายการมีค่าที่ไม่รู้จัก มิติข้อมูลหรืออันดับ ดูรูปร่างเอาต์พุต
  • การรองรับส่วนขยายของผู้ให้บริการ ซึ่งเป็นคอลเล็กชันที่ผู้ให้บริการกำหนด การดำเนินการและประเภทข้อมูล ผู้ขับขี่รายงานส่วนขยายที่สนับสนุนผ่าน เมธอด IDevice::getSupportedExtensions โปรดดู ส่วนขยายผู้ให้บริการ
  • ความสามารถของวัตถุระเบิดในการควบคุมชุดการดำเนินการแบบต่อเนื่องโดยใช้ คิวข้อความด่วน (FMQ) สำหรับสื่อสารระหว่างแอปและคนขับ กระบวนการต่างๆ ซึ่งช่วยลดเวลาในการตอบสนอง โปรดดู Burst Executions และ Fast Message Queues
  • การรองรับ A hardwareBuffer เพื่อช่วยให้คนขับดำเนินการ โดยไม่ต้องคัดลอกข้อมูล โปรดดู Aฮาร์ดแวร์Buffer
  • ปรับปรุงการรองรับการแคชอาร์ติแฟกต์สำหรับการคอมไพล์เพื่อลดเวลา ซึ่งใช้สำหรับคอมไพล์เมื่อแอปเริ่มทำงาน โปรดดู การแคชการรวบรวม

Android 10 ขอแนะนำประเภทตัวถูกดำเนินการต่อไปนี้และ

  • ประเภทตัวดำเนินการ

    • ANEURALNETWORKS_BOOL
    • ANEURALNETWORKS_FLOAT16
    • ANEURALNETWORKS_TENSOR_BOOL8
    • ANEURALNETWORKS_TENSOR_FLOAT16
    • ANEURALNETWORKS_TENSOR_QUANT16_ASYMM
    • ANEURALNETWORKS_TENSOR_QUANT16_SYMM
    • ANEURALNETWORKS_TENSOR_QUANT8_SYMM
    • ANEURALNETWORKS_TENSOR_QUANT8_SYMM_PER_CHANNEL
  • การดำเนินการ

    • ANEURALNETWORKS_ABS
    • ANEURALNETWORKS_ARGMAX
    • ANEURALNETWORKS_ARGMIN
    • ANEURALNETWORKS_AXIS_ALIGNED_BBOX_TRANSFORM
    • ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_LSTM
    • ANEURALNETWORKS_BIDIRECTIONAL_SEQUENCE_RNN
    • ANEURALNETWORKS_BOX_WITH_NMS_LIMIT
    • ANEURALNETWORKS_CAST
    • ANEURALNETWORKS_CHANNEL_SHUFFLE
    • ANEURALNETWORKS_DETECTION_POSTPROCESSING
    • ANEURALNETWORKS_EQUAL
    • ANEURALNETWORKS_EXP
    • ANEURALNETWORKS_EXPAND_DIMS
    • ANEURALNETWORKS_GATHER
    • ANEURALNETWORKS_GENERATE_PROPOSALS
    • ANEURALNETWORKS_GREATER
    • ANEURALNETWORKS_GREATER_EQUAL
    • ANEURALNETWORKS_GROUPED_CONV_2D
    • ANEURALNETWORKS_HEATMAP_MAX_KEYPOINT
    • ANEURALNETWORKS_INSTANCE_NORMALIZATION
    • ANEURALNETWORKS_LESS
    • ANEURALNETWORKS_LESS_EQUAL
    • ANEURALNETWORKS_LOG
    • ANEURALNETWORKS_LOGICAL_AND
    • ANEURALNETWORKS_LOGICAL_NOT
    • ANEURALNETWORKS_LOGICAL_OR
    • ANEURALNETWORKS_LOG_SOFTMAX
    • ANEURALNETWORKS_MAXIMUM
    • ANEURALNETWORKS_MINIMUM
    • ANEURALNETWORKS_NEG
    • ANEURALNETWORKS_NOT_EQUAL
    • ANEURALNETWORKS_PAD_V2
    • ANEURALNETWORKS_POW
    • ANEURALNETWORKS_PRELU
    • ANEURALNETWORKS_QUANTIZE
    • ANEURALNETWORKS_QUANTIZED_16BIT_LSTM
    • ANEURALNETWORKS_RANDOM_MULTINOMIAL
    • ANEURALNETWORKS_REDUCE_ALL
    • ANEURALNETWORKS_REDUCE_ANY
    • ANEURALNETWORKS_REDUCE_MAX
    • ANEURALNETWORKS_REDUCE_MIN
    • ANEURALNETWORKS_REDUCE_PROD
    • ANEURALNETWORKS_REDUCE_SUM
    • ANEURALNETWORKS_RESIZE_NEAREST_NEIGHBOR
    • ANEURALNETWORKS_ROI_ALIGN
    • ANEURALNETWORKS_ROI_POOLING
    • ANEURALNETWORKS_RSQRT
    • ANEURALNETWORKS_SELECT
    • ANEURALNETWORKS_SIN
    • ANEURALNETWORKS_SLICE
    • ANEURALNETWORKS_SPLIT
    • ANEURALNETWORKS_SQRT
    • ANEURALNETWORKS_TILE
    • ANEURALNETWORKS_TOPK_V2
    • ANEURALNETWORKS_TRANSPOSE_CONV_2D
    • ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_LSTM
    • ANEURALNETWORKS_UNIDIRECTIONAL_SEQUENCE_RNN

Android 10 มาพร้อมกับการอัปเดตต่างๆ การปรับปรุงมีดังนี้ เกี่ยวข้องกับสิ่งต่อไปนี้เป็นหลัก

  • การสนับสนุนรูปแบบหน่วยความจำ NCHW
  • การสนับสนุนสำหรับ Tensor ที่มีอันดับต่ำกว่า 4 ใน Softmax และ การดำเนินการแปลงรูปแบบมาตรฐาน
  • รองรับอาการปวดเมื่อยล้า
  • การรองรับอินพุตที่มีการวัดปริมาณแบบผสมใน ANEURALNETWORKS_CONCATENATION

รายการด้านล่างแสดงการดำเนินการที่มีการแก้ไขใน Android 10 สำหรับแบบเต็ม ดูรายละเอียดการเปลี่ยนแปลงได้ที่ OperationCode ในเอกสารอ้างอิง NNAPI

  • ANEURALNETWORKS_ADD
  • ANEURALNETWORKS_AVERAGE_POOL_2D
  • ANEURALNETWORKS_BATCH_TO_SPACE_ND
  • ANEURALNETWORKS_CONCATENATION
  • ANEURALNETWORKS_CONV_2D
  • ANEURALNETWORKS_DEPTHWISE_CONV_2D
  • ANEURALNETWORKS_DEPTH_TO_SPACE
  • ANEURALNETWORKS_DEQUANTIZE
  • ANEURALNETWORKS_DIV
  • ANEURALNETWORKS_FLOOR
  • ANEURALNETWORKS_FULLY_CONNECTED
  • ANEURALNETWORKS_L2_NORMALIZATION
  • ANEURALNETWORKS_L2_POOL_2D
  • ANEURALNETWORKS_LOCAL_RESPONSE_NORMALIZATION
  • ANEURALNETWORKS_LOGISTIC
  • ANEURALNETWORKS_LSH_PROJECTION
  • ANEURALNETWORKS_LSTM
  • ANEURALNETWORKS_MAX_POOL_2D
  • ANEURALNETWORKS_MEAN
  • ANEURALNETWORKS_MUL
  • ANEURALNETWORKS_PAD
  • ANEURALNETWORKS_RELU
  • ANEURALNETWORKS_RELU1
  • ANEURALNETWORKS_RELU6
  • ANEURALNETWORKS_RESHAPE
  • ANEURALNETWORKS_RESIZE_BILINEAR
  • ANEURALNETWORKS_RNN
  • ANEURALNETWORKS_ROI_ALIGN
  • ANEURALNETWORKS_SOFTMAX
  • ANEURALNETWORKS_SPACE_TO_BATCH_ND
  • ANEURALNETWORKS_SPACE_TO_DEPTH
  • ANEURALNETWORKS_SQUEEZE
  • ANEURALNETWORKS_STRIDED_SLICE
  • ANEURALNETWORKS_SUB
  • ANEURALNETWORKS_SVDF
  • ANEURALNETWORKS_TANH
  • ANEURALNETWORKS_TRANSPOSE

Android 9

NN HAL 1.1 เปิดตัวใน Android 9 และมีฟีเจอร์ต่อไปนี้ การเปลี่ยนแปลง

  • IDevice::prepareModel_1_1 มี ExecutionPreference พารามิเตอร์ คนขับสามารถใช้ป้ายนี้เพื่อปรับการเตรียมพร้อมรถ โดยจะทราบว่า แอปต้องการประหยัดแบตเตอรี่หรือจะใช้งานโมเดล ในการโทรติดต่อกันอย่างรวดเร็ว
  • มีการเพิ่มการดำเนินการใหม่ 9 รายการ ได้แก่ BATCH_TO_SPACE_ND, DIV, MEAN PAD, SPACE_TO_BATCH_ND, SQUEEZE, STRIDED_SLICE, SUB, TRANSPOSE
  • แอประบุให้เรียกใช้การคำนวณแบบลอย 32 บิตได้ โดยใช้ช่วงจำนวนลอยตัว 16 บิตและ/หรือความแม่นยำในการตั้งค่า Model.relaxComputationFloat32toFloat16 ไปยัง true Capabilities struct มีช่องเพิ่มเติมเป็น relaxedFloat32toFloat16Performance เพื่อให้คนขับรายงานประสิทธิภาพที่ผ่อนคลายของตนต่อเฟรมเวิร์กได้

Android 8.1

โครงข่ายระบบประสาทเทียม HAL (1.0) รุ่นแรกเปิดตัวแล้วใน Android 8.1 สำหรับข้อมูลเพิ่มเติม ดูข้อมูลได้ที่ /neuralnetworks/1.0/