gem5-NVDLA — это специализированная версия gem5-RTL, предназначенная для использования с моделью verilog NVDLA. Фреймворк 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 и физический запуск NN на борту, используя компилятор и среду выполнения, поставляемые с NVDLA. Однако это лишает архитекторов памяти возможности исследовать подсистему памяти в системах ускорителей искусственного интеллекта, поскольку им требуется симулятор для получения статистики с другой конфигурацией памяти. Целью этого репо является устранение этого разрыва. С одной стороны, он объединяет решения для всех недокументированных ошибок и использований, необходимых для запуска компилятора NVDLA, среды выполнения и виртуальной платформы. С другой стороны, он предоставляет новые возможности для запуска NVDLA в симуляторе, т. е. применять алгоритмы планирования, механизмы распределения SPM и предварительной выборки, что позволяет проводить дальнейшие исследования с помощью NVDLA.
Здесь мы перечисляем структуру кодов, не считая скелета gem5:
ext/rtl/model_nvdla/
включает класс-оболочку NVDLA и встроенный SPM ( wrapper_nvdla.cc
), а также логику преобразования между пакетами gem5 и запросами AXI NVDLA ( 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-файлов конфигурации параметров очистки.Настоятельно рекомендуется запускать моделирование в среде Docker, поскольку это экономит время и усилия по установке зависимостей. Однако из-за следующих требований к среде мы сталкиваемся с трудностями при интеграции всего процесса (т. е. компиляции NN Caffe в трассировку регистров NVDLA, создание точки моделирования и моделирование) в один образ докера, поэтому команды приходится запускать из 2 разные среды докера, а также хост-компьютер с привилегиями 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/
прямо в каталог ~/
, чтобы пути в приведенных ниже командах и переменные пути в наших готовых образах 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
в образе докера gem5_nvdla_env
. Каждый раз, когда создается экземпляр нового контейнера, эту переменную следует изменять или продолжать использовать тот же контейнер.nvdla_utilities/sweep/main.py
следует изменить. Рабочие нагрузки NVDLA моделируются в полносистемном режиме gem5, поэтому должен быть двоичный файл ЦП, который вызывает ускорители. Архитектура, используемая для моделирования, основана на 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 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 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-включить | добавить-ускорение-частный-кэш | использовать-фальшивую-память | 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 можно смоделировать за 2 часа. Наши оптимизации включают в себя:
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 одной модели на несколько смоделированных 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.~/gem5-nvdla/configs/
и ~/gem5-nvdla/src/python/
в PYTHONPATH.Массачусетский технологический институт