IBM/AccDNN
요약
본 솔루션은 Caffe로 학습된 딥 뉴럴 네트워크를 FPGA RTL 레벨 구현으로 자동 변환하는 방법을 제시합니다. 개발자는 복잡한 FPGA 프로그래밍 지식 없이도, 자신이 학습시킨 모델만 제공하면 데이터 센터나 엣지 장치에서 FPGA 가속 딥러닝 서비스를 배포할 수 있습니다.
핵심 포인트
- Caffe 모델을 FPGA RTL 레벨로 자동 변환하는 솔루션 제시
- FPGA 프로그래밍 경험이 없는 개발자도 사용 가능
- ICCAD'18 Best Paper Award 수상 이력 보유
- 합성곱, 풀링, 완전 연결 레이어 등 특정 구조 지원
본 프로젝트에서는 프로그래밍 노력이 전혀 필요하지 않은 방식으로, Caffe로 학습된 딥 뉴럴 네트워크를 FPGA RTL 레벨 구현으로 자동 변환하는 새로운 솔루션을 제안했으며, 사용자의 인식 작업에 통일된 API도 제공합니다. 따라서 개발자들은 FPGA 프로그래밍 경험이 없더라도, 자신이 학습시킨 Caffe 모델만 제공하면 데이터 센터나 엣지 장치에서 FPGA 가속 딥러닝 서비스를 배포할 수 있습니다. 이 연구는 ICCAD'18에 게재되었으며 프론트엔드 부문에서 **최우수 논문상(Best Paper Award)**을 수상했습니다. 더 자세한 설계 내용은 저희 논문을 참고해 주십시오.
Caffe net 파일이 먼저 파싱되어 네트워크 구조를 얻습니다. 우리는 FPFA 리소스 제약 조건 하에서 병렬성 수준을 결정하기 위해 각 레이어의 작업량을 추정합니다.
이 네트워크에 정의된 각 레이어는 라이브러리에서 해당 신경 레이어를 인스턴스화하여 맞춤형 Verilog 모듈을 생성합니다. 최상위 레벨 모듈 또한 네트워크 파일에 정의된 레이어 순서에 따라 이러한 맞춤형 인스턴스들을 연결함으로써 생성되며, 가중치에 필요한 온칩 메모리도 이 단계에서 생성됩니다.
생성된 소스 파일을 합성(Synthesize)하고 배치 및 레이아웃을 수행하여 실행 가능한 FPGA 비트 파일(bit file)을 생성합니다.
Caffe 프레임워크로 학습된 모델만 지원합니다.
합성곱 레이어(convolutional layer), 최대 풀링 레이어(max pooling layer), 완전 연결 레이어(fully connected layer), 배치 정규화 레이어(batch normalization layer)만 지원합니다.
Caffe의 .prototxt에 정의된 네트워크 내 합성곱 및 완전 연결 레이어의 총 개수는 15개 미만이어야 합니다.
- 양자화된 caffe 모델을 사용할 수 있도록 하려면, 여기의 지침에 따라 BVLC caffe 대신 ristretto Caffe를 설치하고, rc3에서 테스트한 후,
Make pycaffe와pip install -r requirements.txt를 caffe/python에서 실행하십시오. Python Caffe 인터페이스가 컴파일되었고$PYTHONPATH에 있는지 확인하십시오. 또한 ACCDNN_ROOT를 설정해야 합니다.
export PYTHONPATH=path/to/caffe/python
export ACCDNN_ROOT=path/to/AccDNN
- Power-AI-Engine 리포지토리를 클론하고, Power-AI-Engine SDK를 환경에 추가합니다. (IBM POWER FPGA 가속화의 선택 사항)
export FPGA_SDK_PATH=path/to/Power-AI-Engine/FPGA-SDK
- Xilinx Vidado 소프트웨어를 설치하고, 하드웨어 SDK도 환경에 추가합니다. 이 하드웨어 SDK는 Vivado 2017.4에서 테스트되었습니다.
export VIVADO_PATH=path/to/Xilinx/Vivado/201x.x/bin
- AccDNN 리포지토리를 클론합니다.
git clone https://github.com/IBM/AccDNN.git
python ./codegen.py example/cifar10/cifar10_quick.prototxt \
example/cifar10/cifar10_quick_iter_5000.caffemodel \
--optim_file example/cifar10/optim_cifar10.conf \
...
이 매개변수들은 pie 명령어와 매우 유사합니다. --profile 매개변수를 사용하면 네트워크 구조 요약, FPGA 리소스 사용량 및 예상 성능을 포함한 가속기의 프로파일을 얻을 수 있습니다. 이 매개변수를 생략하면, 가속기의 IP 코어가 ./build 디렉토리에 생성되는데, 이는 모델 크기에 따라 몇 분 정도 소요될 수 있습니다.
AccDNN이 생성하는 build 디렉토리에는 다음 내용들이 포함됩니다:
src/
생성된 모든 verilog 소스 파일은 이 디렉토리에 저장되며, 최상위 모듈(top module)은 model.v입니다.
coe/
ROM용 coe 파일과 DDR용 bin 파일을 포함하여 모든 가중치 관련 파일이 이 디렉토리에 저장됩니다.
timing/
모든 타이밍 제약 조건(timing constraints) 관련 파일이 이 디렉토리에 저장됩니다.
ips.tcl
이 TCL 파일은 가속기에서 인스턴스화될 Xilinx IP 코어를 생성하는 데 사용됩니다.
imp_file.f
이 파일은 가속기에서 사용될 verilog 소스 파일 목록이며, 라이브러리(lib) verilog 파일도 포함됩니다.
file_list.txt
이 파일을 Vivado 프로젝트에 추가하여 모든 가속기 필수 파일을 사용자 지정 Vivado 프로젝트로 가져올 수 있습니다.
입력 데이터 시퀀스는 WHC 형식으로, 이는 Caffe의 CHW 형식과 다릅니다. 배치 모드(batch mode)에서는 입력 데이터를 인터리브(interleaved)해야 합니다. 예를 들어, 배치 크기(batch size)가 2라면, 각 픽셀의 입력 데이터는 R1,R2,G1,G2,B1,B2,...와 같아야 합니다. 만약 settings.py에서 INPUT_CHANNEL_PADDING을 1로 설정했다면, 패딩 역시 R1,R2,G1,G2,B1,B2,0,0...과 같이 인터리브되어야 합니다.
출력 데이터 시퀀스는 다소 복잡합니다.
만약 마지막 레이어가 완전 연결 레이어(fully connected layer)라면, 출력 시퀀스는 간단하며 출력 벡터와 동일한 시퀀스입니다.
만약 마지막 레이어가 컨볼루션 레이어(convolutional layer)라면, 결과는 열(column)별로 출력됩니다. 각 열에서는 마지막 컨볼루션 레이어의 KPF에 따라 출력이 인터리브됩니다.
각 열에서 첫 번째 특징(h(1)의 빨간 블록)의 처음 KPF 요소가 출력된 후, 두 번째 특징(h(2)의 빨간 블록)의 처음 KPF 요소가 출력되고, 이 열의 모든 빨간 블록이 출력된 후에야 해당 열의 각 특징에 대한 두 번째 KPF 요소들이 순차적으로 출력됩니다. 그 다음은 파란 블록, 녹색 블록 등이 이어집니다.
배치 크기가 1보다 크다면, 각 블록은 KPF * batch_size 개의 요소를 포함하며, 첫 번째 이미지의 처음 KPF 요소가 먼저 나오고, 두 번째 이미지의 두 번째 KPF 요소가 나옵니다.
활성화(activation)의 비트폭(bitwidth)은 16/8비트일 수 있고, 가중치(weights)의 비트폭은 16/8/4비트일 수 있습니다. 가중치의 비트폭은 활성화의 비트폭보다 클 수 없습니다. 예를 들어, 4비트 활성화에 8비트 가중치는 허용되지 않습니다.
활성화가 16비트인 경우, 가중치의 비트폭은 16/8/4비트일 수 있으며, DSP 블록은 하나의 곱셈기(multiplier)만 사용됩니다.
활성화가 8비트인 경우, 가중치의 비트폭은 8/4비트일 수 있으며, DSP 블록은 두 개의 곱셈기를 사용하여 처리량이 두 배로 증가합니다.
활성화(activation)가 8비트(가중치(weight)는 8/4비트)인 경우, KPF와 이 레이어의 커널(kernel) 번호 모두 짝수여야 합니다. 만약 특정 레이어의 커널 번호가 홀수라면, 추가적인 채널 패딩(모든 가중치가 0인)이 필요합니다. 그렇지 않으면 활성화와 가중치 모두를 16비트로 패딩하게 되어 두 배로 늘어난 처리량(throughput)을 달성할 수 없습니다.
AccDNN의 시뮬레이션 함수 절차를 보여주기 위해 CIFAR10 데이터셋으로 학습된 작은 신경망을 사용할 것입니다. 이 시뮬레이션 환경에서는 Vivado 2013.4만 지원됩니다.
-
settings.py에서 변수 SIMULATION_ONLY를 True로 변경하여 AccDNN을 시뮬레이션 환경으로 설정합니다.
-
AccDNN을 사용하여 대상 심층 신경망(deep neural network)을 Verilog HDL 소스 코드로 변환하며, 여기서는 CIFAR10의 작은 네트워크를 예시로 사용합니다.
python ./codegen.py example/cifar10/cifar10_quick.prototxt \
example/cifar10/cifar10_quick_iter_5000.caffemodel \
--optim_file example/cifar10/optim_cifar10.conf
- 다음 명령어를 사용하여 시뮬레이션 환경을 생성합니다.
./bin/sim_file_gen.sh
- 다음 명령어를 사용하여 시뮬레이션 테스트 데이터를 생성합니다.
python tools/sim_data_gen.py example/cifar10/cifar10_quick.prototxt \
example/cifar10/cifar10_quick_iter_5000.caffemodel \
example/cifar10/test.png
cd sim/tb/및vsim을 사용하여 modelsim을 시작합니다.- Transcript에서 sim_model.tcl (23~25번째 줄)의 Xilinx IP 시뮬레이션 라이브러리 경로를 수정한 다음,
source sim_model.tcl,comp_model명령어를 입력하여 시뮬레이션 프로젝트를 컴파일하고sim을 사용하여 시뮬레이션 프로세스를 시작합니다. - 시뮬레이션 결과를 검증하려면 다음 명령어를 사용합니다.
python tools/compare.py sim_result_file real_file
모든 파일은 sim/data 디렉토리에 저장됩니다. 예를 들어, pool3의 시뮬레이션 출력이 올바른지 확인하고 싶다면 다음 명령어를 사용할 수 있습니다. 이 비교 단계에서는 GUI가 필요하다는 점에 유의하십시오.
python tools/compare.py sim/data/pool3_sim.dat sim/data/pool3.dat
DW, WQ, DQ는 입력 모델 파일에 양자화(quantization) 정보가 없을 때만 사용 가능하며, 모델 파일에서 명시적인 양자화 설정도 사용할 수 있고 ristretto Caffe에서 정의된 형식이 지원됩니다. ristretto Caffe로 훈련하거나 조정된 모델은 AccDNN에 직접 입력할 수 있습니다.
오프칩 메모리(off-chip memory)의 대역폭이 제한적이기 때문에, 데이터 재사용을 높이기 위해 배치 모드(batch mode)를 사용하는 것이 입증되었습니다. settings.py에서 BATCH_SIZE를 설정할 수 있으며, 최대 배치 크기는 32입니다.
높은 FPGA 리소스 활용률을 달성하려면 각 레이어에 적절한 CPF와 KPF를 .conf 파일에 설정하는 것이 훨씬 좋습니다. CPF는 동시에 계산될 3D 컨볼루션(convolution)의 채널 수(number of channels)를 의미합니다. KPF는 동시에 계산될 3D 컨볼루션의 커널 수(number of kernels)를 의미합니다. example/cifar10/optim_cifar10.conf에 예시가 있습니다.
각 레이어의 CPF와 KPF를 조정하여 각 레이어가 비슷한 지연 시간(delays)을 갖도록 하면 전체 파이프라인(pipeline)이 더 효율적이 될 수 있습니다. 다음 명령어를 사용하여 네트워크 프로파일링(profile)을 수행할 수 있습니다 (예시로 cifar10 모델 사용). 최종 FPGA 리소스 활용률도 제공되는데, 이는 1.0에 가깝게 유지하는 것이 좋습니다.
python ./codegen.py example/cifar10/cifar10_quick.prototxt \
example/cifar10/cifar10_quick_iter_5000.caffemodel \
--optim_file example/cifar10/optim_cifar10.conf \
...
프로파일링을 통해 생성된 보고서에는 필요한 DDR 대역폭도 제공됩니다. CPF/KPF가 높을수록 더 높은 DDR 대역폭이 필요하며, 훨씬 낮은 지연 시간을 달성할 수 있습니다. 요구되는 DDR 대역폭이 물리적 DDR 대역폭보다 훨씬 큰 경우 좋은 설계가 아닙니다. 이 설계에서 필요한 총 DSP와 온칩 메모리(BLOCK RAM)도 제공됩니다. CPF/KPF를 결정한 후, FPGA의 DSP 및 BLOCK RAM 리소스를 완전히 활용할 수 있도록 적절한 배치 크기를 설정할 수 있습니다.
각 레이어(가중치를 가진 경우)는 DMA 채널을 필요로 합니다. 더 나은 타이밍을 얻으려면 .conf 파일에서 DMA 지연 시간을 설정하는 것이 훨씬 좋습니다. 특히 대규모 FPGA의 경우 더욱 그렇습니다. 이 값은 0~2 사이여야 합니다 [기본값=0]. 처음에는 0으로 설정할 수 있으며, 라우팅 후 이 DMA 채널에 심각한 타이밍 문제가 있다고 판단되면, DMA 모듈에서 더 나은 타이밍을 얻도록 이 값을 수동으로 설정할 수 있습니다.
AccDNN은 또한 주어진 FPGA 리소스를 사용하여 낮은 지연 시간과 최대 처리량을 달성하는 자동 최적화 기능을 제공합니다. optimal_file을 제공하지 않으면 자동 최적화가 수행됩니다.
cifar10 데모 외에도, 'example/'에서 ZF, VGG16, YOLO 모델도 제공합니다.
Jun Song Wang, IBM Research China, [email protected]
Xiaofan Zhang, University of Illinois at Urbana-Champaign, [email protected]
AccDNN/DNNBuilder가 연구에 유용하다고 생각되시면, 저희 논문을 인용해 주시기를 부탁드립니다:
@inproceedings{DNNBuilder,
title={DNNBuilder: an Automated Tool for Building High-Performance DNN Hardware Accelerators for FPGAs},
author={Xiaofan Zhang, Junsong Wang, Chao Zhu, Yonghua Lin, Jinjun Xiong, Wen-mei Hwu, Deming Chen},
...
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub ML Hardware의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기