gem5-NVDLA es una versión especializada de gem5-RTL que está diseñada para usarse con el modelo NVDLA verilog. Para conocer el marco gem5+RTL en el que se basa este proyecto, consulte su repositorio original gem5-RTL. Aquí mostramos una cita para gem5+RTL, pero hemos reescrito el proceso de instalación para hacerlo más amigable para los recién llegados.
Además de la adaptación especializada del sistema de memoria gem5 para NVDLA, este proyecto también permite la conversión de cualquier modelo caffe NN compatible con NVDLA a registros de seguimiento de transacciones NVDLA (es decir, algo como input.txn aquí). El código y el uso detallado de esta utilidad de conversión se pueden encontrar en bsc-util/nvdla_utilities
.
NVDLA (NVIDIA Deep Learning Accelerator) es una utilidad completa que demuestra cómo funciona un acelerador a nivel industrial. Dado que su mantenimiento se detuvo en 2018, el público está solo para hacerlo funcionar desde la compilación hasta el tiempo de ejecución. Anteriormente, la única forma de ejecutar NVDLA era crear una instancia en una FPGA y ejecutar NN físicamente en la placa, utilizando el compilador y el tiempo de ejecución proporcionados con NVDLA. Sin embargo, esto deja a los arquitectos de memoria incapaces de explorar el subsistema de memoria en los sistemas aceleradores de IA, ya que requieren un simulador para obtener estadísticas con diferentes configuraciones de memoria. El objetivo de este repositorio es, por tanto, cerrar esta brecha. Por un lado, integra soluciones para todos los errores y usos no documentados necesarios para ejecutar el compilador, el tiempo de ejecución y la plataforma virtual NVDLA. Por otro lado, proporciona nuevas capacidades para ejecutar NVDLA en un simulador, es decir, aplicar algoritmos de programación, asignación de SPM y mecanismos de captación previa, lo que permite una mayor exploración con NVDLA.
Aquí enumeramos la estructura de los códigos además del esqueleto de gem5:
ext/rtl/model_nvdla/
incluye la clase contenedora de NVDLA y SPM integrado ( wrapper_nvdla.cc
) y la lógica de conversión entre paquetes gem5 y solicitudes NVDLA AXI ( axiResponder.cc
);src/rtl/rtlNVDLA.cc
coloca el comportamiento de NVDLA como un objeto gem5, por ejemplo, enviando y recibiendo solicitudes de memoria;src/dev/dma_nvdla.cc
describe el comportamiento del motor DMA;bsc-util/
coloca todos los programadores para invocar NVDLA en simulación;bsc-util/nvdla_utilities/
coloca todos los elementos relacionados con la compilación para NVDLA, incluidos los scripts de compilación de una sola NVDLA y de varias NVDLA.bsc-util/nvdla_utilities/sweep/
incluye scripts para barridos de parámetros y recopilación de datos.bsc-util/nvdla_utilities/example_usage/
incluye modelos de caffe, seguimientos de registros compilados y otros archivos de registro para múltiples casos de prueba, y ejemplos de archivos json de configuración de parámetros de barrido.Se recomienda encarecidamente ejecutar la simulación en un entorno acoplable, ya que ahorra tiempo y esfuerzo para instalar dependencias. Sin embargo, debido a los siguientes requisitos del entorno, nos enfrentamos a dificultades para integrar todo el flujo (es decir, compilar Caffe NN en el seguimiento del registro NVDLA, creación de puntos de simulación y simulación) en una imagen acoplable, por lo que los comandos deben ejecutarse desde 2 entornos acoplables diferentes, así como una máquina host con privilegios sudo:
edwinlai99/advp
;edwinlai99/gem5_nvdla_env
). Afortunadamente, proporcionamos imágenes de Docker con todas las dependencias instaladas y scripts de un solo paso para cada fase (y también pasos para crear estas imágenes de Docker en bsc-util/nvdla_utilities/BUILD.md
), de modo que se puedan minimizar los esfuerzos manuales. A lo largo de todo el repositorio, cada comando de ejemplo tendrá el prefijo (docker_image_name)#
o $
para distinguir el entorno de ejecución. Las líneas con solo el símbolo #
son comentarios.
Gurobi debe usarse en la máquina host y luego modificar las rutas en bsc-util/nvdla_utilities/match_reg_trace_addr/CVSRAMAlloc/Makefile
. Si no están instaladas, las estrategias de fijación de activación y fijación mixta no se pueden ejecutar correctamente.
Recomendamos encarecidamente colocar gem5-nvdla/
y gem5_linux_images/
justo debajo del directorio ~/
para que las rutas en los comandos a continuación y las variables de ruta en nuestras imágenes acoplables prediseñadas no necesiten modificaciones adicionales. De lo contrario, verifique el archivo root/.bashrc
en un contenedor 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
Dado que este marco se ejecuta en modo de sistema completo de gem5, es necesario preparar un kernel de Linux y una imagen de disco. Una opción es utilizar los proporcionados en los binarios ARM fs de gem5 doc. Organice los archivos descargados en una jerarquía a continuación:
~/
|-- gem5_linux_images/
|-- ubuntu-18.04-arm64-docker.img
|-- aarch-system-20220707/
|-- binaries/
|-- disks/
......
Si gem5_linux_images
no se coloca justo debajo del directorio ~/
:
default_kernel
y default_disk
en configs/example/arm/fs_bigLITTLE_RTL.py
también deben cambiar en consecuencia.M5_PATH
en /root/.bashrc
en la imagen acoplable gem5_nvdla_env
. Cada vez que se crea una instancia de un nuevo contenedor, esta variable debe modificarse o seguir usando el mismo contenedor.nvdla_utilities/sweep/main.py
deben cambiarse. Las cargas de trabajo NVDLA se simulan en el modo de sistema completo de gem5, por lo que debería haber un binario de CPU que invoque los aceleradores. La arquitectura utilizada para la simulación está basada en ARM, por lo que es necesaria la compilación cruzada. Los binarios, cuyos códigos fuente están en bsc-util/*.c
, deben compilarse de forma cruzada con aarch64-linux-gnu-g++-9
. Además, también se debe realizar una compilación cruzada de un archivo ensamblador ( util/m5/src/abi/arm64/m5op.S
) que defina las operaciones específicas de gem5. Por lo tanto, se pueden compilar por separado en *.o y vincularlos. Un proceso de compilación de ejemplo sería:
# 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
Tenga en cuenta que los siguientes comandos escribirán archivos en la imagen del disco en 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
y recopilar resultados $ 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 ~/
Se desean algunos resultados cercanos a la tabla siguiente:
barrido_id | habilitar dma | agregar-aceleración-caché-privado | usar-mem-falso | habilitar pft | nvdla_ciclos[0] | ciclos_memoria[0] |
---|---|---|---|---|---|---|
0 | FALSO | FALSO | FALSO | VERDADERO | 113221 | 76946 |
1 | FALSO | FALSO | VERDADERO | VERDADERO | 71137 | 0 |
2 | FALSO | VERDADERO | FALSO | VERDADERO | 89407 | 48231 |
3 | VERDADERO | FALSO | FALSO | VERDADERO | 73459 | 31553 |
Para otras cargas de trabajo proporcionadas en nuestros ejemplos, los pasos 5 y 6 se deben realizar nuevamente para esa carga de trabajo. Si se va a compilar un nuevo NN, consulte también las secciones "Compilar un NN único" y "Compilar un NN multibatch canalizado". Para los usuarios que quieran personalizar nuestra cadena de herramientas, consulte bsc-util/nvdla_utilities/BUILD.md
.
Nuestro marco proporciona un rendimiento de simulación mucho mejor (velocidad de simulación de 18x-22x) que gem5-rtl y el flujo de verificación del verilador NVDLA original, acercándose al rendimiento de su modelo C. Con una configuración de memoria ideal, Resnet-50 se puede simular en 2 horas. Nuestras optimizaciones incluyen:
ext/rtl/model_nvdla/verilator_nvdla/axiResponder.hh
);-O3
a .v
-> compilación .cpp
usando verilator;-O3 -Ofast
a .cpp
-> .a
compilación usando clang;.cpp
-> .a
compilación usando clang (mejora adicional del 40 %);-Ofast
a la compilación de gem5.fast
; Esta sección proporciona el proceso para generar los archivos en 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/
Luego, los archivos de registro y el seguimiento del registro *.txn
aparecerán en /home/nvdla/traces/lenet/
.
Nuestro repositorio proporciona un programador que puede asignar múltiples lotes de tareas de inferencia NN de un solo modelo en múltiples NVDLA simulados. Este script, pipeline_compile.py
, ayuda a compilar varios archivos de protocolo al mismo tiempo. Este script espera que el usuario divida manualmente un Caffe NN en múltiples archivos *.prototxt
(no es necesario modificar el *.caffemodel
), cada uno de los cuales corresponde a una etapa de canalización. Estos archivos .prototxt
deben proporcionarse al script en el orden de las etapas del proceso. Se espera que los usuarios utilicen una subclase de PipelineRemapper
en match_reg_trace_addr/remap.py
al realizar barridos de parámetros para cargas de trabajo canalizadas. Consulte a continuación el uso:
$ 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/
Si utiliza CLion como su IDE, puede:
configs/
-> marcar directorio como -> Paquete de espacio de nombres de Python.~/gem5-nvdla/configs/
y ~/gem5-nvdla/src/python/
a PYTHONPATH.MIT