gem5-NVDLA는 NVDLA Verilog 모델과 함께 사용하도록 설계된 gem5-RTL의 특수 버전입니다. 이 프로젝트의 기반이 되는 gem5+RTL 프레임워크는 원래 저장소 gem5-RTL을 참조하세요. 여기에서는 gem5+RTL에 대한 인용문을 보여주지만, 신규 사용자에게 더욱 친숙하게 만들기 위해 설치 프로세스를 다시 작성했습니다.
NVDLA를 위한 gem5 메모리 시스템의 특수 적용 외에도 이 프로젝트는 NVDLA 지원 caffe NN 모델에서 NVDLA 등록 트랜잭션 추적(예: 여기에서는 input.txn과 같은 것)으로의 변환도 가능하게 합니다. 이 변환 유틸리티의 코드와 자세한 사용법은 bsc-util/nvdla_utilities
에서 찾을 수 있습니다.
NVDLA(NVIDIA Deep Learning Accelerator)는 업계 수준의 가속기가 작동하는 방식을 보여주는 풀 스택 유틸리티입니다. 2018년에 유지 관리가 중단되면서 대중은 스스로 컴파일부터 런타임까지 작동하게 되었습니다. 이전에 NVDLA를 실행하는 유일한 방법은 NVDLA와 함께 제공되는 컴파일러와 런타임을 사용하여 FPGA에서 인스턴스화하고 실제로 온보드에서 NN을 실행하는 것이었습니다. 그러나 이로 인해 메모리 설계자는 AI 가속기 시스템에서 메모리 하위 시스템을 탐색할 수 없게 됩니다. 왜냐하면 다른 메모리 구성으로 통계를 얻으려면 시뮬레이터가 필요하기 때문입니다. 따라서 이 저장소의 목적은 이러한 격차를 해소하는 것입니다. 한편으로는 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 파일이 포함되어 있습니다.종속성을 설치하는 데 드는 시간과 노력을 절약할 수 있으므로 Docker 환경에서 시뮬레이션을 실행하는 것이 좋습니다. 그러나 다음과 같은 환경 요구 사항으로 인해 전체 흐름(즉, Caffe NN을 NVDLA 레지스터 추적으로 컴파일, 시뮬레이션 포인트 생성 및 시뮬레이션)을 하나의 도커 이미지로 통합하는 데 어려움이 있으므로 명령은 다음에서 실행해야 합니다. 2개의 서로 다른 Docker 환경 및 sudo 권한이 있는 호스트 머신:
edwinlai99/advp
컨테이너가 필요합니다.edwinlai99/gem5_nvdla_env
컨테이너)이 필요합니다. 다행스럽게도 우리는 모든 종속성이 설치된 도커 이미지와 각 단계에 대한 1단계 스크립트(및 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 이미지의 경로 변수에 추가 수정이 필요하지 않도록 하는 것이 좋습니다. 그렇지 않은 경우 gem5_nvdla_env
컨테이너의 root/.bashrc
파일을 확인하세요.
$ 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
~/
디렉토리 바로 아래에 있지 않은 경우:
configs/example/arm/fs_bigLITTLE_RTL.py
의 전역 변수 default_kernel
및 default_disk
도 이에 따라 변경되어야 합니다.gem5_nvdla_env
도커 이미지의 /root/.bashrc
에서 M5_PATH
변수를 변경합니다. 새 컨테이너가 인스턴스화될 때마다 이 변수를 수정하거나 동일한 컨테이너를 계속 사용해야 합니다.nvdla_utilities/sweep/main.py
에 있는 Argparse 인수 "disk_image"의 기본값을 변경해야 합니다. NVDLA 워크로드는 gem5의 전체 시스템 모드에서 시뮬레이션되므로 가속기를 호출하는 CPU 바이너리가 있어야 합니다. 시뮬레이션에 사용되는 아키텍처는 ARM 기반이므로 크로스 컴파일이 필요합니다. 소스 코드가 bsc-util/*.c
에 있는 바이너리는 aarch64-linux-gnu-g++-9
와 크로스 컴파일되어야 합니다. 또한 gem5 관련 작업을 정의하는 어셈블리 파일( util/m5/src/abi/arm64/m5op.S
)도 크로스 컴파일해야 합니다. 따라서 이들을 *.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 컨테이너에서 gem5 빌드 $ 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 ~/
아래 표에 가까운 일부 결과가 필요합니다.
청소_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
를 참조하세요.
우리 프레임워크는 gem5-rtl 및 원래 NVDLA 검증기 검증 흐름보다 훨씬 더 나은 시뮬레이션 성능(18x-22x 시뮬레이션 속도)을 제공하여 C 모델의 성능에 접근합니다. 이상적인 메모리 설정에서 Resnet-50은 2시간 이내에 시뮬레이션이 가능합니다. 우리의 최적화에는 다음이 포함됩니다:
ext/rtl/model_nvdla/verilator_nvdla/axiResponder.hh
)를 사용하여 IO를 줄입니다..v
-> .cpp
컴파일에 -O3
적용합니다.-O3 -Ofast
.cpp
에 적용 -> clang을 사용하여 .a
컴파일;.cpp
에 프로파일링 기반 최적화(PGO) 적용 -> clang을 사용하여 .a
컴파일(추가 40% 개선)gem5.fast
컴파일에 -Ofast
적용합니다. 이 섹션에서는 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
파일은 파이프라인 단계 순서대로 스크립트에 제공되어야 합니다. 사용자는 파이프라인 워크로드에 대한 매개변수 스윕을 수행할 때 match_reg_trace_addr/remap.py
에서 PipelineRemapper
의 하위 클래스를 사용해야 합니다. 사용법은 아래를 참조하세요.
$ 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/configs/
및 ~/gem5-nvdla/src/python/
PYTHONPATH에 추가합니다.MIT