프로젝트/GCN Accelerator

[프로젝트 진행 상황 v10.19] HyGCN과 Ramulator

아이스얼그레이 2022. 10. 19. 10:25

현재 팀장으로서 GCN 가속기 설계 프로젝트를 진행하고 있습니다. 11월 21일까지 ACM/IEEE DAC(Design Automation Conference)에 투고할 논문을 작성하는 것이 목표입니다.

어쩌다 보니 시간이 한 달 남았는데, 잘할 수 있겠죠..? 교수님 말로는 DAC 정도 수준의 학회에 논문을 낸다면 인더스트리에서든 아카데미아에서든 절대 무시당하지 않을 거라고 합니다.

아직 감은 오지 않지만 이 정도로 동기부여를 받고 열심히 해보려고 합니다.

제가 쳐내야 할 일들과 저희 조가 쳐내야 할 일들을 정리해보면 다음과 같습니다.

 

1. 내가 쳐내야 할 일

1.1 Ramulator Setting
1.2 HyGCN의 Combination engine RTL design, synthesis, STA
1.3 Systolic array에 적합한 testbench 작성

 

2. 우리 조가 쳐내야 할 일

2.1 HyGCN 설계 - 논문에서 대조군 설정을 위해
2.2 GCN algorithm 분석
2.3 논문에 필요한 motivation, target 설정
2.4 맛비 AI 가속기 설계 강의 보기

이제 하나 씩 detail을 써보겠습니다.

 

1.1 Ramulator Setting

Ramulator는 SAFARI lab(Onur Mutlu 교수님 연구실)에서 개발한 DRAM Simulator입니다. 지난번 게시글에서 GEM5에 대한 tutorial을 올렸었는데, 잠깐 사이에 Ramulator로 target이 변경되었습니다.

이 두 simulator의 차이가 너무 헷갈려서 제가 진학할 예정인 카이스트 연구실 박사과정 분께 여쭤봤습니다. 메일 답장을 인용하자면 다음과 같습니다.

GEM5는 기본적으로 CPU 시뮬레이션을 위해서, Ramulator는 DRAM 동작의 시뮬레이션을 위해서 만들어진 시뮬레이터이기 때문에, ASIC 설계에 대한 연구를 하는 케이스에서는 GEM5는 딱히 사용할 이유가 없습니다.

하지만 ASIC을 설계하더라도 특히 이런 memory access latency가 주요하게 영향을 미치는 상황에서는 off-chip memory로의 data access는 정확하게 측정할 필요가 있기 때문에 in-house simulator(ASIC 파트)와 ramulator(off-chip memory[DRAM] 파트)를 병용하여 사용합니다.

저희는 GCN이라는 speciic application을 target으로 하는 ASIC을 설계하기 때문에 GEM5를 사용할 이유가 없다는 것입니다. 그 대신 GCN 연산중 발생하는 off-chip memory access나 power consumption을 측정해야 하기 때문에 cycle-accuracy 한 DRAM simulator가 필요합니다.

어쨌든, Ramulator를 setting하고 있습니다만.. 생각보다 진척이 더딥니다. 이게 SAFARI lab github에 Open source로 올라와있긴 합니다만, 아무래도 논문으로 나온 simulator다 보니 MS에서 나오는 tool처럼 친절한 설명이 없습니다. 다행히 Ramulator와 관련된 강의 영상과 논문이 있어서 참고해가면서 금요일 전까지 setting해보려고 합니다.

막막해도 어쨌는 해내야죠.. taigon과 7개월 정도 같이 프로젝트를 하다 보니까 웬만한 고난에는 쉽게 무너지지 않게 되었습니다👍

 

1.2 HyGCN의 Combination engine RTL design, synthesis, STA

영어가 참 많네요ㅋㅋㅋ 하나씩 짚어보겠습니다.
HyGCN은 2020년에 나온 GCN 가속기 이름입니다. 해당 가속기보다 10% 더 빠르거나, 전력을 덜 먹는 가속기를 설계해야 DAC에 accept 될 가능성이 있습니다.

GCN의 inference 과정은 Aggregation과 Combination으로 나뉩니다. 이때 저와 J팀원이 Combination을 맡기로 했습니다. HyGCN 논문에서는 이 두 과정을 Aggreagtion engeine, Combination engine이라는 architecture로 처리합니다.(개인적으로 engine이라는 naming이 참 멋진 것 같습니다.) 여기서 저는 Combination engine 설계를 맡았습니다.

