gem5-NVDLA adalah versi khusus gem5-RTL yang dirancang untuk digunakan dengan model NVDLA verilog. Untuk kerangka gem5+RTL yang menjadi dasar proyek ini, lihat repo aslinya gem5-RTL. Di sini kami menampilkan kutipan untuk gem5+RTL, tetapi kami telah menulis ulang proses instalasi agar lebih ramah bagi pendatang baru.
Selain adaptasi khusus sistem memori gem5 untuk NVDLA, proyek ini juga memungkinkan konversi dari model caffe NN yang didukung NVDLA ke jejak transaksi register NVDLA (yaitu, seperti input.txn di sini). Kode dan detail penggunaan utilitas konversi ini dapat ditemukan di bsc-util/nvdla_utilities
.
NVDLA (NVIDIA Deep Learning Accelerator) adalah utilitas lengkap yang menunjukkan cara kerja akselerator tingkat industri. Dengan dihentikannya pemeliharaan pada tahun 2018, publik dapat membuatnya berfungsi mulai dari kompilasi hingga runtime. Sebelumnya satu-satunya cara untuk menjalankan NVDLA adalah dengan membuat instance pada FPGA dan menjalankan NN secara fisik, menggunakan compiler dan runtime yang disediakan dengan NVDLA. Namun, hal ini membuat arsitek memori tidak dapat menjelajahi subsistem memori dalam sistem akselerator AI, karena memerlukan simulator untuk mendapatkan statistik dengan konfigurasi memori yang berbeda. Tujuan dari repo ini adalah untuk menjembatani kesenjangan ini. Di satu sisi, ini mengintegrasikan solusi untuk semua bug dan penggunaan tidak terdokumentasi yang diperlukan untuk menjalankan compiler NVDLA, runtime, dan platform virtual. Di sisi lain, ia memberikan kemampuan baru untuk menjalankan NVDLA dalam simulator, yaitu menerapkan algoritma penjadwalan, alokasi SPM, dan mekanisme prefetching, yang memungkinkan eksplorasi lebih lanjut dengan NVDLA.
Di sini kami mencantumkan struktur kode selain kerangka gem5:
ext/rtl/model_nvdla/
menyertakan kelas pembungkus NVDLA dan SPM tertanam ( wrapper_nvdla.cc
) dan logika konversi antara paket gem5 dan permintaan NVDLA AXI ( axiResponder.cc
);src/rtl/rtlNVDLA.cc
menempatkan perilaku NVDLA sebagai objek permata5, misalnya mengirim dan menerima permintaan memori;src/dev/dma_nvdla.cc
menjelaskan perilaku mesin DMA;bsc-util/
menempatkan semua penjadwal untuk menjalankan NVDLA dalam simulasi;bsc-util/nvdla_utilities/
menempatkan semua hal yang berhubungan dengan kompilasi untuk NVDLA, termasuk skrip kompilasi NVDLA tunggal dan multi-NVDLA.bsc-util/nvdla_utilities/sweep/
menyertakan skrip untuk sapuan parameter dan pengumpulan data.bsc-util/nvdla_utilities/example_usage/
menyertakan model caffe, jejak register yang dikompilasi & file log lainnya untuk beberapa kasus pengujian, dan contoh file json konfigurasi parameter.Menjalankan simulasi di lingkungan buruh pelabuhan sangat disarankan karena menghemat waktu dan tenaga untuk menginstal dependensi. Namun, karena persyaratan lingkungan berikut, kami dihadapkan pada kesulitan untuk mengintegrasikan seluruh aliran (yaitu, mengkompilasi Caffe NN ke dalam jejak register NVDLA, pembuatan titik simulasi, dan simulasi) ke dalam satu gambar buruh pelabuhan, sehingga perintah harus dijalankan dari 2 lingkungan buruh pelabuhan yang berbeda serta mesin host dengan hak istimewa sudo:
edwinlai99/advp
;edwinlai99/gem5_nvdla_env
). Untungnya, kami menyediakan gambar buruh pelabuhan dengan semua dependensi terinstal dan skrip satu langkah untuk setiap fase (dan juga langkah-langkah untuk membuat gambar buruh pelabuhan ini di bsc-util/nvdla_utilities/BUILD.md
), sehingga upaya manual dapat diminimalkan. Di seluruh repo, setiap contoh perintah akan diawali dengan (docker_image_name)#
atau $
untuk membedakan lingkungan yang sedang berjalan. Baris yang hanya memiliki simbol #
adalah komentar.
Gurobi perlu digunakan pada mesin host, dan kemudian memodifikasi jalur di bsc-util/nvdla_utilities/match_reg_trace_addr/CVSRAMAlloc/Makefile
. Jika tidak diinstal, strategi activation-pinning dan mixed-pinning tidak dapat berjalan dengan baik.
Kami sangat menyarankan untuk menempatkan gem5-nvdla/
dan gem5_linux_images/
tepat di bawah direktori ~/
sehingga jalur dalam perintah di bawah dan variabel jalur dalam gambar buruh pelabuhan bawaan kami tidak memerlukan modifikasi tambahan. Jika tidak, silakan periksa file root/.bashrc
di wadah 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
Karena kerangka kerja ini berjalan dalam mode sistem penuh gem5, kita perlu menyiapkan kernel linux dan image disk. Salah satu pilihannya adalah menggunakan yang disediakan dalam binari gem5 doc ARM fs. Atur file yang diunduh dalam hierarki di bawah ini:
~/
|-- gem5_linux_images/
|-- ubuntu-18.04-arm64-docker.img
|-- aarch-system-20220707/
|-- binaries/
|-- disks/
......
Jika gem5_linux_images
tidak diletakkan tepat di bawah direktori ~/
:
default_kernel
dan default_disk
di configs/example/arm/fs_bigLITTLE_RTL.py
juga harus berubah.M5_PATH
di /root/.bashrc
di gambar buruh pelabuhan gem5_nvdla_env
. Setiap kali container baru dibuat, variabel ini harus diubah, atau tetap menggunakan container yang sama.nvdla_utilities/sweep/main.py
harus diubah. Beban kerja NVDLA disimulasikan dalam mode sistem penuh permata5, jadi harus ada biner CPU yang memanggil akselerator. Arsitektur yang digunakan untuk simulasi berbasis ARM, sehingga diperlukan kompilasi silang. Biner, yang kode sumbernya ada di bsc-util/*.c
, harus dikompilasi silang dengan aarch64-linux-gnu-g++-9
. Selain itu, file perakitan ( util/m5/src/abi/arm64/m5op.S
) yang mendefinisikan operasi khusus gem5 juga harus dikompilasi silang. Jadi seseorang dapat mengkompilasinya secara terpisah ke dalam *.o dan menghubungkannya bersama-sama. Contoh proses kompilasi adalah:
# 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 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
Perhatikan perintah di bawah ini akan menulis file ke dalam image disk di 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
dan Kumpulkan Hasil $ 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 ~/
Beberapa hasil yang mendekati tabel di bawah ini diinginkan:
sapu_id | aktifkan DMA | tambahkan-accel-private-cache | gunakan-palsu-mem | pft-aktifkan | nvdla_cycles[0] | siklus_memori[0] |
---|---|---|---|---|---|---|
0 | PALSU | PALSU | PALSU | BENAR | 113221 | 76946 |
1 | PALSU | PALSU | BENAR | BENAR | 71137 | 0 |
2 | PALSU | BENAR | PALSU | BENAR | 89407 | 48231 |
3 | BENAR | PALSU | PALSU | BENAR | 73459 | 31553 |
Untuk beban kerja lain yang diberikan dalam contoh kita, langkah 5-6 harus dilakukan lagi untuk beban kerja tersebut. Jika NN baru akan dikompilasi, Silakan lihat juga bagian "Kompilasi NN Tunggal" dan "Kompilasi NN Multibatch Pipelined". Bagi pengguna yang ingin menyesuaikan rantai alat kami, silakan merujuk ke bsc-util/nvdla_utilities/BUILD.md
.
Kerangka kerja kami memberikan kinerja simulasi yang jauh lebih baik (kecepatan simulasi 18x-22x) dibandingkan gem5-rtl dan alur verifikasi verilator NVDLA asli, mendekati kinerja model C-nya. Di bawah pengaturan memori yang ideal, Resnet-50 dapat disimulasikan dalam waktu 2 jam. Pengoptimalan kami meliputi:
ext/rtl/model_nvdla/verilator_nvdla/axiResponder.hh
);-O3
ke kompilasi .v
-> .cpp
menggunakan verilator;-O3 -Ofast
ke .cpp
-> .a
kompilasi menggunakan dentang;.cpp
-> .a
kompilasi menggunakan dentang (peningkatan ekstra 40%);-Ofast
ke kompilasi gem5.fast
; Bagian ini menyediakan proses untuk menghasilkan file di 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/
Kemudian file log dan jejak register *.txn
akan muncul di /home/nvdla/traces/lenet/
.
Repo kami menyediakan penjadwal yang dapat memetakan beberapa kumpulan tugas inferensi NN dari satu model ke beberapa NVDLA yang disimulasikan. Skrip ini, pipeline_compile.py
, membantu mengkompilasi beberapa file prototxt secara bersamaan. Skrip ini mengharapkan pengguna untuk secara manual membagi Caffe NN menjadi beberapa file *.prototxt
( *.caffemodel
tidak perlu dimodifikasi), yang masing-masing sesuai dengan tahapan pipeline. File .prototxt
ini harus diberikan ke skrip dalam urutan tahapan alur. Pengguna diharapkan menggunakan subkelas PipelineRemapper
di match_reg_trace_addr/remap.py
saat melakukan pemindaian parameter untuk beban kerja yang disalurkan. Lihat di bawah untuk penggunaan:
$ 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/
Jika Anda menggunakan CLion sebagai IDE, Anda dapat:
configs/
-> tandai direktori sebagai -> Paket Python Namespace.~/gem5-nvdla/configs/
dan ~/gem5-nvdla/src/python/
ke PYTHONPATH.MIT