ไดรเวอร์ Neural Networks API

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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโครงข่ายประสาท API ดู โครงข่ายประสาท API

โครงข่ายประสาท HAL

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

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

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

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

การเริ่มต้น

ในการเริ่มต้นกรอบ queries โปรแกรมควบคุมสำหรับความสามารถในการใช้ IDevice::getCapabilities_1_3 @1.3::Capabilities โครงสร้างรวมถึงทุกชนิดข้อมูลและแสดงให้เห็นถึงประสิทธิภาพการทำงาน nonrelaxed ใช้เวกเตอร์

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

เพื่อตรวจสอบค่าที่ส่งกลับขับรถในการตอบสนองต่อ IDevice::getCapabilities_1_3 ใช้แอปพลิเค NNAPI มาตรฐานในการวัดประสิทธิภาพสำหรับชนิดข้อมูลที่สอดคล้องกัน MobileNet V1 และ V2, asr_float และ tts_float แบบจำลองจะแนะนำสำหรับการวัดประสิทธิภาพการทำงานสำหรับ 32 บิตค่า floating point และ MobileNet V1 และ V2 ไทรุ่นมีการแนะนำสำหรับ 8 บิต quantized ค่า สำหรับข้อมูลเพิ่มเติมโปรดดูที่ Android เครื่อง Test Suite การเรียนรู้

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

ในฐานะที่เป็นส่วนหนึ่งของกระบวนการเริ่มต้นกรอบอาจสอบถามข้อมูลเพิ่มเติมโดยใช้ IDevice::getType , IDevice::getVersionString , IDevice:getSupportedExtensions และ IDevice::getNumberOfCacheFilesNeeded

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

รวบรวม

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

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

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

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

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

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

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

การดำเนินการ

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

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

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

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

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

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

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

คำขอหลายรายการสามารถเริ่มต้นในแบบคู่ขนานที่เดียวกัน @1.3::IPreparedModel ไดรเวอร์สามารถดำเนินการตามคำขอในแบบคู่ขนานหรือทำให้การดำเนินการเป็นอนุกรม

กรอบงานสามารถขอให้คนขับเก็บแบบจำลองที่เตรียมไว้ไว้มากกว่าหนึ่งแบบ ยกตัวอย่างเช่นการเตรียมความพร้อมรุ่น m1 เตรียม m2 , ดำเนินการร้องขอ r1 บน m1 รัน r2 บน m2 รัน r3 บน m1 รัน r4 ใน m2 ปล่อย (อธิบายไว้ใน Cleanup ) m1 และปล่อย m2

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

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

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

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

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

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

เวลา

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

ไดรเวอร์รายงานระยะเวลาต่อไปนี้ใน microseconds ใน Timing โครงสร้าง:

  • เวลาปฏิบัติการบนอุปกรณ์: ไม่รวมเวลาดำเนินการในการขับรถที่ทำงานบนหน่วยประมวลผลโฮสต์
  • เวลาดำเนินการในไดรเวอร์: รวมเวลาปฏิบัติการบนอุปกรณ์

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

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

ประหารชีวิต

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

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

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

  • timingLaunched : ระยะเวลาจากเมื่อ executeFenced เรียกว่าเมื่อ executeFenced สัญญาณกลับ syncFence
  • timingFenced : ระยะเวลาจากเมื่อทุกรั้วซิงค์ที่รอการดำเนินการสำหรับกำลังส่งสัญญาณเมื่อ executeFenced สัญญาณกลับ syncFence

ควบคุมการไหล

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

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

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

ทำความสะอาด

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