RTL은 Register Transfer Level의 약자로 Verilog HDL 코딩을 의미합니다.
Synthesis, STA는 각각 논리 합성, 정적 timing 분석 인데 Chip design flow의 여러 단계 중 하나라고 생각하시면 됩니다.

그래서 요약하자면, 논문으로 나와있는 HyGCN을 저희 연구의 비교군으로써 사용하기 위해 설계하고 있으며 저와 J팀원은 Combination engine을 설계하고 있습니다.

 

1.3 Systolic array에 적합한 testbench 작성

지난번에 Systolic array에 대한 게시물을 작성했습니다. Systolic array는 data reuse을 parallelism을 활용해 exploit한 architecture입니다.(논문에 exploit이라는 표현이 자주 나오는데, 구현하다 내지 실현하다 라는 뜻으로 이해하시면 편합니다.)

GCN inference 과정 중 Combination phase에서 Matrix-Vector Multiplication(이하 MVM), Matrix Multiplication(이하 MM) 연산이 많이 발생합니다. 이는 Combination이 전형적인 MLP(Multi Layer Perceptron)에 필요한 연산을 수행하기 때문입니다. 이때 MM, MVM 연산을 빠르고 memory access가 적게 발생하도록 처리하기 위해 systolic array를 주로 사용합니다. systolic array에 대한 자세한 내용은 https://k-j-w.tistory.com/86
을 참고하시면 됩니다.

 

[Degital Design] 2D Systolic Array for matrix multiplication

Matrix Multiplication(이하 MM)을 가속하기 위한 Systolic array architecture에 대해서 알아보겠습니다. http://ashanpeiris.blogspot.com/2015/08/digital-design-of-systolic-array.html Digital design of systolic array architecture for matrix m

k-j-w.tistory.com


그리고 어떤 data를 reuse하느냐에 따라서 PE array의 연결 방식이 달라집니다. 크게 Weight statoinary, Input statoinary, Output statoinary, Row statoinary로 나뉘는데, PE 사이에 data stream이 발생할 때 어떤 data가 PE의 register에 머무르는지에 따라 구분됩니다.(statoinary a. 움직이지 않는, 고정된)

저희가 설계한 Systolic array는 output이 PE에  고정된 Output stationary입니다. input buffer, weight buffer로부터 fetching한 input, weight를 MM 연산하면서 각 PE에 output 값을 누적시키고, 연산이 끝나고 Output buffer로 결과 matrix를 보내주는 방식입니다.

글을 쓰다보니 말이 길어졌는데, 현재 쳐내야 할 일은 testbench를 짜는 것입니다. 위 게시글을 보시면 알겠지만, Systolic array에 data를 보내줄 때 pipeline처럼 한 칸씩 띄어서 보내줘야 합니다. 이는 testbench 입장에서 보면 아주 짜증 나는 부분인데, 아래 사진처럼 matrix의 element를 cycle마다 띄어서 줘야 하기 때문입니다. 특히 결과가 square matrix가 아니라면 코드를 싹 다 수정해야 합니다....

아무리 생각해도 Systolic이 sacling up될 수록 이런 방식은 적합하지 않은 것 같습니다. 그래서 이를 해결하기 위해 top level에서 row, column의 data를 하나 씩 뿌리는 scheduler를 설계하거나, buffer에서 이런 동작을 하도록 해야 할 것 같습니다.

HyGCN Combination engine이 vSched라는 module이 있는데, 이런 동작을 하는 것이 아닐까 하는 추측을 해봅니다.


일의 우선 순위를 매겨보자면 다음과 같습니다.
1. HyGCN의 Combination engine RTL design, synthesis, STA
2. Systolic array에 적합한 testbench 작성
3. Ramulator Setting

사실 우선순위를 알고 있더라도, 그에 맞게 일을 수행하는 것은 쉽지 않은 것 같습니다. 다 중요한 일이기도 하고, 아직 일의 volume을 분배하는 능력이 부족한 것 같습니다. 그리고 시간을 넣는 만큼의 output이 나올 실력이 아직은 없는 것 같습니다. 뭐 어쨌든 더 열심히 해야죠~