gem5-NVDLA เป็นเวอร์ชันพิเศษของ gem5-RTL ที่ออกแบบมาเพื่อใช้กับโมเดล NVDLA verilog สำหรับเฟรมเวิร์ก gem5+RTL ที่โปรเจ็กต์นี้ใช้อยู่ โปรดดู repo gem5-RTL ดั้งเดิม ที่นี่เรากำลังแสดงการอ้างอิงสำหรับ gem5+RTL แต่เราได้เขียนกระบวนการติดตั้งใหม่เพื่อให้เป็นมิตรกับผู้ใช้ใหม่มากขึ้น
นอกเหนือจากการดัดแปลงระบบหน่วยความจำ gem5 แบบพิเศษสำหรับ NVDLA แล้ว โปรเจ็กต์นี้ยังช่วยให้สามารถแปลงจากโมเดล caffe NN ใดๆ ที่รองรับ NVDLA ไปเป็นการติดตามธุรกรรมการลงทะเบียน NVDLA (เช่น บางอย่างเช่น input.txn ที่นี่) รหัสและการใช้งานโดยละเอียดของยูทิลิตี้การแปลงนี้สามารถพบได้ใน bsc-util/nvdla_utilities
NVDLA (NVIDIA Deep Learning Accelerator) เป็นยูทิลิตี้แบบฟูลสแตกที่สาธิตวิธีการทำงานของตัวเร่งความเร็วระดับอุตสาหกรรม เนื่องจากการบำรุงรักษาหยุดลงในปี 2018 ประชาชนทั่วไปจึงต้องดำเนินการตั้งแต่การคอมไพล์ไปจนถึงรันไทม์ด้วยตัวเอง ก่อนหน้านี้วิธีเดียวในการรัน NVDLA คือการสร้างอินสแตนซ์บน FPGA และรัน NN บนบอร์ด โดยใช้คอมไพลเลอร์และรันไทม์ที่มาพร้อมกับ NVDLA อย่างไรก็ตาม สิ่งนี้ทำให้สถาปนิกหน่วยความจำไม่สามารถสำรวจระบบย่อยหน่วยความจำในระบบเร่งความเร็ว AI ได้ เนื่องจากพวกเขาต้องการ เครื่องจำลอง เพื่อรับสถิติที่มีการกำหนดค่าหน่วยความจำที่แตกต่างกัน จุดมุ่งหมายของการซื้อคืนนี้คือการลดช่องว่างนี้ ในด้านหนึ่ง เป็นการผสานรวมโซลูชันเข้ากับข้อบกพร่องและการใช้งานที่ไม่มีเอกสารซึ่งจำเป็นในการรันคอมไพเลอร์ รันไทม์ และแพลตฟอร์มเสมือนของ NVDLA ในทางกลับกัน มีความสามารถใหม่ๆ ในการรัน NVDLA ในเครื่องจำลอง เช่น เพื่อใช้อัลกอริธึมการกำหนดเวลา การจัดสรร SPM และกลไกการดึงข้อมูลล่วงหน้า ซึ่งช่วยให้สามารถสำรวจเพิ่มเติมด้วย NVDLA
ที่นี่เราแสดงรายการโครงสร้างของโค้ดนอกเหนือจากโครงกระดูก gem5:
ext/rtl/model_nvdla/
รวมคลาส wrapper ของ NVDLA และ SPM แบบฝัง ( wrapper_nvdla.cc
) และตรรกะของการแปลงระหว่างแพ็กเก็ต gem5 และคำขอ NVDLA AXI ( axiResponder.cc
);src/rtl/rtlNVDLA.cc
ทำให้พฤติกรรมของ NVDLA เป็นอ็อบเจ็กต์ gem5 เช่น การส่งและรับคำขอหน่วยความจำsrc/dev/dma_nvdla.cc
อธิบายพฤติกรรมของกลไก DMAbsc-util/
ใส่ตัวกำหนดเวลาทั้งหมดสำหรับการเรียกใช้ NVDLA ในการจำลองbsc-util/nvdla_utilities/
ใส่เนื้อหาที่เกี่ยวข้องกับการคอมไพล์ทั้งหมดสำหรับ NVDLA รวมถึงสคริปต์การคอมไพล์ single-NVDLA และ multi-NVDLAbsc-util/nvdla_utilities/sweep/
รวมสคริปต์สำหรับการกวาดพารามิเตอร์และการรวบรวมข้อมูลbsc-util/nvdla_utilities/example_usage/
รวมถึงโมเดล caffe, การติดตามรีจิสเตอร์ที่คอมไพล์และไฟล์บันทึกอื่น ๆ สำหรับชุดทดสอบหลายชุด และตัวอย่างไฟล์ json การกำหนดค่าพารามิเตอร์แบบกวาดแนะนำให้รันการจำลองในสภาพแวดล้อมนักเทียบท่า เนื่องจากจะช่วยประหยัดเวลาและความพยายามในการติดตั้งการขึ้นต่อกัน อย่างไรก็ตาม เนื่องจากข้อกำหนดด้านสิ่งแวดล้อมต่อไปนี้ เราเผชิญกับความยากลำบากในการรวมโฟลว์ทั้งหมด (เช่น การรวบรวม Caffe NNs ลงในการติดตามการลงทะเบียน NVDLA การสร้างจุดจำลอง และการจำลอง) ให้เป็นอิมเมจนักเทียบท่าตัวเดียว ดังนั้นคำสั่งจะต้องถูกเรียกใช้จาก สภาพแวดล้อมนักเทียบท่าที่แตกต่างกัน 2 แบบ รวมถึงเครื่องโฮสต์ที่มีสิทธิ์ sudo:
edwinlai99/advp
edwinlai99/gem5_nvdla_env
) โชคดีที่เราจัดเตรียมอิมเมจนักเทียบท่าที่ติดตั้งการอ้างอิงทั้งหมดและสคริปต์ขั้นตอนเดียวสำหรับแต่ละเฟส (และขั้นตอนในการสร้างอิมเมจนักเทียบท่าเหล่านี้ใน bsc-util/nvdla_utilities/BUILD.md
) เพื่อลดความพยายามด้วยตนเองให้เหลือน้อยที่สุด ทั่วทั้ง repo ทั้งหมด แต่ละคำสั่งตัวอย่างจะมีคำนำหน้าด้วย (docker_image_name)#
หรือ $
เพื่อแยกแยะสภาพแวดล้อมที่ทำงานอยู่ บรรทัดที่มีสัญลักษณ์ #
เท่านั้นคือความคิดเห็น
จำเป็นต้องใช้ Gurobi บนเครื่องโฮสต์ จากนั้นแก้ไขเส้นทางใน bsc-util/nvdla_utilities/match_reg_trace_addr/CVSRAMAlloc/Makefile
หากไม่ได้ติดตั้ง กลยุทธ์การปักหมุดการเปิดใช้งานและการปักหมุดแบบผสมจะไม่สามารถทำงานได้อย่างถูกต้อง
เราขอแนะนำอย่างยิ่งให้วาง gem5-nvdla/
และ gem5_linux_images/
ไว้ใต้ไดเร็กทอรี ~/
เพื่อให้เส้นทางในคำสั่งด้านล่างและตัวแปรเส้นทางในอิมเมจ Docker ที่สร้างไว้ล่วงหน้าของเราไม่จำเป็นต้องมีการแก้ไขเพิ่มเติม หากไม่เป็นเช่นนั้น โปรดตรวจสอบไฟล์ root/.bashrc
ในคอนเทนเนอร์ gem5_nvdla_env
$ cd ~/
$ git clone https://github.com/suchandler96/gem5-NVDLA.git
$ mv gem5-NVDLA/ gem5-nvdla # simply a rename
$ mkdir nvdla # to put testcases in the steps afterwards
$ cd gem5-nvdla/
$ mkdir ext/rtl/model_nvdla/verilator_nvdla
$ mkdir mnt
$ git apply ban_git_hook_install_Ofast.patch # to prevent a git_hook bug in case of dubious ownership of the repo
$ docker pull edwinlai99/advp:v1
$ docker pull edwinlai99/gem5_nvdla_env:v3
เนื่องจากเฟรมเวิร์กนี้ทำงานในโหมดเต็มระบบของ gem5 เราจึงต้องเตรียมเคอร์เนล linux และดิสก์อิมเมจ ทางเลือกหนึ่งคือใช้สิ่งที่ให้ไว้ในไบนารี gem5 doc ARM fs จัดระเบียบไฟล์ที่ดาวน์โหลดในลำดับชั้นด้านล่าง:
~/
|-- gem5_linux_images/
|-- ubuntu-18.04-arm64-docker.img
|-- aarch-system-20220707/
|-- binaries/
|-- disks/
......
หากไม่ได้ใส่ gem5_linux_images
ไว้ใต้ไดเร็กทอรี ~/
:
default_kernel
และ default_disk
ใน configs/example/arm/fs_bigLITTLE_RTL.py
ก็ต้องเปลี่ยนแปลงตามลำดับเช่นกันM5_PATH
ใน /root/.bashrc
ในอิมเมจ docker gem5_nvdla_env
แต่ละครั้งที่มีการสร้างอินสแตนซ์คอนเทนเนอร์ใหม่ ตัวแปรนี้ควรได้รับการแก้ไข หรือใช้คอนเทนเนอร์เดิมต่อไปnvdla_utilities/sweep/main.py
ควรมีการเปลี่ยนแปลง ปริมาณงาน NVDLA ได้รับการจำลองในโหมดเต็มระบบของ gem5 ดังนั้นจึงควรมีไบนารีของ CPU ที่เรียกใช้ตัวเร่งความเร็ว สถาปัตยกรรมที่ใช้สำหรับการจำลองเป็นแบบ ARM ดังนั้นการคอมไพล์ข้ามจึงมีความจำเป็น ไบนารีซึ่งมีซอร์สโค้ดอยู่ใน bsc-util/*.c
ควรจะคอมไพล์ข้ามด้วย aarch64-linux-gnu-g++-9
นอกจากนี้ ไฟล์แอสเซมบลี ( util/m5/src/abi/arm64/m5op.S
) ที่กำหนดการดำเนินการเฉพาะ gem5 ก็ควรได้รับการคอมไพล์ข้ามเช่นกัน ดังนั้นจึงอาจคอมไพล์พวกมันแยกกันเป็น *.o และเชื่อมโยงเข้าด้วยกัน กระบวนการรวบรวมตัวอย่างจะเป็น:
# The version of cross-compiling toolchain does not matter very much.
It depends on the user's OS version. Since we are tested on Ubuntu 18.04, gcc-7 is used. But gcc-9 may be more convenient on systems >= 20.04
$ sudo apt install gcc-9-aarch64-linux-gnu g++-9-aarch64-linux-gnu
$ cd gem5-nvdla/bsc-util/
$ aarch64-linux-gnu-g++-9 my_validation_nvdla_single_thread.cpp -c -o my_validation_nvdla_single_thread.o -I../include -fPIC -O3 --static -std=c++11
$ aarch64-linux-gnu-g++-9 ../util/m5/src/abi/arm64/m5op.S -c -o m5op.o -I../include -fPIC -O3 --static -std=c++11
$ aarch64-linux-gnu-g++-9 my_validation_nvdla_single_thread.o m5op.o -o my_validation_nvdla_single_thread -fPIC -O3 --static -std=c++11
$ python3 ../util/gem5img.py mount ~/gem5_linux_images/ubuntu-18.04-arm64-docker.img ../mnt
$ sudo mv my_validation_nvdla_single_thread ../mnt/home/
# ... (do the same thing to pipeline_execute scheduler)
# must move to ../mnt/home/ because bsc-util/nvdla_utilities/sweep/main.py will look for the binaries there
gem5_nvdla_env
Docker Container $ docker run --net=host -v ~/:/home -it --rm edwinlai99/gem5_nvdla_env:v3
(gem5_nvdla_env)# cp /usr/local/nvdla/hw/outdir/nv_full/verilator/VNV_nvdla__ALL.a /home/gem5-nvdla/ext/rtl/model_nvdla/verilator_nvdla/
(gem5_nvdla_env)# cp /usr/local/nvdla/hw/outdir/nv_full/verilator/VNV_nvdla.h /home/gem5-nvdla/ext/rtl/model_nvdla/verilator_nvdla/
(gem5_nvdla_env)# cd /home/gem5-nvdla/ext/rtl/model_nvdla/verilator_nvdla/
(gem5_nvdla_env)# mv VNV_nvdla__ALL.a libVNV_nvdla__ALL.a # rename
(gem5_nvdla_env)# cd /home/gem5-nvdla/
# check Makefile to see the number of threads options before compilation
(gem5_nvdla_env)# make nvdla
(gem5_nvdla_env)# exit
โปรดทราบว่าคำสั่งด้านล่างจะเขียนไฟล์ลงในดิสก์อิมเมจใน gem5_linux_images/
$ mkdir -p ~/nvdla/traces # make a directory to store the simulation files
$ cd ~/gem5-nvdla/bsc-util/nvdla_utilities/sweep/
$ cp -r ../example_usage/traces/lenet ~/nvdla/traces/
$ cp -r ../example_usage/experiments/jsons_tiny/ ~/nvdla/traces/lenet/
$ python3 main.py --jsons-dir ~/nvdla/traces/lenet/jsons_tiny/ --out-dir ~/nvdla/traces/lenet/logs/ --vp-out-dir ~/nvdla/traces/lenet/ --sim-dir /home/lenet/ --model-name lenet --gen-points --num-threads 24 --scheduler my_validation_nvdla_single_thread --home /home
gem5_nvdla_env
Docker Container และรวบรวมผลลัพธ์ $ docker run --net=host -v ~/:/home -it --rm edwinlai99/gem5_nvdla_env:v3
(gem5_nvdla_env)# cd /home/gem5-nvdla/bsc-util/nvdla_utilities/sweep/
(gem5_nvdla_env)# python3 main.py --jsons-dir /home/nvdla/traces/lenet/jsons_tiny/ --out-dir /home/nvdla/traces/lenet/logs/ --vp-out-dir /home/nvdla/traces/lenet/ --sim-dir /home/lenet/ --model-name lenet --run-points --num-threads 24 --scheduler my_validation_nvdla_single_thread
# wait until the simulation ends... It may take roughly 30-60 seconds depending on the computer's performance
(gem5_nvdla_env)# exit
$ cd ~/gem5-nvdla/bsc-util/nvdla_utilities/sweep/
$ python3 get_sweep_stats.py -d ~/nvdla/traces/lenet/logs/ -j ~/nvdla/traces/lenet/jsons_tiny/ -p lenet_test --out-dir ~/
# Then a file named "lenet_test_summary.csv" would appear in ~/
ต้องการผลลัพธ์บางส่วนที่ใกล้กับตารางด้านล่าง:
กวาด_id | dma-เปิดใช้งาน | เพิ่ม-accel-แคชส่วนตัว | ใช้ปลอม mem | เปิดใช้งาน pft | nvdla_cycles[0] | memory_cycles[0] |
---|---|---|---|---|---|---|
0 | เท็จ | เท็จ | เท็จ | จริง | 113221 | 76946 |
1 | เท็จ | เท็จ | จริง | จริง | 71137 | 0 |
2 | เท็จ | จริง | เท็จ | จริง | 89407 | 48231 |
3 | จริง | เท็จ | เท็จ | จริง | 73459 | 31553 |
สำหรับปริมาณงานอื่นๆ ที่ระบุไว้ในตัวอย่างของเรา ควรทำขั้นตอนที่ 5-6 อีกครั้งสำหรับปริมาณงานนั้น หากต้องการคอมไพล์ NN ใหม่ โปรดดูส่วน "คอมไพล์ NN เดี่ยว" และ "คอมไพล์ Pipelined Multibatch NN" สำหรับผู้ใช้ที่ต้องการปรับแต่ง toolchain ของเรา โปรดดูที่ bsc-util/nvdla_utilities/BUILD.md
เฟรมเวิร์กของเราให้ประสิทธิภาพการจำลองที่ดีกว่ามาก (ความเร็วในการจำลอง 18x-22x) มากกว่า gem5-rtl และโฟลว์การตรวจสอบความถูกต้องของ NVDLA ดั้งเดิม ซึ่งเข้าใกล้ประสิทธิภาพของโมเดล C ภายใต้การตั้งค่าหน่วยความจำที่เหมาะสม Resnet-50 สามารถจำลองได้ภายใน 2 ชั่วโมง การเพิ่มประสิทธิภาพของเราประกอบด้วย:
ext/rtl/model_nvdla/verilator_nvdla/axiResponder.hh
)-O3
กับ .v
-> .cpp
การคอมไพล์โดยใช้ verilator-O3 -Ofast
กับ .cpp
-> .a
การคอมไพล์โดยใช้เสียงดังกราว;.cpp
-> .a
การคอมไพล์โดยใช้เสียงดังกราว (ปรับปรุงพิเศษ 40%);-Ofast
กับการรวบรวม gem5.fast
; ส่วนนี้จัดเตรียมกระบวนการในการสร้างไฟล์ใน bsc-util/nvdla_utilities/example_usage/lenet/
$ docker run -it --rm -v ~/:/home edwinlai99/advp:v1
(advp)# cd /home/gem5-nvdla/bsc-util/nvdla_utilities/
(advp)# python3.6 caffe2trace.py --model-name lenet --caffemodel example_usage/caffe_models/lenet/lenet_iter_10000.caffemodel --prototxt example_usage/caffe_models/lenet/Lenet.prototxt --out-dir /home/nvdla/traces/lenet/
จากนั้นไฟล์บันทึกและการติดตามการลงทะเบียน *.txn
/home/nvdla/traces/lenet/
จะปรากฏใน
การซื้อคืนของเรามีตัวกำหนดเวลาที่สามารถแมปงานการอนุมาน NN หลายชุดของโมเดลเดียวไปยัง NVDLA จำลองหลายรายการ สคริปต์นี้ pipeline_compile.py
จึงช่วยในการรวบรวมไฟล์ prototxt หลายไฟล์ในเวลาเดียวกัน สคริปต์นี้คาดหวังให้ผู้ใช้แบ่ง Caffe NN ออกเป็นไฟล์ *.prototxt
หลายไฟล์ด้วยตนเอง (ไม่จำเป็นต้องแก้ไข *.caffemodel
) แต่ละไฟล์สอดคล้องกับขั้นตอนไปป์ไลน์ ควรจัดเตรียมไฟล์ .prototxt
เหล่านี้ให้กับสคริปต์ตามลำดับขั้นตอนไปป์ไลน์ ผู้ใช้ควรใช้คลาสย่อยของ PipelineRemapper
ใน match_reg_trace_addr/remap.py
เมื่อทำการกวาดล้างพารามิเตอร์สำหรับปริมาณงานไปป์ไลน์ ดูด้านล่างสำหรับการใช้งาน:
$ docker run -it --rm -v ~/:/home edwinlai99/advp:v1
(advp)# cd /home/gem5-nvdla/bsc-util/nvdla_utilities/
(advp)# python3.6 pipeline_compile.py --model-name lenet --caffemodel example_usage/caffe_models/lenet/lenet_iter_10000.caffemodel --prototxts /home/gem5-nvdla/bsc-util/nvdla_utilities/example_usage/traces/lenet_pipeline/stage_1/lenet_stage1.prototxt /home/gem5-nvdla/bsc-util/nvdla_utilities/example_usage/traces/lenet_pipeline/stage_2/lenet_stage2.prototxt --out-dir /home/nvdla/traces/lenet_pipeline/
หากคุณใช้ CLion เป็น IDE ของคุณ คุณอาจ:
configs/
-> ทำเครื่องหมายไดเรกทอรีเป็น -> Python Namespace Package~/gem5-nvdla/configs/
และ ~/gem5-nvdla/src/python/
ถึง PYTHONPATHเอ็มไอที