Deepfreeze เป็นเครื่องมือที่ใช้สำหรับการสร้างแบบจำลอง PPA และสร้าง RTL สำหรับ โครงการ Fixynn สคริปต์รวมอยู่ในการสร้าง RTL จากกราฟ Tensorflow และเพื่อสังเคราะห์/จำลองการออกแบบนั้น ในการทำงานกับกราฟที่ไม่ได้รับสัมผัสคุณต้องเขียนโครงสร้างข้อมูลเลเยอร์ของคุณเองเพื่อป้อนไปยังวัตถุ veriloggenerator (ดูจุดสิ้นสุดของ gen_verliog.py
ตัวอย่างการใช้งาน)
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Fixynn รวมถึงคำอธิบายของ Deepfreeze ในบริบทดูบทความต่อไปนี้: Fixynn: ฮาร์ดแวร์ที่มีประสิทธิภาพสำหรับการมองเห็นคอมพิวเตอร์มือถือผ่านการเรียนรู้การถ่ายโอน
เครื่องมือนี้ถูกสร้างและทดสอบโดยใช้ Python 2.7.15 และ TensorFlow 1.10.1
แพ็คเกจ Python ที่ต้องการคือ numpy และ tensorflow ในการติดตั้ง:
pip install numpy tensorflow
cd deep_freeze/
bash run.sh
ในการเพิ่มโมเดลสำหรับการสร้างหรือการสร้างแบบจำลอง RTL คุณต้องให้:
mobilenet_base
ส่งคืนใน https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet/mobilenet.py)แต่ละเลเยอร์ในเครือข่ายคงที่จะถูกกำหนดโดยโมดูล Verilog ที่สร้างขึ้นหรือการสร้างพารามิเตอร์แบบอินสแตนซ์ของโมดูลที่เขียนด้วยลายมือ เลเยอร์ใด ๆ ที่มีตัวแปรฝึกอบรมได้ถูกสร้างขึ้นและอื่น ๆ ทั้งหมดจะถูกสร้างอินสแตนซ์ ตัวแปรที่สามารถฝึกอบรมได้นั้นจะถูกเข้ารหัสอย่างหนักใน RTL ด้วยความแม่นยำของตัวแปรและนำไปใช้ในการออกแบบสังเคราะห์เป็นสเกลาร์คงที่ สิ่งที่จะนำไปใช้ในหน่วย MAC ในเครื่องเร่งความเร็วที่ตั้งโปรแกรมได้นั้นประกอบด้วยสเกลาร์คงที่ตามด้วยต้นไม้ adder แบบพกพาในการออกแบบน้ำหนักคงที่ นี่เป็นพลังงานที่มีประสิทธิภาพมาก แต่ต้องใช้พื้นที่ซิลิคอนขนาดใหญ่ พื้นที่ซิลิคอนเติบโตเป็นเส้นตรงกับ nuber ของตัวแปรคงที่
เพื่อให้บรรลุการใช้ประโยชน์จาก Datapaths ที่สูงเราเราจะรวมเลเยอร์ไปป์ไลน์เข้าด้วยกันอย่างเต็มที่ สิ่งนี้ต้องการการเปิดใช้งานบัฟเฟอร์ระหว่างเลเยอร์ เราสามารถหลีกเลี่ยงการบัฟเฟอร์การเปิดใช้งานเลเยอร์ทั้งหมดโดยใช้บัฟเฟอร์บรรทัด บทความนี้ให้คำอธิบายพื้นฐานว่าบัฟเฟอร์บรรทัดและวิธีการใช้งานอย่างไร
การใช้บัฟเฟอร์บรรทัดของเราประกอบด้วยสองส่วน: บัฟเฟอร์ SRAM และบัฟเฟอร์การลงทะเบียน SRAM เก็บการเปิดใช้งานสำหรับแถวให้มากที่สุดเท่าที่จะต้องได้รับการ comsumed ในแต่ละครั้ง (เท่ากับความสูงของเคอร์เนลต่อไปนี้) บัฟเฟอร์การลงทะเบียนจะติดตามบัฟเฟอร์ SRAM และเก็บการเปิดใช้งาน MXN สำหรับเคอร์เนล MXN ต่อไปนี้ สิ่งนี้จะช่วยลดการอ่านที่ไม่จำเป็นจากบัฟเฟอร์ SRAM
ขนาด SRAM ที่จำเป็นสำหรับเลเยอร์คือ IM_HEIGHT * IM_WIDTH * NCHANNELS * NBITS
สิ่งนี้แบ่งออกเป็น IM_HEIGHT * IM_WIDTH
คำขนาด NCHANNELS * NBITS
ขนาดบัฟเฟอร์การลงทะเบียนคือ K_HEIGHT * K_WIDTH * NCHANNELS * NBITS
การแก้ไขเลเยอร์ในฮาร์ดแวร์ให้โอกาสสำหรับการเพิ่มประสิทธิภาพที่หลากหลาย (ทั้งการเพิ่มประสิทธิภาพฮาร์ดแวร์และการปรับให้เหมาะสมในการออกแบบโมเดล)
การปรับปรุงสถาปัตยกรรมเครือข่ายอาจส่งผลให้การปรับปรุง PPA ฮาร์ดแวร์ ตัวอย่างเช่นเลเยอร์ที่แยกออกได้อย่างลึกซึ้งสามารถบรรลุความแม่นยำที่คล้ายกันกับเลเยอร์ convolutional ดั้งเดิมที่มีน้ำหนักน้อยกว่า 8-9x เลเยอร์เหล่านี้ทำงานได้ดีมากใน Fixynn เนื่องจากค่าใช้จ่ายในพื้นที่ลดลง เทคนิคอื่น ๆ ที่ลดขนาดของรุ่นหรือปรับปรุงความแม่นยำสามารถเป็นประโยชน์ต่อ fixynn
การแก้ไขน้ำหนักลงในซิลิคอนช่วยให้เราได้รับประโยชน์จากความซับซ้อนที่ลดลงของค่าบางอย่าง น้ำหนักศูนย์เป็นตัวอย่างหนึ่ง: สามารถลบออกจากฮาร์ดแวร์ได้อย่างชัดเจนโดยไม่มีค่าใช้จ่าย สิ่งนี้ทำให้การตัดแต่งกิ่งมีพลังและน่าสนใจเป็นพิเศษ
นอกจากนี้ค่าที่มีน้ำหนัก hamming ต่ำเช่นจำนวนบิตที่ไม่ใช่ศูนย์ในการเป็นตัวแทนไบนารีของพวกเขามีราคาถูกที่จะนำไปใช้ในฮาร์ดแวร์คงที่ นี่เป็นเพราะสการ์คงที่ถูกนำไปใช้เป็นชุดของการเปลี่ยนแปลงและเพิ่ม ยิ่งบิตที่ไม่เป็นศูนย์น้อยลงของ multiPlicand คงที่การเปลี่ยนแปลงน้อยลงและเพิ่มความต้องการ เครื่องมือการสังเคราะห์ยังสามารถใช้ประโยชน์จากค่าที่มีน้ำหนัก hamming สูงเมื่อเทียบกับจำนวนบิตทั้งหมดที่จำเป็นในการแสดงจำนวน ตัวอย่างเช่นสเกลาร์ x * 239
(น้ำหนัก hamming = 7, nbits = 8) สามารถนำไปใช้เป็น x << 8 - x << 5
ในฮาร์ดแวร์
สำหรับภาพความละเอียดสูงแต่ละแถวของบัฟเฟอร์บรรทัดต้องใช้พื้นที่สำคัญของ SRAM เราสามารถกำจัด SRAM นี้ได้โดยการบัฟเฟอร์เพียงเศษเสี้ยวของเส้นในแต่ละครั้งและทำให้ผ่านภาพหลายภาพ สิ่งนี้มาจากค่าใช้จ่ายของฮาร์ดแวร์ควบคุมที่เพิ่มขึ้นและการคำนวณการเปิดใช้งานที่ซ้ำซ้อนบางอย่างในขอบเขตของช่วงบัฟเฟอร์บรรทัด การคำนวณที่ซ้ำซ้อนนี้มีต้นทุนพลังงานและเวลาแฝงน้อยที่สุดเนื่องจากฮาร์ดแวร์น้ำหนักคงที่มีประสิทธิภาพมาก
เคอร์เนล 1x1 ใด ๆ ไม่จำเป็นต้องใช้บัฟเฟอร์ไว้ล่วงหน้าเพราะสามารถใช้การเปิดใช้งานที่สร้างขึ้นโดยเลเยอร์ก่อนหน้าโดยตรง สิ่งนี้ส่งผลให้เลเยอร์ที่แยกออกได้อย่างลึกซึ้งไม่จำเป็นต้องมีการบัฟเฟอร์ใด ๆ ระหว่างการประชุมเชิงลึกและ pointwise ดังนั้นเราอาจหลอมรวมการดำเนินงานทั้งสองนี้เป็นหนึ่งในบล็อกแคมบิเนชัน
เลเยอร์ Conv2D มีประสิทธิภาพในการออกแบบนี้เพราะพวกเขาแสดงการใช้ซ้ำที่มีน้ำหนักสูงซึ่งส่งผลให้ต้นทุนพื้นที่ค่อนข้างต่ำ ชั้นหนาแน่นไม่แสดงการใช้น้ำหนักซ้ำ ดังนั้นเลเยอร์หนาแน่นจึงส่งผลให้เกิดการใช้พื้นที่อย่างไม่มีประสิทธิภาพ นอกจากนี้เลเยอร์หนาแน่นไม่อนุญาตให้มีการบัฟเฟอร์เส้นซึ่งส่งผลให้พื้นที่ลงทะเบียนค่อนข้างใหญ่
งานของเราสำหรับ SYSML 2019 (ดู sysml_2019/
) สำรวจตัวแยกฟีเจอร์ CNN แบบครบวงจร PPA สำหรับตัวแยกฟีเจอร์นั้นยอดเยี่ยมเพราะมีเลเยอร์ Conv2D เท่านั้น เครือข่ายทั้งหมดที่ใช้ในฮาร์ดแวร์คงที่จะต้องจ่ายค่าใช้จ่ายในพื้นที่ที่ความต้องการของชั้นหนาแน่น สิ่งนี้อาจเป็นที่ยอมรับได้สำหรับรุ่น IoT ขนาดเล็ก
โดยทั่วไปแล้ว CNNs จะแสดงพฤติกรรมที่เลเยอร์ส่วนหน้ามีพิกเซลอินพุตจำนวนมากและเมล็ดจำนวนน้อยในขณะที่เลเยอร์แบ็คเอนด์มีพิกเซลอินพุตน้อยลงและเคอร์เนลจำนวนมาก สิ่งนี้ส่งผลให้พื้นที่ SRAM เข้มข้นไปทางด้านหน้าของไปป์ไลน์เครือข่ายในขณะที่พื้นที่ผสมจะเข้มข้นไปทางด้านหลังของท่อส่งเครือข่าย
เลเยอร์ใด ๆ ที่มีก้าวย่างมากกว่า 1x1 จะสร้างพิกเซลการเปิดใช้งานน้อยกว่าที่ใช้ต่อภาพ ตัวอย่างเช่นเลเยอร์ Pool2D ที่ก้าวหน้า 2x2 เหนือภาพ 100x100 สร้างภาพ 50x50 ซึ่งเป็นการลดลง 4x ในพิกเซล ส่งผลให้เลเยอร์ต่อไปนี้มี 1/4x จำนวนรอบที่ใช้งานอยู่ (แต่ละพิกเซลเอาต์พุตต่อเลเยอร์ต้องใช้ 1 รอบ) ซึ่งหมายความว่าท่อเครือข่ายที่ลึกมากที่มีการสุ่มตัวอย่างจำนวนมากจะถูกคอขวดอย่างมากโดยเลเยอร์ส่วนหน้าทำให้เกิดการใช้ประโยชน์จากชั้นแบ็คเอนด์ต่ำ
ข้อมูลเชิงลึกนี้ช่วยให้เราเลือกรุ่นที่จะแปลเป็นฮาร์ดแวร์ได้ดี สถาปัตยกรรมบางอย่างดำเนินการลดการเปิดใช้งานเพื่อลดเวลาแฝงในซีพียูโดยการลดจำนวน MAC ทั้งหมด (ที่ราคาของขนาดรุ่น) (ดู FD-Mobilenet) โมเดลที่ใช้ใน Fixynn ต้องการทำการแลกเปลี่ยนตรงข้าม: เพื่อลดจำนวนพารามิเตอร์ที่ค่าใช้จ่ายในการคำนวณ (เนื่องจากพื้นที่เป็นข้อ จำกัด หลักของประสิทธิภาพในระบบโลกแห่งความเป็นจริง)
การแก้ไขส่วนหนึ่งของ CNN ในฮาร์ดแวร์ทำให้ยากที่จะนำฮาร์ดแวร์มาใช้ใหม่เพื่อวัตถุประสงค์อื่น งานของเราสำหรับ SYSML 2019 สำรวจการแลกเปลี่ยนนี้และแสดงให้เห็นว่าฮาร์ดแวร์คงที่จำนวนหนึ่งสามารถพูดคุยกับรุ่นที่แตกต่างกันได้หลายรุ่น การทำงานในอนาคตจะมุ่งเน้นไปที่การปรับปรุงการวางนัยทั่วไปของฮาร์ดแวร์คงที่โดยการเพิ่มความสามารถในการโปรแกรม (ในขณะที่ยังคงได้รับประโยชน์จากประสิทธิภาพของฮาร์ดแวร์น้ำหนักคงที่)
SAME
โดยการแก้ไข sram_controller.sv
flatten.sv
เพื่อเปิดใช้งานเครือข่ายการจำแนกรูปภาพแบบกำหนดได้อย่างสมบูรณ์โดยการทำให้ภาพแบนจากเลเยอร์ 2D เป็นเลเยอร์หนาแน่นker_size
ของข้อมูลถูกเขียนไปยัง SRAMงานที่ตีพิมพ์ซึ่งใช้เครื่องมือนี้ได้รับการนำเสนอที่ SYSML 2019 และที่ Neurips 2018 การประชุมเชิงปฏิบัติการ ML On-Device ML กระดาษเต็มสามารถพบได้ใน arxiv ที่ fixynn: ฮาร์ดแวร์ที่มีประสิทธิภาพสำหรับการมองเห็นคอมพิวเตอร์มือถือผ่านการเรียนรู้การถ่ายโอน
หากคุณพบว่า deepfreeze นี้มีประโยชน์สำหรับการวิจัยของคุณโปรดใช้ bibtex ต่อไปนี้เพื่ออ้างอิงเรา
@article{fixynn,
title={FixyNN: Efficient Hardware for Mobile Computer Vision via Transfer Learning},
author={Whatmough, Paul and Zhou, Chuteng and Hansen, Patrick and Venkataramanaiah, Shreyas Kolala and Seo, Jae-Sun and Mattina, Matthew},
journal={SysML},
year={2019}
}
Patrick Hansen, Arm ML Research Lab, Boston, MA
Shreyas Kolala Venkataramanaiah, Arizona State University
Paul WHATMOUGH, ARM ML Research Lab, Boston, MA
โครงการนี้ได้รับใบอนุญาตภายใต้ใบอนุญาต MIT - ดูไฟล์ใบอนุญาตสำหรับรายละเอียด