การใช้งานซีพียู

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

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

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

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

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

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

  • วิดีโอบล็อก: VLOG เป็นแมโครห่อหุ้มรอบของ Android LOG ว่ามีเพียงบันทึกข้อความถ้าแท็กที่เหมาะสมตั้งอยู่ใน 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 หรือ 1.2 NN HAL

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

  • ความสามารถในการ 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 มีดังนี้:

  • จุดลอยตัว: เอบีเอส (ที่คาดไว้ - ที่เกิดขึ้นจริง) <= ATOL + rtol * เอบีเอส (คาดว่า); ที่ไหน:

    • สำหรับ fp32, atol = 1e-5f, rtol = 5.0f * 1.1920928955078125e-7
    • สำหรับ fp16 atol = rtol = 5.0f * 0.0009765625f
  • ไท: ปิดโดยหนึ่ง (ยกเว้น mobilenet_quantized ซึ่งถูกปิดโดยสาม)

  • บูลีน: แข่งขันที่แน่นอน

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

การทดสอบคลุมเครือ

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

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

ความปลอดภัย

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

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

ชุดทดสอบการเรียนรู้ของเครื่อง Android

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

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

เกณฑ์มาตรฐาน NNAPI สามารถพบได้ในสองโครงการใน AOSP:

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

เกณฑ์มาตรฐาน NNAPI ใช้โมเดลและชุดข้อมูลต่อไปนี้

  • MobileNetV1 float และ u8 ถูกหาปริมาณในขนาดต่างๆ กัน ทำงานกับชุดย่อยขนาดเล็ก (1500 ภาพ) ของ Open Images Dataset v4.0
  • MobileNetV2 float และ u8 ถูกหาปริมาณในขนาดต่างๆ กัน ทำงานกับชุดย่อยขนาดเล็ก (1500 ภาพ) ของ Open Images Dataset v4.0
  • โมเดลอคูสติกที่ใช้หน่วยความจำระยะสั้น (LSTM) สำหรับการแปลงข้อความเป็นคำพูด ใช้กับชุดย่อยขนาดเล็กของชุด CMU Arctic
  • โมเดลอะคูสติกที่ใช้ LSTM สำหรับการรู้จำคำพูดอัตโนมัติ ใช้กับชุดข้อมูล LibriSpeech ชุดย่อยเล็กๆ

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

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

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

การทดสอบการชนทั้งหมดมีคุณสมบัติดังต่อไปนี้:

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

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

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

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

ใช้ MLTS

ในการใช้ MLTS:

  1. เชื่อมต่ออุปกรณ์เป้าหมายเวิร์กสเตชันของคุณและให้แน่ใจว่ามันสามารถเข้าถึงได้ผ่าน adb ส่งออกอุปกรณ์เป้าหมาย ANDROID_SERIAL ตัวแปรสภาพแวดล้อมหากอุปกรณ์มากกว่าหนึ่งมีการเชื่อมต่อ
  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

Neural Networks รุ่น HAL

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

Android 11

Android 11 เปิดตัว NN HAL 1.3 ซึ่งรวมถึงการเปลี่ยนแปลงที่โดดเด่นดังต่อไปนี้

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

Android 10

Android 10 เปิดตัว NN HAL 1.2 ซึ่งรวมถึงการเปลี่ยนแปลงที่โดดเด่นดังต่อไปนี้

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

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
  • รองรับเทนเซอร์ที่มีอันดับแตกต่างจาก 4 ในการดำเนินการ softmax และการทำให้เป็นมาตรฐาน
  • รองรับการบิดงอ
  • สนับสนุนปัจจัยการผลิตที่มี quantization ผสมใน 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 พารามิเตอร์ คนขับสามารถใช้สิ่งนี้เพื่อปรับการเตรียมการ โดยรู้ว่าแอพต้องการประหยัดแบตเตอรี่หรือจะใช้งานโมเดลในการโทรต่อเนื่องกันอย่างรวดเร็ว
  • เก้าการดำเนินงานใหม่ได้รับการเพิ่ม: 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

Neural Networks HAL (1.0) เริ่มต้นใน Android 8.1 สำหรับข้อมูลเพิ่มเติมโปรดดูที่ /neuralnetworks/1.0/