Gem5-NVDLA هو إصدار متخصص من Gem5-RTL تم تصميمه للاستخدام مع نموذج NVDLA verilog. بالنسبة لإطار عمل Gem5+RTL الذي يعتمد عليه هذا المشروع، راجع الريبو الأصلي الخاص به Gem5-RTL. نعرض هنا اقتباسًا لـ Gem5+RTL، ولكننا قمنا بإعادة كتابة عملية التثبيت لجعلها أكثر ملاءمة للوافدين الجدد.
بصرف النظر عن التكيف المتخصص لنظام ذاكرة Gem5 لـ NVDLA، يتيح هذا المشروع أيضًا التحويل من أي نموذج caffe NN مدعوم من NVDLA إلى تتبعات معاملات تسجيل NVDLA (على سبيل المثال، شيء مثل input.txn هنا). يمكن العثور على الكود والاستخدام التفصيلي لأداة التحويل المساعدة هذه في bsc-util/nvdla_utilities
.
إن NVDLA (NVIDIA Deep Learning Accelerator) عبارة عن أداة مساعدة متكاملة توضح كيفية عمل المسرع على مستوى الصناعة. مع توقف صيانته في عام 2018، أصبح الجمهور بمفردهم لجعله يعمل من التجميع إلى وقت التشغيل. في السابق، كانت الطريقة الوحيدة لتشغيل NVDLA هي إنشاء مثيل على FPGA وتشغيل NNs فعليًا على اللوحة، باستخدام المترجم ووقت التشغيل المقدم مع NVDLA. ومع ذلك، فإن هذا يترك مهندسي الذاكرة غير قادرين على استكشاف النظام الفرعي للذاكرة في أنظمة تسريع الذكاء الاصطناعي، حيث أنهم يحتاجون إلى جهاز محاكاة للحصول على إحصائيات بتكوينات مختلفة للذاكرة. وبالتالي فإن الهدف من هذا الريبو هو سد هذه الفجوة. فمن ناحية، فهو يدمج الحلول لجميع الأخطاء والاستخدامات غير الموثقة المطلوبة لتشغيل مترجم NVDLA ووقت التشغيل والمنصة الافتراضية. ومن ناحية أخرى، فهو يوفر إمكانات جديدة لتشغيل NVDLA في جهاز محاكاة، أي تطبيق خوارزميات الجدولة وتخصيص SPM وآليات الجلب المسبق، مما يتيح المزيد من الاستكشاف باستخدام NVDLA.
ندرج هنا بنية الرموز بصرف النظر عن الهيكل العظمي لـ Gem5:
ext/rtl/model_nvdla/
فئة غلاف NVDLA وSPM المضمن ( wrapper_nvdla.cc
) ومنطق التحويل بين حزم Gem5 وطلبات NVDLA AXI ( axiResponder.cc
)؛src/rtl/rtlNVDLA.cc
سلوك NVDLA ككائن Gem5، على سبيل المثال، إرسال واستقبال طلبات الذاكرة؛src/dev/dma_nvdla.cc
سلوك محرك DMA؛bsc-util/
يضع جميع أدوات الجدولة لاستدعاء NVDLA في المحاكاة؛bsc-util/nvdla_utilities/
يضع كل المواد المتعلقة بالتجميع لـ NVDLA، بما في ذلك نصوص التجميع أحادية NVDLA ومتعددة NVDLA.bsc-util/nvdla_utilities/sweep/
نصوصًا برمجية لعمليات مسح المعلمات وجمع البيانات.bsc-util/nvdla_utilities/example_usage/
نماذج caffe، وآثار تسجيل مجمعة وملفات سجل أخرى لحالات اختبار متعددة، وأمثلة على ملفات json لتكوين المعلمات الشاملة.يوصى بشدة بتشغيل المحاكاة في بيئة عامل إرساء لأنه يوفر الوقت والجهد لتثبيت التبعيات. ومع ذلك، نظرًا لمتطلبات البيئة التالية، نواجه صعوبات في دمج التدفق بالكامل (على سبيل المثال، تجميع Caffe NNs في تتبع تسجيل NVDLA، وإنشاء نقطة المحاكاة، والمحاكاة) في صورة عامل إرساء واحدة، بحيث يجب تشغيل الأوامر من بيئتان مختلفتان لرسو السفن بالإضافة إلى جهاز مضيف بامتياز Sudo:
edwinlai99/advp
؛edwinlai99/gem5_nvdla_env
). لحسن الحظ، نحن نقدم صور عامل الإرساء مع جميع التبعيات المثبتة ونصوص برمجية من خطوة واحدة لكل مرحلة (وأيضًا خطوات إنشاء صور عامل الإرساء هذه في bsc-util/nvdla_utilities/BUILD.md
)، بحيث يمكن تقليل الجهود اليدوية. خلال عملية الريبو بأكملها، سيتم إضافة كل أمر مثال إلى (docker_image_name)#
أو $
لتمييز بيئة التشغيل. الأسطر التي تحتوي على رمز #
فقط هي تعليقات.
يجب استخدام Gurobi على الجهاز المضيف، ثم تعديل المسارات في bsc-util/nvdla_utilities/match_reg_trace_addr/CVSRAMAlloc/Makefile
. إذا لم يتم تثبيتها، فلن تتمكن استراتيجيات التثبيت المختلط والتنشيط بشكل صحيح.
نقترح بشدة وضع gem5-nvdla/
و gem5_linux_images/
مباشرة ضمن الدليل ~/
بحيث لا تحتاج المسارات الموجودة في الأوامر أدناه ومتغيرات المسار في صور عامل الإرساء المعدة مسبقًا إلى تعديل إضافي. إذا لم يكن الأمر كذلك، فيرجى التحقق من الملف 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، يحتاج المرء إلى إعداد نواة لينكس وصورة القرص. أحد الخيارات هو استخدام تلك المتوفرة في ثنائيات 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
في صورة عامل الإرساء 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 $ 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 وجمع النتائج $ 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 ~/
من المرغوب فيه الحصول على بعض النتائج القريبة من الجدول أدناه:
Sweep_id | تمكين dma | إضافة-أكسيل-ذاكرة التخزين المؤقت الخاصة | استخدام ذاكرة وهمية | تمكين pft | nvdla_cycles[0] | دورات الذاكرة[0] |
---|---|---|---|---|---|---|
0 | خطأ شنيع | خطأ شنيع | خطأ شنيع | حقيقي | 113221 | 76946 |
1 | خطأ شنيع | خطأ شنيع | حقيقي | حقيقي | 71137 | 0 |
2 | خطأ شنيع | حقيقي | خطأ شنيع | حقيقي | 89407 | 48231 |
3 | حقيقي | خطأ شنيع | خطأ شنيع | حقيقي | 73459 | 31553 |
بالنسبة لأحمال العمل الأخرى الواردة في الأمثلة، يجب تنفيذ الخطوات من 5 إلى 6 مرة أخرى بالنسبة لعبء العمل هذا. إذا كان سيتم تجميع NN جديد، فيرجى أيضًا الرجوع إلى قسمي "ترجمة NN واحد" و"تجميع NN متعدد الدفعات عبر الأنابيب". بالنسبة للمستخدمين الذين يرغبون في تخصيص سلسلة الأدوات الخاصة بنا، يرجى الرجوع إلى bsc-util/nvdla_utilities/BUILD.md
.
يوفر إطار عملنا أداء محاكاة أفضل بكثير (سرعة محاكاة 18x-22x) من Gem5-rtl وتدفق التحقق الأصلي من NVDLA، مما يقترب من أداء نموذج C الخاص به. وفي ظل إعدادات الذاكرة المثالية، يمكن محاكاة Resnet-50 خلال ساعتين. تتضمن تحسيناتنا ما يلي:
ext/rtl/model_nvdla/verilator_nvdla/axiResponder.hh
)؛-O3
على .v
-> تجميع .cpp
باستخدام verilator؛-O3 -Ofast
على .cpp
-> .a
باستخدام clang؛.cpp
-> .a
التجميع باستخدام clang (تحسين إضافي بنسبة 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 لنموذج واحد على العديد من NVDLAs المحاكاة. يساعد هذا البرنامج النصي، 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.~/gem5-nvdla/configs/
و ~/gem5-nvdla/src/python/
إلى PYTHONPATH.معهد ماساتشوستس للتكنولوجيا